Spring boot 使用希伯来语发送请求时,特定机器上的 UTF-8 中间字节无效

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}\n
Run 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

目前使用 Postman 来重现这一点。请求的标头是:

\n\n
"Content-Type":"application/json; charset=UTF-8"\n
Run Code Online (Sandbox Code Playgroud)\n\n

我还尝试将希伯来语添加到运行 Windows 8 的机器本身,但似乎没有什么区别。

\n\n

提前致谢。

\n\n

编辑

\n\n

这是控制器,添加了建议的MediaType但仍然出现相同的错误:

\n\n
@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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑2:

\n\n

尝试了下面的建议以及我在网上找到的其他建议,所有这些都没有效果。这似乎是一个比我想象的更困难的问题。

\n\n

添加到 application.properties 以下字段:

\n\n
spring.http.encoding.charset=UTF-8\nspring.http.encoding.enabled=true\nspring.http.encoding.force=true\nspring.datasource.connectionproperties=useUnicode=true;characterEncoding=utf-8;\n
Run 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

一切都是无济于事。这里发生了什么?当然,Spring boot 可以处理请求中的希伯来字符......

\n

Cod*_*odo 5

本地开发计算机和登台计算机之间的区别非常明显,它们配置了不同的语言和文本编码设置。要解决此问题,请在为应用程序启动 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)