最近在使用Postman测试接口,POST请求发送JSON格式的数据。之前一直风平浪静,没什么问题。不过最近测试一直失败,得到的响应是500内部错误,于是去服务器看错误信息,信息如下:
2018-09-03 16:27:15.444 ERROR [] 4365 --- [nio-8180-exec-6]
JSON parse error: Invalid UTF-8 start byte 0xbf; nested exception is com.fasterxml.jackson.core.JsonParseException: Invalid UTF-8 start byte 0xbf
at [Source: java.io.PushbackInputStream@1bda0319; line: 1, column: 3]
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Invalid UTF-8 start byte 0xbf; nested exception is com.fasterxml.jackson.core.JsonParseException: Invalid UTF-8 start byte 0xbf
at [Source: java.io.PushbackInputStream@1bda0319; line: 1, column: 3]
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:238)
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:223)
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:201)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:150)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:128)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:158)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:128)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:112)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at cn.com.git.nfcfront.common.xss.XssFilter.doFilter(XssFilter.java:23)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:347)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:263)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:108)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:115)
at org.springframework.boot.web.support.ErrorPageFilter.access$000(ErrorPageFilter.java:59)
at org.springframework.boot.web.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:90)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:108)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:789)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1437)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: com.fasterxml.jackson.core.JsonParseException: Invalid UTF-8 start byte 0xbf
at [Source: java.io.PushbackInputStream@1bda0319; line: 1, column: 3]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1702)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:558)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._reportInvalidInitial(UTF8StreamJsonParser.java:3544)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._decodeCharForError(UTF8StreamJsonParser.java:3286)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._reportInvalidToken(UTF8StreamJsonParser.java:3519)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleUnexpectedValue(UTF8StreamJsonParser.java:2686)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._nextTokenNotInObject(UTF8StreamJsonParser.java:878)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:772)
at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3850)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3799)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2938)
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:235)
... 88 common frames omitted
网上查相关资料说是什么响应消息头的问题,又说是编码的问题,我想了想我的情况应该不是,毕竟之前也是按照这个来的,一直没啥问题。这个异常很清楚,JSON解析失败了,至于为什么会失败,原因让我很无语。
原来最近终端工具从CRT换成了MobaXterm,从生产环境拷贝数据到测试时,竟然发现它在JSON串中加入了两个>符号,这个符号被加在了中文串中,不容易发现,并且使用JSON格式化校验也查不出问题来。
而就是这个藏在中文串中的符号存在,所以导致fastJson解析失败了,我想正是这个字符被加入其中却没有转义的原因。于是我把这两个>字符删掉后,终于成功的调通了接口。
可见,使用fastJSON解析JSON数据时,遇到这些特殊字符,如果不转义,就可能出现此异常。 需要被转义
">", ">"
"<", "<"
" ", " "
"\"", """
"\'", "'"
"\\", "\\\\"
"\n", "\\n"
"\r", "\\r"
Windows下RequestBody里中文格式
JSON
解析报错
大年29, 项目终于完工, 火急火燎的上线部署, 服务器是Windows系统, 项目框架是SpringBoot2.2.11, 打成jar包运行后测试报错, 报错信息如下:
JSON
parse
error
:
Invalid
UTF-
8 middle
byte
0xe8; nested exception is com.fasterxml.jackson.databind.
Json
MappingException:
Invalid
U
Invalid
UTF-
8
start
byte
0xbf
at [Source: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream); line: 1, column: 11] (through reference chain: co
这两天,迭代开发一个简单小需求,POST 请求接收前端的传参,将接收到的
JSON
格式再转换成对应的 POJO,但是在程序接收请求过程中却报了如下
异常
:
org.springframework.http.converter.HttpMessageNotReadableException:
JSON
parse
error
:
Invalid
UTF-
8
start
byte
0xa0; nested exception is com.fasterxml.jackson.core.
Json
Parse
Excep
@ApiOperation(value="取消关注")
@PostMapping("cancelFollow")
public R cancelFollow(@RequestBody CancelFollowVo cancelFollowVo) {
当我部署到服务器上时测试出现了这个问题
Closing non transactional...
原因分析:
打断点调试,发现没有进入接口。问题定位在接口请求参数问题,网上查相关资料说是什么响应消息头的问题,又说是编码的问题。说在JAVA Options:增加【-Dfile.encoding=
UTF-
8、server.xml增加【URIEncoding=‘
UTF-
8’】、请求头部加Content-Type = application/
json
;charset=
utf-
8等等之类,发现这些都已经设置过了。
解决方案:
最后发现请求参数格式错误:参数前面多了
Request","exception":"org.springframework.http.converter.HttpMessageNotReadableException","message":"
JSON
parse
error
:
Invalid
UTF-
8 middle
byte
0x3f
造成上述错误的原因:jvm参数未配置编码格式和eclipse 工作空间未指定编码格式。
解决办法:指定jvm 编码格式
打开Windows
然后在tomcat下bin的catalina.bat 中,set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=
UTF-
8(见下图)首先在tomcat下conf的server.xml中,在Connector 标签中添加编码属性:URIEncoding="
UTF-
8"(见下图)本地idea开发环境没有问题,部署到外置tomcat之后,带中文的post请求报400错误。纯英文提交没有问题,中文报错,说明跟编码格式有关。添加完成之后,但是没有解决问题。
请注意,
JSON
规范不允许数字以0开头,因为0开头的数字在
JSON
中被解释为八进制数。如果你需要传递一个整数值,而该值以0开头,你可以将其转换为字符串,以避免
JSON
解析错误。例如,将整数值123转换为字符串"123",以便正确地在
JSON
中传递。要解决这个问题,您可以确保在
JSON
数据中传递的数字字符串不以0开头,或者修改后端代码来处理以0开头的数字字符串。这个
异常
是因为在
JSON
数据中传递了一个数字字符串,但该数字字符串以0开头,而
JSON
中数字不能以0开头。
JSON
parse
error
:
Invalid
UTF-
8
start
byte
0x8b问题描述报错信息报错环境解决方案例子
接口在本地测试没有问题,放在服务器后就会报400,参数中文编码报错
JSON
parse
error
:
Invalid
UTF-
8
start
byte
0x8b
spring boot 在发送post请求时
在服务器启动项目时增加编码限制
-Dfile.encoding=
UTF-
8
java -jar -Dfile.enco
org.springframework.http.converter.HttpMessageNotReadableException:
JSON
parse
error
:
Invalid
UTF-
8
start
byte
0xa0; nested exception is com.fasterxml.jackson.core.
Json
Parse
Exception:
Invalid
UTF-
8
start
byte
0xa0
at [Source: (Pushbac
nested exception is com.fasterxml.jackson.databind.
Json
MappingException:
Invalid
UTF-
8
start
byte
0xbd
at [Source: (PushbackInputStream); line: 14, column: 22]
at [Source: (PushbackInputStr...