packageorg.springframework.http.converter;importjava.io.IOException;importjava.io.UnsupportedEncodingException;importjava.nio.charset.Charset;importjava.util.ArrayList;importjava.util.List;importorg.springframework.http.HttpInputMessage;importorg.springframework.http.HttpOutputMessage;importorg.springframework.http.MediaType;importorg.springframework.util.StreamUtils;*}),
* and writes with a {@codeContent-Type} of {@codetext/plain}. This can be overridden
* by setting the {@link#setSupportedMediaTypes supportedMediaTypes} property.
*
*@authorArjen Poutsma
*@since3.0*/
public class StringHttpMessageConverter extends AbstractHttpMessageConverter{public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");private finalCharset defaultCharset;private final ListavailableCharsets;private boolean writeAcceptCharset = true;
publicStringHttpMessageConverter() {this(DEFAULT_CHARSET);
}
publicStringHttpMessageConverter(Charset defaultCharset) {super(new MediaType("text", "plain", defaultCharset), MediaType.ALL);this.defaultCharset =defaultCharset;this.availableCharsets = new ArrayList(Charset.availableCharsets().values());
}
public void setWriteAcceptCharset(booleanwriteAcceptCharset) {this.writeAcceptCharset =writeAcceptCharset;
}
@Overridepublic boolean supports(Class>clazz) {return String.class ==clazz;
}
@Overrideprotected String readInternal(Class extends String> clazz, HttpInputMessage inputMessage) throwsIOException {
Charset charset=getContentTypeCharset(inputMessage.getHeaders().getContentType());returnStreamUtils.copyToString(inputMessage.getBody(), charset);
}
@OverrideprotectedLong getContentLength(String str, MediaType contentType) {
Charset charset=getContentTypeCharset(contentType);try{return (long) str.getBytes(charset.name()).length;
}catch(UnsupportedEncodingException ex) {//should not occur
throw newIllegalStateException(ex);
}
}
@Overrideprotected void writeInternal(String str, HttpOutputMessage outputMessage) throwsIOException {if (this.writeAcceptCharset) {
outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets());
}
Charset charset=getContentTypeCharset(outputMessage.getHeaders().getContentType());
StreamUtils.copy(str, charset, outputMessage.getBody());
}
protected ListgetAcceptedCharsets() {return this.availableCharsets;
}privateCharset getContentTypeCharset(MediaType contentType) {if (contentType != null && contentType.getCharSet() != null) {returncontentType.getCharSet();
}else{return this.defaultCharset;
}
}
}