自定义HttpMessageConverter
HttpMessageConverter是用来处理request和response里的数据的。Spring内置了很多HttpMessageConverter,比如MappingJackson2HttpMessageConverter,StringHttpMessageConverter等。
本章实现自定义的HttpMessageConverter,很简单。
1.自定义HttpMessageConverter
package com.just.springmvc4.messageconverter; import com.just.springmvc4.domain.DemoObj; import java.io.IOException; import java.nio.charset.Charset; import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; import org.springframework.http.converter.AbstractHttpMessageConverter; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotWritableException; import org.springframework.util.StreamUtils; public class MyMessageConverter extends AbstractHttpMessageConverter<DemoObj> { /** * 定义字符编码,防止乱码 */ private static final Charset DEFAULT_CHARSET=Charset.forName("UTF-8"); /** * 新建自定义的媒体类型 */ public MyMessageConverter(){ super(new MediaType("application","x-wisely",DEFAULT_CHARSET)); } /** * 表明只处理DemoObj这个类 */ @Override protected boolean supports(Class<?> aClass) { return DemoObj.class.isAssignableFrom(aClass); } /** * 重写readInternal方法,处理请求的数据 */ @Override protected DemoObj readInternal(Class<? extends DemoObj> aClass, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException { String temp=StreamUtils.copyToString(httpInputMessage.getBody(),DEFAULT_CHARSET); String[] tempArr=temp.split("-"); return new DemoObj(new Long(tempArr[0]),tempArr[1]); } /** * 重写writeInternal,处理如何输出数据到response */ @Override protected void writeInternal(DemoObj demoObj, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException { String out="hello: "+demoObj.getId()+"-"+demoObj.getName(); StreamUtils.copy(out, DEFAULT_CHARSET, httpOutputMessage.getBody()); } }
在本实例中我进行了编码的处理,为了防止中文乱码,输入输出的编码格式统一为UTF-8
2.配置文件中添加自定义的HttpMessageConverter
/** * 添加自定义的httpMessageConverter */ @Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(messageConverter()); } @Bean public MyMessageConverter messageConverter(){ return new MyMessageConverter(); }
3.控制器
package com.just.springmvc4.controller; import com.just.springmvc4.domain.DemoObj; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class ConverterController { @RequestMapping(value = "/converter",produces = "application/x-wisely") public DemoObj converter(@RequestBody DemoObj demoObj){ return demoObj; } }
produces指定返回自定义的媒体类型
4.自定义的jsp页面以及ViewController里的配置
converter.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>converter测试</title> </head> <body> <div id="resp"></div> <input type="button" value="请求" onclick="req()"> <script src="../assets/js/jquery-3.3.1.min.js" type="text/javascript"></script> <script> function req() { $.ajax( { url:"converter", data:"1000-goodluck", type:"POST", contentType:"application/x-wisely", success:function (data) { $("#resp").html(data); } } ) } </script> </body> </html>
ViewController配置:
@Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/index").setViewName("index"); registry.addViewController("/toUpload").setViewName("upload"); registry.addViewController("/toConverter").setViewName("converter"); }
5.结果演示:
//TODO:本实例只是自定义的HttpMessageConverter,在实际场景中可能有全局的处理,比如要全局请求与返回都要是Json格式,这个等有空了尝试下。