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


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

    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的包加入的,就是我们的控制器,如下:

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

    但是我们往往不会注意一句很简单的代码:

    1 <mvc:annotation-driven/>

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

    关于配置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的话,会出现提示下载的页面。我们要解决这个问题。网上给的几种方案。

    方案一:

    在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才能够实现。

    方案二:

    在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都是自定义的,你愿意起什么名字就起什么名字。但是为什么要这样才行我还不清楚,先记录一下,然后再查资料弄懂这个问题。

  • 相关阅读:
    Node初学者入门,一本全面的NodeJS教程(转载)
    关于绑定变量的一点心得(转)
    【转】C++11 标准新特性: 右值引用与转移语义
    SVN分支与合并【超详细的图文教程】(转载)
    天猫魔盒屏蔽升级
    大页内存(HugePages)
    反向路径过滤——reverse path filter
    所做更改会影响共用模板Normal.dotm。是否保存此更改
    基于glew,freeglut的imshow
    glfw之hello world
  • 原文地址:https://www.cnblogs.com/qinglangyijiu/p/7742344.html
Copyright © 2020-2023  润新知