SPRING3.X JSON 406 和 中文亂碼問題

簡要

最近使用Spring3.2.3 版本  在使用 JSON message  convertion 的時候,總是出現406 返回類型不匹配的問題,去網上google 了一番 也沒有一個明確的說法,只能本身去調試。 java

Maven 依賴
<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>


message convertor XML 配置

使用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 的亂碼問題也順帶解決下。
相關文章
相關標籤/搜索