最近使用Spring3.2.3 版本 在使用 JSON message convertion 的時候,總是出現406 返回類型不匹配的問題,去網上google 了一番 也沒有一個明確的說法,只能本身去調試。 java
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.1.0</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.1.0</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.1.0</version> <type>jar</type> <scope>compile</scope> </dependency>
使用jackson2.X 版本。 web
<mvc:annotation-driven conversion-service="conversionService"> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> </bean> </mvc:message-converters> </mvc:annotation-driven>
關鍵代碼主要在於查找可以處理 請求要求的返回值類型的 message convertion. spring
/*關鍵類*/
org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver
/*方法*/ protected <T> void writeWithMessageConverters(..)
篩選可以處理的返回值類型 json
List<MediaType> requestedMediaTypes = getAcceptableMediaTypes(servletRequest); List<MediaType> producibleMediaTypes = getProducibleMediaTypes(servletRequest, returnValueClass);請求的Accept-type 'application/json ...' (記憶不全了)
調試發現 producibleMediaTypes 居然爲空, 致使執行如下代碼 spring-mvc
if (compatibleMediaTypes.isEmpty()) { throw new HttpMediaTypeNotAcceptableException(producibleMediaTypes); }拋出了406 錯誤。
排查發現方法 mvc
getProducibleMediaTypes(..)messageConverters 只有spring 默認的messageConvertor, 定義的JSON 轉換未生效, 我就猜想是XML 配置文件出了問題
spring 默認的messageConvertor 列表 app
ByteArrayHttpMessageConverter |
converts byte arrays |
StringHttpMessageConverter |
converts strings. |
FormHttpMessageConverter |
converts form data to/from a MultiValueMap<String, String>. |
SourceHttpMessageConverter |
converts to/from a javax.xml.transform.Source. |
後來檢查發現 我在spring-mvc 配置文件中又配置了 google
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> ... </bean>
用於全局的PropertyEditor 編碼
------------------------------------------------------------------------------------------------------------------ spa
其實這裏就發生衝突了, 在 <mvc:annotation-driven /> 是包含了該配置的。 spring 其餘地方也有不少這樣的設計。
修改以下配置
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> </bean> <!-- 返回Spring 亂碼 主要是默認的 String Converter 編碼是 ISO-8859-1 (按須要修改這裏面的配置)--> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/plain;charset=UTF-8</value> </list> </property> <property name="writeAcceptCharset" value="true"/> </bean> </list> </property> </bean> <mvc:annotation-driven/>這樣 JSON 的支持問題就解決了, string 的亂碼問題也順帶解決下。