org.springframework.http.converter
Class FormHttpMessageConverter

java.lang.Object
  extended by org.springframework.http.converter.FormHttpMessageConverter
All Implemented Interfaces:
HttpMessageConverter<MultiValueMap<java.lang.String,?>>

public class FormHttpMessageConverter
extends java.lang.Object
implements HttpMessageConverter<MultiValueMap<java.lang.String,?>>

Implementation of HttpMessageConverter that can handle form data, including multipart form data (i.e. file uploads).

This converter can write the application/x-www-form-urlencoded and multipart/form-data media types, and read the application/x-www-form-urlencoded) media type (but not multipart/form-data).

In other words, this converter can read and write 'normal' HTML forms (as MultiValueMap<String, String>), and it can write multipart form (as MultiValueMap<String, Object>. When writing multipart, this converter uses other HttpMessageConverters to write the respective MIME parts. By default, basic converters are registered (supporting Strings and Resources, for instance); these can be overridden by setting the partConverters property.

For example, the following snippet shows how to submit an HTML form:

 RestTemplate template = new RestTemplate(); // FormHttpMessageConverter is configured by default
 MultiValueMap<String, String> form = new LinkedMultiValueMap<String, String>();
 form.add("field 1", "value 1");
 form.add("field 2", "value 2");
 form.add("field 2", "value 3");
 template.postForLocation("http://example.com/myForm", form);
 

The following snippet shows how to do a file upload:

 MultiValueMap<String, Object> parts = new LinkedMultiValueMap<String, Object>();
 parts.add("field 1", "value 1");
 parts.add("file", new ClassPathResource("myFile.jpg"));
 template.postForLocation("http://example.com/myFileUpload", parts);
 

Some methods in this class were inspired by org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity.

Since:
3.0
See Also:
MultiValueMap

Constructor Summary
FormHttpMessageConverter()
           
 
Method Summary
 void addPartConverter(HttpMessageConverter<?> partConverter)
          Add a message body converter.
 boolean canRead(java.lang.Class<?> clazz, MediaType mediaType)
           
 boolean canWrite(java.lang.Class<?> clazz, MediaType mediaType)
           
protected  byte[] generateMultipartBoundary()
          Generate a multipart boundary.
protected  java.lang.String getFilename(java.lang.Object part)
          Return the filename of the given multipart part.
 java.util.List<MediaType> getSupportedMediaTypes()
           
 MultiValueMap<java.lang.String,java.lang.String> read(java.lang.Class<? extends MultiValueMap<java.lang.String,?>> clazz, HttpInputMessage inputMessage)
           
 void setCharset(java.nio.charset.Charset charset)
          Sets the character set used for writing form data.
 void setPartConverters(java.util.List<HttpMessageConverter<?>> partConverters)
          Set the message body converters to use.
 void write(MultiValueMap<java.lang.String,?> map, MediaType contentType, HttpOutputMessage outputMessage)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

FormHttpMessageConverter

public FormHttpMessageConverter()
Method Detail

addPartConverter

public final void addPartConverter(HttpMessageConverter<?> partConverter)
Add a message body converter. Such a converters is used to convert objects to MIME parts.


setPartConverters

public final void setPartConverters(java.util.List<HttpMessageConverter<?>> partConverters)
Set the message body converters to use. These converters are used to convert objects to MIME parts.


setCharset

public void setCharset(java.nio.charset.Charset charset)
Sets the character set used for writing form data.


canRead

public boolean canRead(java.lang.Class<?> clazz,
                       MediaType mediaType)
Specified by:
canRead in interface HttpMessageConverter<MultiValueMap<java.lang.String,?>>

canWrite

public boolean canWrite(java.lang.Class<?> clazz,
                        MediaType mediaType)
Specified by:
canWrite in interface HttpMessageConverter<MultiValueMap<java.lang.String,?>>

getSupportedMediaTypes

public java.util.List<MediaType> getSupportedMediaTypes()
Specified by:
getSupportedMediaTypes in interface HttpMessageConverter<MultiValueMap<java.lang.String,?>>

read

public MultiValueMap<java.lang.String,java.lang.String> read(java.lang.Class<? extends MultiValueMap<java.lang.String,?>> clazz,
                                                             HttpInputMessage inputMessage)
                                                      throws java.io.IOException,
                                                             HttpMessageNotReadableException
Specified by:
read in interface HttpMessageConverter<MultiValueMap<java.lang.String,?>>
Throws:
java.io.IOException
HttpMessageNotReadableException

write

public void write(MultiValueMap<java.lang.String,?> map,
                  MediaType contentType,
                  HttpOutputMessage outputMessage)
           throws java.io.IOException,
                  HttpMessageNotWritableException
Specified by:
write in interface HttpMessageConverter<MultiValueMap<java.lang.String,?>>
Throws:
java.io.IOException
HttpMessageNotWritableException

generateMultipartBoundary

protected byte[] generateMultipartBoundary()
Generate a multipart boundary.

Default implementation returns a random boundary. Can be overridden in subclasses.


getFilename

protected java.lang.String getFilename(java.lang.Object part)
Return the filename of the given multipart part. This value will be used for the Content-Disposition header.

Default implementation returns Resource.getFilename() if the part is a Resource, and null in other cases. Can be overridden in subclasses.

Parameters:
part - the part to determine the file name for
Returns:
the filename, or null if not known