springmvc配置jackson时遇到的一些问题

在没接触springmvc以前咱们在servlet中想返回前台json数据时,都是自定义一个JSONObject和JSONArray,而后调用response.getWriter()对象的方法返回json数据,相似:html

1 jsonObject.element("photoAudit", audit);
2 jsonObject.element("photoAudit2", audit2);
3 jsonObject.element("photoAudit3", audit3);
4 jsonArrayR.add(jsonObject);
5 
6 
7 PrintWriter out = response.getWriter();
8 out.print(jsonR.toString());
9 out.close();

在接触springmvc项目后,知道能够springmvc能够经过配置让对象、list集合或者map能够直接返回json格式的数据,很是方便。若是本身配置的话,仍是须要本身多了解一些,不要盲目的在网上直接copy代码就结束了。咱们在配置springmvc配置文件的时候,必定会把controller的包加入的,就是咱们的控制器,以下:web

<context:component-scan base-package="com.example.controller"/>

可是咱们每每不会注意一句很简单的代码:spring

1 <mvc:annotation-driven/>

这句代码通常状况是直接跟在上面那句扫描controller包后面的。从字面理解的意思就是mvc的注解驱动。<mvc:annotation-driven/>会自动注册两个bean,分别为DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter。是springmvc为@controller分发请求所必须的。除了注册了这两个bean,还提供了不少支持,其中一项就提到了读写JSON的支持(Jackson)。json

关于配置springmvc的jackson依赖,有主要两个步骤(除了jackson还能够配置阿里的fastjson),第一步就是在添加jar包依赖,我配置的是jackson2的版本,以下:浏览器

 1 <!--jackson-->
 2     <dependency>
 3       <groupId>com.fasterxml.jackson.core</groupId>
 4       <artifactId>jackson-core</artifactId>
 5       <version>2.7.0</version>
 6     </dependency>
 7     <dependency>
 8       <groupId>com.fasterxml.jackson.core</groupId>
 9       <artifactId>jackson-databind</artifactId>
10       <version>2.7.0</version>
11     </dependency>
12     <dependency>
13       <groupId>com.fasterxml.jackson.core</groupId>
14       <artifactId>jackson-annotations</artifactId>
15       <version>2.7.0</version>
16     </dependency>

第二步就是在springmvc的配置文件中加入转换器的配置,这里其实不加配置只有<mvc:annotation-driven/>的话也能够实现json自动转化,可是会面临一个问题,就是在使用IE浏览器时,返回的数据格式若是是json的话,会出现提示下载的页面。咱们要解决这个问题。网上给的几种方案。mvc

方案一:app

在springmvc的配置文件中添加以下代码测试

<bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
  <property name="supportedMediaTypes">
   <list>
    <value>text/html;charset=UTF-8</value>
   </list>
  </property>
</bean>

这种一看就以为不对,定义了一个转化器,可是只是定义了一个转化器而已,什么关联都没有。首先咱们要了解问题出现的缘由,才可以解决问题。springmvc返回json数据在IE浏览器中访问,会出现下载现象是由于IE10如下不支持application/json格式的Response响应,也就是说低于IE10版本的IE浏览器都须要使用text/html的Response响应。因此咱们知道了转换器确定要绑定response才可以实现。url

方案二:spa

在springmvc的配置文件中添加以下代码

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
  <property name="messageConverters">
   <list >
    <ref bean="mappingJacksonHttpMessageConverter" />
   </list>
  </property>
 </bean>
 <bean id="mappingJacksonHttpMessageConverter"
  class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
  <property name="supportedMediaTypes">
   <list>
    <value>text/html;charset=UTF-8</value>
   </list>
  </property>
 </bean> 

这种感受已经很对了,并且查了一下大多数网上给的都是这种。我在添加了如上代码后测试仍是会提示下载,而后就在想会不会是RequestMappingHandlerAdapter的问题,上网查了一下RequestMappingHandlerAdapter的做用。RequestMappingHandlerAdapter的做用大概是简单来讲就是采用反射机制调用url请求对应的Controller中的方法(这其中还包括参数处理等等操做没有介绍),返回执行结果值,这样就完成了HandlerAdapter的使命。看来RequestMappingHandlerAdapter的做用就是负责分发到controller并返回的过程,这么看的话添加上面的代码应该能够才对,不明白为何不行。最后把代码改成:

<mvc:annotation-driven>
        <mvc:message-converters>
            <ref bean="stringHttpMessageConverter"/>
            <ref bean="mappingJackson2HttpMessageConverter"/>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <bean id="stringHttpMessageConverter"
          class="org.springframework.http.converter.StringHttpMessageConverter"/>

    <!--解决IE浏览器json文件下载和json数据中午乱码的问题-->
    <bean id="mappingJackson2HttpMessageConverter"
          class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
            </list>
        </property>
    </bean>

其实就是至关于把jackson的转化器从原来添加到RequestMappingHandlerAdpter改成直接添加到注解驱动<mvc:annotation-driven>里,在<mvc:annotation-driven></mvc:annotation-driven>添加<mvc:message-converters>消息转化器,将自定义的转换器加入其中就OK了。注:这里定义的转化器bean的id都是自定义的,你愿意起什么名字就起什么名字。可是为何要这样才行我还不清楚,先记录一下,而后再查资料弄懂这个问题。

相关文章
相关标签/搜索