@ControllerAdvice обрабатывает исключение, но не настраивает ответ - PullRequest
0 голосов
/ 29 января 2019

Это мой обработчик исключений

@ControllerAdvice(basePackageClasses = [SignUpController::class])
class ControllerAdvice: ResponseEntityExceptionHandler() {

    @ExceptionHandler(Exception::class)
    @ResponseBody
    fun handleControllerException(request: HttpServletRequest, ex: Throwable): ResponseEntity<*> {
        val status = HttpStatus.CONFLICT
        return ResponseEntity<Any>(ApiError(status.value(), ex.message), status)
    }
}

и мой пользовательский класс

data class ApiError(val status: Int, val message: String?)

Обработчик работает, но выдается ошибка, как следует

{
    "timestamp": "2019-01-29T19:17:22.541+0000",
    "status": 401,
    "error": "Unauthorized",
    "message": "could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement",
    "path": "/sign-up"
}

Но яЯ ожидаю что-то вроде следующего:

{
    "apierror": {
        "status": ...,
        "message": ..."
    }
}

Я основан на этом уроке

https://www.toptal.com/java/spring-boot-rest-api-error-handling https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-error-handling https://medium.com/@jovannypcg/understanding-springs-controlleradvice-cd96a364033f

Что я делаю не так?Мне не хватает какого-либо конфига?

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Мой обходной путь был, но это не правильный ответ

на application.yaml

server:
  error:
    include-exception: true

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

@RestController
@RequestMapping("/register")
class RegisterController: BaseController() {

    @ResponseStatus(HttpStatus.CREATED)
    @PostMapping("/save")
    fun register(@RequestBody user: ApplicationUser) {
        if (userRepository.existsByEmail(user.email)) {
            throw DataIntegrityViolationException("Email already exists")
        }
        if (userRepository.existsByUsername(user.username)) {
            throw DataIntegrityViolationException("Username already exists")
        }
        user.password = bCryptPasswordEncoder.encode(user.password)
        userRepository.save(user)
    }
}

и возврат работал нормально

{
    "timestamp": "2019-01-31T17:08:40.832+0000",
    "status": 500,
    "error": "Internal Server Error",
    "exception": "org.springframework.dao.DataIntegrityViolationException",
    "message": "Email already exists", //here is
    "path": "/register/save"
}
0 голосов
/ 30 января 2019

Вам необходимо аннотировать ваш класс ApiError следующим образом:

@Data 
@JsonTypeInfo(
            include = JsonTypeInfo.As.WRAPPER_OBJECT,
            use = JsonTypeInfo.Id.CUSTOM, 
            property = "error",
            visible = true
) 
@JsonTypeIdResolver(LowerCaseClassNameResolver.class)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...