ResponseEntity生成了转义后的输出,而不是json。

11 浏览
0 Comments

ResponseEntity生成了转义后的输出,而不是json。

我对Spring框架还比较新,正在通过开发一个示例项目来学习。或许这是一个愚蠢的问题,但我找不到任何帮助。当验证规则不通过时,我的控制器会响应请求并返回一个转义后的字符串,而不是对象的JSON表示。我使用了Bean验证器和Gson来生成错误的JSON表示。我的控制器返回的是:

"{\"firstName\":\"firstName required\",\"lastName\":\"lastName required\",\"password\":\"password required\",\"matchingPassword\":\"matchingPassword required\",\"email\":\"email required\"}"

但在控制台上,Gson打印出了一个正确的JSON表示:

{"firstName":"firstName required","lastName":"lastName required","password":"password required","matchingPassword":"matchingPassword required","email":"email required"}

这是我的控制器代码:

@RequestMapping(value = "/user/registration", method = RequestMethod.POST, headers = "Accept=application/json", produces = {"application/json"})
public ResponseEntity registerUserAccount(@Valid @RequestBody UserDTO accountDto) {
    LOGGER.debug("Registering user account with information: {}", accountDto);
    User registered = userService.registerNewUserAccount(accountDto);
    return new ResponseEntity<>("Success", HttpStatus.OK);
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity handleValidationExceptions(MethodArgumentNotValidException ex) {
    LOGGER.debug("MethodArgumentNotValidException called");
    Map errors = new HashMap<>();
    ex.getBindingResult().getAllErrors().forEach((error) -> {
        String fieldName = ((FieldError) error).getField();
        String errorMessage = error.getDefaultMessage();
        errors.put(fieldName, errorMessage);
    });
    Gson gson = new Gson();
    LOGGER.debug(gson.toJson(errors));
    return ResponseEntity.badRequest().contentType(MediaType.APPLICATION_JSON).body(gson.toJson(errors));
}

我尝试了很多可能的解决方案,但没有一个有效,始终返回转义后的字符串表示。任何帮助都将不胜感激,我已经花了很多时间尝试解决这个问题,我觉得这是一个很愚蠢的问题,但我甚至无法完成我的第一个控制器。这是项目的Git仓库,如果需要的话。

0
0 Comments

问题的出现原因是因为在使用ResponseEntity的时候,我将String作为T参数传递进去了,所以在传递给响应的时候,String会被StringHttpMessageConverter处理并进行转义操作。

解决方法之一是将返回的数据封装成一个对象或者使用一个数据的包装类,这样在使用ResponseEntity返回的时候就不会将String进行转义操作了。

另一个解决方法是在WebMvcConfiguration中关闭StringHttpMessageConverter,但是除非在特定情况下,一般不建议这样做。

如果需要更多帮助,可以参考以下链接:https://stackoverflow.com/a/37906098/12771022

0