Обработчик ошибок в нескольких проектах в Spring Boot - PullRequest
0 голосов
/ 01 октября 2019

В настоящее время я работаю с различными службами, разделенными на разные проекты в Spring Boot.

Я создал обработчик ошибок, который будет JAR для всех проектов, поэтому, когда у меня есть

com.my.package во всех проектах обработчик ошибок работает нормально.

com.my.package.Controller
com.my.package.Entity
...

Мой исключительный ответ:

    "code": 400,
    "message": "'id' must be java.lang.Integer",
    "status": "BAD_REQUEST"
}

Но проблема в том, что у меня

com.my.package.p1 -> для проекта p1

com.my.package.p2 -> для проекта p2

com.my.package.p1.Controller
com.my.package.p1.Entity
...
com.my.package.p2.Controller
com.my.package.p2.Entity
...

кажется, что обработчик ошибок в работе завершен, а обработчик по умолчанию разрешает ошибку,а не мои.

{
    "timestamp": "2019-09-30T23:58:57.379+0000",
    "status": 400,
    "error": "Bad Request",
    "message": "Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'; nested exception is java.lang.NumberFormatException: For input string: \"j\"",
    "path": "/api/department/j"
}

Это мои классы из моего JAR

//@RestControllerAdvice(basePackages = "com.my.package")
@ControllerAdvice
public class GlobalControllerExceptionHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

      //405
    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
    protected GlobalException processMethodNotSupportedException(final HttpRequestMethodNotSupportedException ex) {
        LOGGER.error("Method not allowed");  
        return new GlobalException(405, "Method not allowed",HttpStatus.METHOD_NOT_ALLOWED);
    }

...

Как видите, я пытался использовать @RestControllerAdvice и @ControllerAdvice и пытался использовать аннотацию basePackages но не было успешного результата.

Я также сделал другой класс:

@Configuration
@ComponentScan("com.my.package")
@EntityScan("com.my.package")
public class SharedBeanReference {

}

Но тот же результат.

Может кто-нибудь помочь мне выяснить, что этопроисходит?

1 Ответ

0 голосов
/ 01 октября 2019

Вы можете попробовать указать базовый пакет рекомендаций контроллера, используя аннотацию, например:

@ControllerAdvice(basePackages = "com.my.package")
public class GlobalControllerExceptionHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

      //405
    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
    protected GlobalException processMethodNotSupportedException(final HttpRequestMethodNotSupportedException ex) {
        LOGGER.error("Method not allowed");  
        return new GlobalException(405, "Method not allowed",HttpStatus.METHOD_NOT_ALLOWED);
    }

...

Для методов @ExceptionHandler предпочтение корневого исключения будет предпочтительнее простого совпадения с причиной текущейисключение, среди методов-обработчиков конкретного бина совета. Однако совпадение причин в рекомендации с более высоким приоритетом будет по-прежнему предпочтительным по сравнению с любым сопоставлением (будь то корень или уровень причины) в компоненте рекомендаций с более низким приоритетом. Вследствие этого, пожалуйста, объявите ваши первичные корневые исключения исключений для приоритетного консультативного компонента с соответствующим порядком.

Или вы можете попробовать следующее:

  • Попробуйте предоставить контроллеркласс рекомендации с более высоким приоритетом или порядком, используя аннотацию @Priority или @Order, чтобы он соответствовал.
  • Необходимо убедиться, что класс @ControllerAdvice находится в вашем базовом пакете сканирования компонентов.

Ссылка Документ Официальный Документ

...