1. 程式人生 > >SpringMVC使用了@ResponseBody報406錯誤的問題

SpringMVC使用了@ResponseBody報406錯誤的問題

主要是幾點:

返回json主要有幾種方法

1.直接使用

  1. <mvc:annotation-driven/>
在這種情況下,Spring會自動註冊org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

這兩個類,如果加入了Jackson的相關jar包,那麼會spring使用Jackson作為轉換器(不用手動配置,原始碼暫時沒找到在哪),

這樣就只需要加上@Response就可以了

注意:在3.2版本之前使用的還是
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

這兩個類,這兩個類的實現又不一樣,需要注意

2.配置

  1. <mvc:message-converters>
除了使用Jackson的jar包外,還可以使用其他的json包,如fastjson,這時可以手動指定轉換器,此時如果有Jackson的jar包,那麼兩個轉換器都會加入轉換器列表中,如果沒有Jackson的包,那麼就使用配置的,程式碼如下

  1. <mvc:annotation-driven>
  2.     <mvc:message-converters>
  3.         <beanclass="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
  4.                <propertyname="supportedMediaTypes">
  5.                    <list>
  6.                        <value>application/json;
    charset=UTF-8</value>
  7.                    </list>
  8.                </property>
  9.            </bean>
  10.     </mvc:message-converters>
  11. </mvc:annotation-driven>

3.使用bean標籤來初始化
  1. <beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
  2.    <beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
  3.        <propertyname="messageConverters">
  4.            <list>
  5.                <beanclass="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
  6.                    <propertyname="supportedMediaTypes">
  7.                        <list>
  8.                            <value>text/html; charset=UTF-8</value>
  9.                            <value>application/json;charset=UTF-8</value>
  10.                        </list>
  11.                    </property>
  12.                </bean>
  13.            </list>
  14.        </property>
  15.    </bean>
這時候,需要自己指定messageConverters,如果不指定,那麼是不會自動將Jackson作為轉換器的

我自己碰到的大概就這幾種方法,另外還有幾個地方需要注意

1.Jackson有分兩種

org.springframework.http.converter.json.MappingJackson2HttpMessageConverter

org.springframework.http.converter.json.MappingJacksonHttpMessageConverter

網上找到的是說和Jackson版本有關,2.x版本的才是使用2,我自己試的時候是兩種都可以的,由於找不到原始碼,所以暫時不知道是什麼原因

2.mvc:message-converters這個子標籤在3.1之後才有的,如果使用的不是3.1的spring,但是卻是寫成了3.1的標籤,那麼即使配置了轉換器,這個也是無效的配置