クラス FormHttpMessageConverter

java.lang.ObjectSE
org.springframework.http.converter.FormHttpMessageConverter
実装されたすべてのインターフェース:
HttpMessageConverter<MultiValueMap<StringSE,?>>
既知の直属サブクラス
AllEncompassingFormHttpMessageConverter

public class FormHttpMessageConverter extends ObjectSE implements HttpMessageConverter<MultiValueMap<StringSE,?>>
HttpMessageConverter の実装により、「通常の」HTML フォームの読み取りと書き込み、およびマルチパートデータの書き込み(読み取りは不可)(ファイルのアップロードなど)を行うことができます。

つまり、このコンバーターは "application/x-www-form-urlencoded" メディア型を MultiValueMap<String, String> として読み書きでき、"multipart/form-data" および "multipart/mixed" メディア型を MultiValueMap<String, Object> として書き込むこともできます(ただし、読み取ることはできません)。

マルチパートデータ

デフォルトでは、マルチパートデータを書き込むときにコンテンツ型として "multipart/form-data" が使用されます。Spring Framework 5.2 以降では、マルチパートサブ型がサポートされているメディア型として登録されておりマルチパートデータを書き込むときに目的のマルチパートサブ型がコンテンツ型として指定されている限り、"multipart/mixed" や "multipart/related" などの他のマルチパートサブ型を使用してマルチパートデータを書き込むこともできます。デフォルトでは、サポートされるメディア型として "multipart/mixed" が登録されていることに注意してください。

マルチパートデータを書き込む場合、このコンバーターは他の HttpMessageConverters を使用してそれぞれの MIME パートを書き込みます。デフォルトでは、基本配列はバイト配列 String および Resource に登録されています。これらは、setPartConverters(java.util.List<org.springframework.http.converter.HttpMessageConverter<?>>) でオーバーライドするか、addPartConverter(org.springframework.http.converter.HttpMessageConverter<?>) で拡張できます。

サンプル

次のスニペットは、"multipart/form-data" コンテンツ型を使用して HTML フォームを送信する方法を示しています。

 RestTemplate restTemplate = new RestTemplate();
 // AllEncompassingFormHttpMessageConverter is configured by default

 MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
 form.add("field 1", "value 1");
 form.add("field 2", "value 2");
 form.add("field 2", "value 3");
 form.add("field 3", 4);  // non-String form values supported as of 5.1.4

 restTemplate.postForLocation("https://example.com/myForm", form);

次のスニペットは、"multipart/form-data" コンテンツ型を使用してファイルをアップロードする方法を示しています。

 MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
 parts.add("field 1", "value 1");
 parts.add("file", new ClassPathResource("myFile.jpg"));

 restTemplate.postForLocation("https://example.com/myFileUpload", parts);

次のスニペットは、"multipart/mixed" コンテンツ型を使用してファイルをアップロードする方法を示しています。

 MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
 parts.add("field 1", "value 1");
 parts.add("file", new ClassPathResource("myFile.jpg"));

 HttpHeaders requestHeaders = new HttpHeaders();
 requestHeaders.setContentType(MediaType.MULTIPART_MIXED);

 restTemplate.postForLocation("https://example.com/myFileUpload",
     new HttpEntity<>(parts, requestHeaders));

次のスニペットは、"multipart/related" コンテンツ型を使用してファイルをアップロードする方法を示しています。

 MediaType multipartRelated = new MediaType("multipart", "related");

 restTemplate.getMessageConverters().stream()
     .filter(FormHttpMessageConverter.class::isInstance)
     .map(FormHttpMessageConverter.class::cast)
     .findFirst()
     .orElseThrow(() -> new IllegalStateException("Failed to find FormHttpMessageConverter"))
     .addSupportedMediaTypes(multipartRelated);

 MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
 parts.add("field 1", "value 1");
 parts.add("file", new ClassPathResource("myFile.jpg"));

 HttpHeaders requestHeaders = new HttpHeaders();
 requestHeaders.setContentType(multipartRelated);

 restTemplate.postForLocation("https://example.com/myFileUpload",
     new HttpEntity<>(parts, requestHeaders));

その他

このクラスの一部のメソッドは org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity に触発されました。

導入:
3.0
作成者:
Arjen Poutsma, Rossen Stoyanchev, Juergen Hoeller, Sam Brannen
関連事項:
  • フィールドの詳細

    • DEFAULT_CHARSET

      public static final CharsetSE DEFAULT_CHARSET
      コンバーターが使用するデフォルトの文字セット。
  • コンストラクターの詳細

    • FormHttpMessageConverter

      public FormHttpMessageConverter()
  • メソッドの詳細

    • setSupportedMediaTypes

      public void setSupportedMediaTypes(ListSE<MediaType> supportedMediaTypes)
      このコンバーターによってサポートされる MediaType オブジェクトのリストを設定します。
      関連事項:
    • addSupportedMediaTypes

      public void addSupportedMediaTypes(MediaType... supportedMediaTypes)
      このコンバーターでサポートされる MediaType オブジェクトを追加します。

      提供された MediaType オブジェクトは、サポートされている MediaType オブジェクトのリストに追加されます。

      パラメーター:
      supportedMediaTypes - 追加する MediaType オブジェクトの var-args リスト
      導入:
      5.2
      関連事項:
    • getSupportedMediaTypes

      public ListSE<MediaType> getSupportedMediaTypes()
      このコンバーターでサポートされているメディア型のリストを返します。このリストは、考えられるすべてのターゲット要素型に適用されるとは限らないため、このメソッドの呼び出しは通常、canWrite(clazz, null を介して保護する必要があります。このリストでは、特定のクラスでのみサポートされている MIME 型を除外することもできます。または、HttpMessageConverter.getSupportedMediaTypes(Class) を使用してより正確なリストを作成します。
      次で指定:
      インターフェース HttpMessageConverter<MultiValueMap<StringSE,?>>getSupportedMediaTypes 
      戻り値:
      サポートされているメディア型のリスト
      関連事項:
    • setPartConverters

      public void setPartConverters(ListSE<HttpMessageConverter<?>> partConverters)
      使用するメッセージ本文コンバーターを設定します。これらのコンバーターは、オブジェクトを MIME パーツに変換するために使用されます。
    • getPartConverters

      public ListSE<HttpMessageConverter<?>> getPartConverters()
      導入:
      5.3
    • addPartConverter

      public void addPartConverter(HttpMessageConverter<?> partConverter)
      メッセージ本文コンバーターを追加します。このようなコンバーターは、オブジェクトを MIME パーツに変換するために使用されます。
    • setCharset

      public void setCharset(@Nullable CharsetSE charset)
      リクエストまたはレスポンス Content-Type ヘッダーで明示的に指定されていない場合に、フォームデータの読み取りおよび書き込みに使用するデフォルトの文字セットを設定します。

      4.3 の時点で、これはマルチパートリクエストのテキスト本文の変換のデフォルトの文字セットとしても使用されます。

      5.0 の時点で、これは、(相互に排他的な)multipartCharset も設定されていない限り、Content-Disposition (およびそのファイル名パラメーター)を含むパーツヘッダーにも使用されます。この場合、パーツヘッダーは ASCII としてエンコードされ、 ファイル名は RFC 2047 の encoded-word 構文でエンコードされます。

      デフォルトでは、これは "UTF-8" に設定されています。

    • setMultipartCharset

      public void setMultipartCharset(CharsetSE charset)
      ファイル名をエンコードするためにマルチパートデータを書き込むときに使用する文字セットを設定します。エンコードは、RFC 2047 で定義されている encoded-word 構文に基づいており、jakarta.mail からの MimeUtility に依存しています。

      5.0 のデフォルトでは、Content-Disposition (およびそのファイル名パラメーター)を含むパーツヘッダーは、デフォルトで setCharset(Charset) または UTF-8 の設定に基づいてエンコードされます。

      導入:
      4.1.1
      関連事項:
    • canRead

      public boolean canRead(ClassSE<?> clazz, @Nullable MediaType mediaType)
      インターフェースからコピーされた説明: HttpMessageConverter
      指定されたクラスがこのコンバーターで読み取れるかどうかを示します。
      次で指定:
      インターフェース HttpMessageConverter<MultiValueMap<StringSE,?>>canRead 
      パラメーター:
      clazz - 読み込み可能性をテストするクラス
      mediaType - 読み取るメディア型(指定しない場合は null にできます); 通常、Content-Type ヘッダーの値。
      戻り値:
      読み取り可能な場合は true。それ以外の場合は false 
    • canWrite

      public boolean canWrite(ClassSE<?> clazz, @Nullable MediaType mediaType)
      インターフェースからコピーされた説明: HttpMessageConverter
      指定されたクラスをこのコンバーターで書き込めるかどうかを示します。
      次で指定:
      インターフェース HttpMessageConverter<MultiValueMap<StringSE,?>>canWrite 
      パラメーター:
      clazz - 書き込み可能性をテストするクラス
      mediaType - 書き込むメディア型(指定しない場合は null にすることができます); 通常、Accept ヘッダーの値。
      戻り値:
      書き込み可能な場合は true。それ以外の場合は false 
    • read

      インターフェースからコピーされた説明: HttpMessageConverter
      指定された入力メッセージから指定された型のオブジェクトを読み取り、それを返します。
      次で指定:
      インターフェース HttpMessageConverter<MultiValueMap<StringSE,?>>read 
      パラメーター:
      clazz - 返すオブジェクトの型。この型は、このインターフェースの canRead メソッドに事前に渡されている必要があります。このメソッドは true を返している必要があります。
      inputMessage - 読み込む HTTP 入力メッセージ
      戻り値:
      変換されたオブジェクト
      例外:
      IOExceptionSE - I/O エラーの場合
      HttpMessageNotReadableException - 変換エラーの場合
    • write

      public void write(MultiValueMap<StringSE,?> map, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOExceptionSE, HttpMessageNotWritableException
      インターフェースからコピーされた説明: HttpMessageConverter
      指定されたオブジェクトを指定された出力メッセージに書き込みます。
      次で指定:
      インターフェース HttpMessageConverter<MultiValueMap<StringSE,?>>write 
      パラメーター:
      map - 出力メッセージに書き込むオブジェクト。このオブジェクトの型は、このインターフェースの canWrite メソッドに事前に渡されている必要があります。このメソッドは true を返している必要があります。
      contentType - 書き込み時に使用するコンテンツ型。コンバーターのデフォルトのコンテンツ型を使用する必要があることを示す null の場合があります。null でない場合、このメディア型は、このインターフェースの canWrite メソッドに事前に渡されている必要があり、true が返されている必要があります。
      outputMessage - 書き込むメッセージ
      例外:
      IOExceptionSE - I/O エラーの場合
      HttpMessageNotWritableException - 変換エラーの場合
    • getFormContentType

      protected MediaType getFormContentType(@Nullable MediaType contentType)
      優先コンテンツ型を指定して、フォームの記述に使用されるコンテンツ型を返します。デフォルトでは、このメソッドは指定されたコンテンツ型を返しますが、文字セットがない場合は文字セットを追加します。contentType が null の場合、application/x-www-form-urlencoded; charset=UTF-8 が返されます。

      サブクラスはこのメソッドをオーバーライドして、この動作を変更できます。

      パラメーター:
      contentType - 優先コンテンツ型 (null にすることができます)
      戻り値:
      使用するコンテンツ型
      導入:
      5.2.2
    • serializeForm

      protected StringSE serializeForm(MultiValueMap<StringSE,ObjectSE> formData, CharsetSE charset)
    • generateMultipartBoundary

      protected byte[] generateMultipartBoundary()
      マルチパート境界を生成します。

      この実装は MimeTypeUtils.generateMultipartBoundary() に委譲します。

    • getHttpEntity

      protected HttpEntity<?> getHttpEntity(ObjectSE part)
      指定されたパーツオブジェクトの HttpEntity を返します。
      パラメーター:
      part - HttpEntity を返す部分
      戻り値:
      パーツオブジェクト自体は HttpEntity、またはそのパーツ用に新しく構築された HttpEntity ラッパー
    • getFilename

      @Nullable protected StringSE getFilename(ObjectSE part)
      指定されたマルチパートパーツのファイル名を返します。この値は Content-Disposition ヘッダーに使用されます。

      デフォルトの実装は、パーツが Resource の場合は Resource.getFilename() を返し、それ以外の場合は null を返します。サブクラスでオーバーライドできます。

      パラメーター:
      part - ファイル名を決定する部分
      戻り値:
      ファイル名、または不明の場合は null