Как я могу вернуть свой пользовательский файл json вместо файла по умолчанию json, который генерирует весеннюю загрузку? - PullRequest
3 голосов
/ 12 февраля 2020

У меня есть контроллер покоя для авторизации:

@RestController
class AuthController {

    @PostMapping("/sign-up")
    fun signUp(@RequestBody signUpRequest: SignUpRequest): ResponseEntity<String> {
       some code here..
    }
}

Метод signUp получает модель SignUpRequest в качестве тела запроса. SignUpRequest модель:

enum class Role {
    @JsonProperty("Student")
    STUDENT,
    @JsonProperty("Tutor")
    TUTOR
}

data class SignUpRequest(
    val role: Role,
    val email: String,
    val password: String
)

Когда я делаю /sign-up отправлять запрос с JSON:

{
    "role": "asdf",
    "email": "",
    "password": ""
}

Он возвращает мне ответ, который был сгенерирован весенней загрузкой:

{
    "timestamp": "2020-02-12T05:45:42.387+0000",
    "status": 400,
    "error": "Bad Request",
    "message": "JSON parse error: Cannot deserialize value of type `foo.bar.xyz.model.Role` from String \"asdf\": not one of the values accepted for Enum class: [Student, Tutor]; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `foo.bar.xyz.model.Role` from String \"asdf\": not one of the values accepted for Enum class: [Student, Tutor]\n at [Source: (PushbackInputStream); line: 3, column: 10] (through reference chain: foo.bar.xyz.model.SignUpRequest[\"role\"])",
    "path": "/sign-up"
}

Вопрос заключается в следующем: как я могу вернуть свой пользовательский JSON вместо сгенерированного по умолчанию JSON?

Я хочу вернуть свой пользовательский JSON, например:

{
  "result": "Invalid user data are given",
  "errors": [
    {
      "fieldName": "ROLE",
      "text": "Given role does not exist"
    },
    {
      "fieldName": "EMAIL",
      "text": "EMAIL is empty"
    }
  ]
}

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Я предлагаю вам создать ErrorContrller, который генерирует пользовательскую карту json в качестве ответа. Затем, когда вы обнаружите ошибку в методе регистрации, вызовите метод ErrorContrllers. Вы можете найти информацию по этой ссылке

0 голосов
/ 12 февраля 2020

Наконец-то я нашел решение. Вы должны создать класс, который аннотирует @ControllerAdvice, и создать метод, который аннотирует @ExceptionHandler.

@ControllerAdvice
class HttpMessageNotReadableExceptionController {

    @ExceptionHandler(HttpMessageNotReadableException::class)
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    fun handleException(
        exception: HttpMessageNotReadableException
    ): PostSignUpResponseError {

        val errors = mutableListOf<PostSignUpResponseErrorItem>()

        errors.add(
            PostSignUpResponseErrorItem(
                fieldNamePost = "Role",
                text = "Given role does not exist"
            )
        )

        return PostSignUpResponseError(
            result = "Invalid user data are given",
            errors = errors
        )
    }
}

где PostSignUpResponseErrorItem и PostSignUpResponseError:

data class PostSignUpResponseError(
    val result: String,
    val errors: List<PostSignUpResponseErrorItem>
)

class PostSignUpResponseErrorItem(
    val fieldNamePost: PostSignUpRequestFieldName,
    val text: String
)

В любом случае, я все еще не знаю, как прикрепить эту вещь к определенному методу PostMapping.

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