Code Bye

rest接收中文的json数据时报异常,springmvc大神请进~

老实说对springmvc的基础很差,一直没有好好学,公司都是直接派任务出来就得赶,最近写了个接口,发现接收json的时候英文没事,一到了中文就异常了。下面上码:

 DEBUG o.s.w.s.m.a.AnnotationMethodHandlerExceptionResolver - Resolving exception from handler [org.gtjd.action.foreground.WebScienceInterface@457b0c]: org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Invalid UTF-8 middle byte 0xd0
 at [Source: org.apache.catalina.connector.CoyoteInputStream@c302a0; line: 1, column: 25]; nested exception is org.codehaus.jackson.JsonParseException: Invalid UTF-8 middle byte 0xd0
 at [Source: org.apache.catalina.connector.CoyoteInputStream@c302a0; line: 1, column: 25]

,这是控制台的log。

@RequestMapping(value="/u_member",method=RequestMethod.POST,produces={"application/json;charset=UTF-8"})
	public @ResponseBody Map<String,Object> uploadMember(HttpServletRequest request, HttpServletResponse response,@RequestBody Member member)

,这是rest的路径,以及对应的方法。

<bean id="jsonConverter"
		class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
		<property name="supportedMediaTypes">
			<list>
				<value>application/json;UTF-8</value>
				<value>text/json</value>
				<value>text/plain</value>
				<value>text/html</value>
			</list>
		</property>
		<property name="objectMapper">
            <bean class="org.gtjd.common.springmvc.CustObjectMapper"/>
        </property>
	</bean>

,这个是springmvc的配置。
没多少分,还请各位大神帮帮忙,当程序猿的信心都快没了。


15分
springmvc要编码设置的 你看看web.xml里面有么
  <!--  编码设置-->
  <filter>
    <filter-name>encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

10分
应该是乱码造成了spring无法正常解析吧。先保证你接受到得对象里没有中文乱码。
引用 1 楼 sc6231565 的回复:

springmvc要编码设置的 你看看web.xml里面有么

  <!--  编码设置-->
  <filter>
    <filter-name>encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

 首先感谢!上次也是你帮我解决的~我查了一下web.xml发现没配这个,但是我加了进去还是不行呢,同样的异常

引用 2 楼 fangmingshijie 的回复:

应该是乱码造成了spring无法正常解析吧。先保证你接受到得对象里没有中文乱码。

诶,发请求那方也是用的utf-8编码,发的只是汉字而已,应该不是乱码吧

引用 3 楼 xzz111 的回复:
Quote: 引用 1 楼 sc6231565 的回复:

springmvc要编码设置的 你看看web.xml里面有么

  <!--  编码设置-->
  <filter>
    <filter-name>encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

 首先感谢!上次也是你帮我解决的~我查了一下web.xml发现没配这个,但是我加了进去还是不行呢,同样的异常

把这个filter配在 你的springmvc 拦截器前面 !
如果正确配置了还出现乱码.那么真的就有可能前端出现这个问题

server.xml里面的URIencoding配置成UTF-8试试。
引用 5 楼 sc6231565 的回复:
Quote: 引用 3 楼 xzz111 的回复:
Quote: 引用 1 楼 sc6231565 的回复:

springmvc要编码设置的 你看看web.xml里面有么

  <!--  编码设置-->
  <filter>
    <filter-name>encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

 首先感谢!上次也是你帮我解决的~我查了一下web.xml发现没配这个,但是我加了进去还是不行呢,同样的异常

把这个filter配在 你的springmvc 拦截器前面 !
如果正确配置了还出现乱码.那么真的就有可能前端出现这个问题

前端哪里的问题呢,我排查了一遍,配置也齐全了,反正只要出现中文就报异常,无解啊。。我是用restdebugger测试的。跪了!

引用 6 楼 dokia123 的回复:

server.xml里面的URIencoding配置成UTF-8试试。

配了的。。

页面也是utf8编码么?

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

springmvc配置文件里面加了这个吗

<bean
		class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="messageConverters">
			<list>
				<ref bean="mappingJacksonHttpMessageConverter" />
			</list>
		</property>
	</bean>
引用 10 楼 w3226327 的回复:
	<bean id="mappingJacksonHttpMessageConverter"
		class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
		<property name="supportedMediaTypes">
			<list>
				<value>text/html;charset=UTF-8</value>
			</list>
		</property>
	</bean>

springmvc配置文件里面加了这个吗

配了的,因为我要的是json,所以配的application/json;UTF-8


1分
我用的是Jersey,但是我判断你发现你rest路径只配置了produce,没有配consume
@RequestMapping(value="/testMsgConverter",consumes="application/json;charset=UTF-8",produces="application/json;charset=UTF-8")  
把编码什么都删了试试 使用默认的
引用 13 楼 u011564172 的回复:

我用的是Jersey,但是我判断你发现你rest路径只配置了produce,没有配consume

@RequestMapping(value="/testMsgConverter",consumes="application/json;charset=UTF-8",produces="application/json;charset=UTF-8")  

看来是无解了,配了还是没用。谢谢!

引用 14 楼 ella110727 的回复:

把编码什么都删了试试 使用默认的

什么都不配就全乱码了呀- –


1分
web.xml
 <servlet>
         <servlet-name>JAX-RS REST Servlet</servlet-name>
         <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
         <load-on-startup>2</load-on-startup> 
     </servlet>
     <servlet-mapping>
         <servlet-name>JAX-RS REST Servlet</servlet-name>
         <url-pattern>/jaxrs/*</url-pattern>
     </servlet-mapping>
java:
@Path(“/ApSyncRestAPI”)
public class ApSyncRestAPI {}供参考  
自我终结:今天没事将request头打印出来跟jquery ajax提交的文件头对比了一下,发现rest debugger发过来的content-type为application/json,而jq的多了charset=utf-8,问题就在这里。由于客户使用的是Delphi,content-type设置比较麻烦,若采用常用的web编程语言应该不会有这种问题的。PS:5楼的答案总是八九不离十。。不止大神大腿是否还有位置 @sc6231565

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明rest接收中文的json数据时报异常,springmvc大神请进~