Chinaunix首页 | 论坛 | 博客
  • 博客访问: 830103
  • 博文数量: 247
  • 博客积分: 166
  • 博客等级: 入伍新兵
  • 技术积分: 2199
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-15 16:10
文章分类

全部博文(247)

文章存档

2017年(1)

2015年(63)

2014年(80)

2013年(94)

2012年(9)

分类: Java

2015-07-15 17:57:17

pring的mvc 3.0和3.1处理json略有不同,用RequestMappingHandlerMapping和RequestMappingHandlerAdapter替代了原有的DefaultMethodHandlerMapping和 AnnotationMethodHandlerAdapter。
在controller里支持使用@RequestBody注解,自动将requestbody里的json字符串的entity 转换为对应的对象实例,需要增加messageconverter,默认没有MappingJackson2HttpMessageConverter, @ResponseBody对应了一系列解析器,RequestMappingHandlerAdapter的messageConverters属性,默认情况下会自动注册一堆Converter,

Converter是每种对象类型都有一个专门针对的默认情况下没有Map对应的解析器,可能会映射到MappingJackson2HttpMessageConverter,
例如如下代码

 @RequestMapping(value = "/vpnserver/status", method = RequestMethod.GET)
    @ResponseBody
    public Map status()
    {
        String retstr = "stop";
        Map map =new HashMap();
        List ls =vpnConfigService.getPid(Constant.VPNSERVER_Name);
        if(ls.size()>0)
        {
          retstr = "running";
        }
        map.put("status",retstr);

        return map;

    }


加了@ResponseBody注解后,return的数据如何解析就是这个属性配置的Converter负责的。
3.1之后默认注入RequestMappingHandlerAdapter只需加上ackson-annotations-2.0.5.jar,jackson-databind-2.0.5.jar,jackson-core-2.0.5.jar。
类似的文件配置文件

    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 
 

    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
     
         
           
                class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" /> 
         
     

java代码,其实不用添加
public class ApplicationContext extends WebMvcConfigurerAdapter {


。。。。。。。

@Override
    public void configureMessageConverters(List> converters) {
        converters.add(converter());
    }

    @Bean
    MappingJackson2HttpMessageConverter converter() {
        //Set HTTP Message converter using a JSON implementation.
        MappingJackson2HttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter();

        // Add supported media type returned by BI API.
        List supportedMediaTypes = new ArrayList();
        supportedMediaTypes.add(new MediaType("text", "plain"));
        supportedMediaTypes.add(new MediaType("application", "json"));
        jsonMessageConverter.setSupportedMediaTypes(supportedMediaTypes);

        return jsonMessageConverter;
    }
}
也可以使用WebMvcConfigurationSupport 代替 WebMvcConfigurerAdapter ,可以进行更多类型的定制。
处于Ajax返回json字符串的中文乱码问题
org.springframework.http.converter.StringHttpMessageConverter类是处理请求或相应字符串的类,并且默认字符集为ISO-8859-1,所以在当返回json中有中文时会出现乱码。
StringHttpMessageConverter的父类里有个List supportedMediaTypes属性,用来存放StringHttpMessageConverter支持需特殊处理的MediaType类型,如果需处理的MediaType类型不在supportedMediaTypes列表中,则采用默认字符集。
解决办法,只需在配置文件中加入如下代码:



 


 application/json;charset=UTF-8





如果需要处理其他 MediaType 类型,可在list标签中加入其他value标签

阅读(1062) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~