在spring mvc中,大家对@responsebody,@requestbody用的比较多了,它们是可以自定义的
HttpMessageConverter接口提供了5个方法:
canRead:判断该转换器是否能将请求内容转换成Java对象
canWrite:判断该转换器是否可以将Java对象转换成返回内容
getSupportedMediaTypes:获得该转换器支持的MediaType类型
read:读取请求内容并转换成Java对象
write:将Java对象转换后写入返回内容
其中read和write方法的参数分别有有HttpInputMessage和HttpOutputMessage对象,这两个对象分别代表着一次Http通讯中的请求和响应部分,可以通过getBody方法获得对应的输入流和输出流。
其中read和write方法的参数分别有有HttpInputMessage和HttpOutputMessage对象,这两个对象分别代表着一次Http通讯中的请求和响应部分,可以通过getBody方法获得对应的输入流和输出流。
使用的时候,可以extends AbstractHttpMessageConverter就可以了,比如下面的例子:
演示使用js向spring mvc发送自定义格式的字符串(属性用-隔开),通过自定义的HttpMessageConverter自动转换成对象,然后通过HttpMessageConverter输出指定格式到浏览器
public class Person {
private String firstName;
private String lastName;
。。。。
public class WiselyMessageConverter extends AbstractHttpMessageConverter<Person> {
//自定义媒体类型
public WiselyMessageConverter(){
super(new MediaType("application", "x-wisely", Charset.forName("UTF-8")));
}
//从request里获得构造Person实例的数据
@Override
protected Person readInternal(Class<? extends Person> clazz,
HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
String temp = StreamUtils.copyToString(inputMessage.getBody(),
Charset.forName("UTF-8"));
String[] tempArr = temp.split("-");
return new Person(tempArr[0],tempArr[1]);
}
//只支持Person类
@Override
protected boolean supports(Class<?> clazz) {
return Person.class.isAssignableFrom(clazz);
}
//将person实例转换成你想要的字符串格式
@Override
protected void writeInternal(Person person, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
String out = "hello:" +person.getFirstName() + "-" + person.getLastName();
outputMessage.getBody().write(out.getBytes());
}
}
配置WiselyMessageConverter
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
WiselyMessageConverter converter = new WiselyMessageConverter();
converters.add(converter);
}
@RequestMapping(value = "/convert", produces = { "application/x-wisely" })
public @ResponseBody Person convert(@RequestBody Person person) {
return person;
}
jsp页面
function req(){
$.ajax({
url: "convert",
data: "wang-yunfei",//注意此处的格式
type:"POST",
contentType:"application/x-wisely",
success: function(data){
$("#resp").html(data);
}
});
}
另外不错的参考文参考:
http://www.scienjus.com/custom-http-message-converter/