我正在使用 Spring boot mvc,并且遇到一个问题,该问题仅在我的临时计算机上重现,但在本地运行良好。
我发送以下 JSON 请求(注意“whatever”字段下的希伯来字符):
{
"messageInitiaterId":"0542258808",
"destinationId":"0544556543",
"whatever":"משהו",
"pushToken":"e2eeb632-8c2c-4ad2-a163-cfeb671d1955",
"androidVersion":"7.1.1",
"deviceModel":"huawei nexus 6p",
"appVersion":"1.42"
}
在本地,它返回响应,一切都很好。在登台计算机上,这是返回的响应:
{
"timestamp": 1485591099485,
"status": 400,
"error": "Bad Request",
"exception":
"org.springframework.http.converter.HttpMessageNotReadableException",
"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]",
"path": "/v1/IsRegistered"
}
目前使用 Postman 来重现这一点。请求的标头是:
"Content-Type":"application/json; charset=UTF-8"
我还尝试将希伯来语添加到运行 Windows 8 的机器本身,但似乎没有什么区别。
提前致谢。
EDIT:
这是控制器,添加了建议的MediaType
但仍然遇到同样的错误:
@Controller
public class IsRegisteredController extends AbstractController {
private final IsRegisteredLogic logic;
@Autowired
public IsRegisteredController(IsRegisteredLogic logic) {
this.logic = logic;
}
@ResponseBody
@RequestMapping(value = "/v1/IsRegistered", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
public Response<UserDTO> isRegistered(@Valid @RequestBody IsRegisteredRequest request, HttpServletResponse response) {
return logic.execute(request, response);
}
}
EDIT2:
尝试了下面的建议以及我在网上找到的其他建议,所有这些都没有效果。这似乎是一个比我想象的更困难的问题。
添加到 application.properties 以下字段:
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
spring.datasource.connectionproperties=useUnicode=true;characterEncoding=utf-8;
以及以下豆类:
@Bean
public TomcatConnectorCustomizer tomcatConnectorCustomizer() {
return connector -> connector.setURIEncoding("UTF-8");
}
@Bean
public Filter characterEncodingFilter() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return characterEncodingFilter;
}
一切都是无济于事。这里发生了什么?当然,Spring boot 可以处理请求中的希伯来字符......