Nom*_*fan 3 java spring json character-encoding spring-boot
我正在使用 Spring boot mvc,并且遇到一个问题,该问题仅在我的临时计算机上重现,但在本地运行良好。
\n\n我发送以下 JSON 请求(注意“whatever”字段下的希伯来字符):
\n\n{\n "messageInitiaterId":"0542258808",\n "destinationId":"0544556543",\n "whatever":"\xd7\x9e\xd7\xa9\xd7\x94\xd7\x95",\n "pushToken":"e2eeb632-8c2c-4ad2-a163-cfeb671d1955",\n "androidVersion":"7.1.1",\n "deviceModel":"huawei nexus 6p",\n "appVersion":"1.42"\n}\nRun Code Online (Sandbox Code Playgroud)\n\n在本地,它返回响应,一切都很好。在登台计算机上,这是返回的响应:
\n\n{\n "timestamp": 1485591099485,\n "status": 400,\n "error": "Bad Request",\n "exception": \n\n "org.springframework.http.converter.HttpMessageNotReadableException",\n "message": "Could not read document: Invalid UTF-8 middle byte 0x3f\\n at [Source: java.io.PushbackInputStream@6996e7d; line: 4, column: 17]; nested exception is com.fasterxml.jackson.core.JsonParseException: Invalid UTF-8 middle byte 0x3f\\n at [Source: java.io.PushbackInputStream@6996e7d; line: 4, column: 17]",\n "path": "/v1/IsRegistered"\n\n}\nRun Code Online (Sandbox Code Playgroud)\n\n目前使用 Postman 来重现这一点。请求的标头是:
\n\n"Content-Type":"application/json; charset=UTF-8"\nRun Code Online (Sandbox Code Playgroud)\n\n我还尝试将希伯来语添加到运行 Windows 8 的机器本身,但似乎没有什么区别。
\n\n提前致谢。
\n\n编辑:
\n\n这是控制器,添加了建议的MediaType但仍然出现相同的错误:
@Controller\npublic class IsRegisteredController extends AbstractController {\n\nprivate final IsRegisteredLogic logic;\n\n@Autowired\npublic IsRegisteredController(IsRegisteredLogic logic) {\n this.logic = logic;\n}\n\n@ResponseBody\n@RequestMapping(value = "/v1/IsRegistered", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)\npublic Response<UserDTO> isRegistered(@Valid @RequestBody IsRegisteredRequest request, HttpServletResponse response) {\n return logic.execute(request, response);\n}\n}\nRun Code Online (Sandbox Code Playgroud)\n\n编辑2:
\n\n尝试了下面的建议以及我在网上找到的其他建议,所有这些都没有效果。这似乎是一个比我想象的更困难的问题。
\n\n添加到 application.properties 以下字段:
\n\nspring.http.encoding.charset=UTF-8\nspring.http.encoding.enabled=true\nspring.http.encoding.force=true\nspring.datasource.connectionproperties=useUnicode=true;characterEncoding=utf-8;\nRun Code Online (Sandbox Code Playgroud)\n\n以及以下豆类:
\n\n@Bean\npublic TomcatConnectorCustomizer tomcatConnectorCustomizer() {\n return connector -> connector.setURIEncoding("UTF-8");\n}\n\n@Bean\npublic Filter characterEncodingFilter() {\n CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();\n characterEncodingFilter.setEncoding("UTF-8");\n characterEncodingFilter.setForceEncoding(true);\n return characterEncodingFilter;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n一切都是无济于事。这里发生了什么?当然,Spring boot 可以处理请求中的希伯来字符......
\n本地开发计算机和登台计算机之间的区别非常明显,它们配置了不同的语言和文本编码设置。要解决此问题,请在为应用程序启动 JVM 时显式指定文本编码:
java -Dfile.encoding=UTF-8 -jar target/myproject-0.0.1-SNAPSHOT.jar
Run Code Online (Sandbox Code Playgroud)
您甚至可以设置以下属性,application.properties以防止 Tomcat 在编码配置不正确时启动:
spring.mandatory_file_encoding=UTF-8
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11599 次 |
| 最近记录: |