ResponseEntity создает экранированный вывод вместо json - PullRequest
0 голосов
/ 23 января 2020

Я довольно новичок в Spring Framework и пытаюсь учиться, разрабатывая пример проекта

Возможно, это глупый вопрос, но я не могу найти никакой помощи вообще.

Мой контроллер отвечает на запросы экранированной строкой вместо json представления объекта, когда правила проверки не проходят. Я использую валидаторы бина и Gson для генерации ошибки json представление ошибок.

Мой контроллер отвечает:

"{\" firstName \ ": \" firstName требуется \ ", \" lastName \ ": \" lastName требуется \ ", \" password \ ": \" требуется пароль \ ", \" matchPassword \ ": \" требуется соответствующий пароль \ ", \" электронная почта \ ": \ "email required \"} "

Но в консоли Gson печатает правильное json представление

{" firstName ":" firstName required "," lastName ":" lastName обязательно "," пароль ":" пароль требуется "," MatchPassword ":" требуется пароль "," электронная почта ":" требуется электронная почта "}

Вот мой контроллер:

    @RequestMapping(value = "/user/registration", method = RequestMethod.POST, headers = "Accept=application/json", produces = {"application/json"})
public ResponseEntity<String> 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<String, String> 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));
}

Я пробовал множество возможных решений, но ни одно из них не работает, всегда возвращает экранированное строковое представление объекта.

Любая помощь будет принята, я потерял много времени, пытаясь чтобы решить это, и я чувствую, что это что-то дурак, но я не могу двигаться вперед, потому что я даже не могу завершить свой первый контроль er

здесь git проекта , при необходимости

1 Ответ

0 голосов
/ 24 января 2020

Решено.

Как я и подозревал, это была дурацкая ошибка с моей стороны,

ResponseEntity воспринимал как String как T, поэтому при передаче в ответ String обрабатывался StringHttpMessageConverter , который экранирует строку.

При возврате объектов в виде T с помощью ResponseEntity мы должны предоставить объект, который должен быть представлен, или класс-оболочку для данных, или экранировать строку.

Другой обходной путь отключить StringHttpMessageConverter, что может быть сделано в WebMvcConfiguration, но не рекомендуется, если только при определенных обстоятельствах.

Дальнейшая помощь может быть найдена в: { ссылка }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...