Обработка исключений конечной точки Spring Boot Actuator Management

Вопрос: как я могу обрабатывать исключения, возникающие в конечных точках MVC в контексте управления?

public class MyMvcEndpoints extends EndpointMvcAdapter {
    @ResponseBody
    @RequestMapping(method = GET, value = "/foo", produces = APPLICATION_JSON_VALUE)
    public Foo foo() {
        throw new FooNotFound("Foo Not Found!");
    }
}

@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class FooNotFound extends RuntimeException {
    public NotFoundException(String message){
        super(message);
    }
}

С текущей конфигурацией я получаю 500 вместо 404. Я попробовал обычные подходы к обработке исключений, такие как методы ControllerAdvice, ExceptionHandler и т. д. Безуспешно.
Я также нашел CompositeHandlerExceptionResolver в EndpointWebMvcChildContextConfiguration, который отвечает за обработку исключений. Я попытался определить свой собственный компонент HandlerExceptionResolver, но он не может найти мой преобразователь в контексте управления.


person Rad    schedule 01.08.2017    source источник
comment
Похоже, это должно работать как есть. Некоторые собственные конечные точки Spring Boot используют @ResponseStatus в качестве исключения. Вот один пример. В том, что вы делаете, должно быть что-то еще, что вы не показали.   -  person Andy Wilkinson    schedule 01.08.2017
comment
Интересно, что перед публикацией вопроса я проверил точный код, который вы отправили, чтобы увидеть, как он работает: он также возвращает 500.   -  person Rad    schedule 01.08.2017
comment
@Rad, не могли бы вы найти какое-нибудь решение? У меня точно такая же проблема. Использование весенней загрузки 1.5.6   -  person Suresh    schedule 18.08.2017
comment
Нет. Мне пришлось обрабатывать это напрямую, используя объект запроса/ответа :(   -  person Rad    schedule 21.08.2017


Ответы (2)


Вы можете использовать Консультации контроллера. Аннотация Spring @ControllerAdvice — это специализированная форма @Component, которая существует для решения сквозных проблем для контроллеров. Наиболее распространенный вариант использования — предоставить обработчики исключений, но он также может делать несколько других полезных вещей.

@ControllerAdvice
public class ExceptionControllerAdvice {

    @ExceptionHandler(Exception.class)
    public ModelAndView exception(Exception e) {
        ModelAndView mav = new ModelAndView("exception");
        mav.addObject("name", e.getClass().getSimpleName());
        mav.addObject("message", e.getMessage());

        return mav;
    }
}
person Md khirul ashik    schedule 01.08.2017
comment
Спасибо за ответ, но, как указано в вопросе, он не работает, а это означает, что совет контроллера не обрабатывает исключения, создаваемые конечными точками MVC. - person Rad; 02.08.2017
comment
По умолчанию ControllerAdvice будет применяться ко всем классам, использующим аннотацию Controller (которая распространяется на классы, использующие RestController). - person amir bayan; 03.01.2019
comment
@Rad, в конце концов, ты нашел решение этой проблемы, у меня точно такая же проблема - person Temitope Fatayo; 03.05.2020
comment
Нет. Мне пришлось обрабатывать это напрямую, используя объект запроса/ответа :( - person Rad; 03.05.2020

Кажется, ваш Spring не может обнаружить ваше исключение. Таким образом, необходимо создать один класс GlobalException с @ControllerAdvice, а затем поместить в него ваше исключение. Что-то похожее:

public class FooNotFound extends RuntimeException {
    public NotFoundException(String message){
        super(message);
    }
}

@ControllerAdvice
public class GlobalExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(FooNotFound.class)
    @ResponseStatus(value=HttpStatus. NOT_FOUND, reason="Not found")
    public String handleFooNotFound(HttpServletRequest request, Exception ex){
        //'SOME CODE HERE'
        return "user_notfound";
    }
}

Надеюсь, это поможет.

person Kenny Tai Huynh    schedule 17.08.2017
comment
Спасибо за ответ, но, как указано в вопросе, он не работает, а это означает, что совет контроллера не обрабатывает исключения, создаваемые конечными точками MVC. - person Rad; 21.08.2017
comment
Это интересно. Я проверил тот же код, что и ваш, и он отлично работает. :) - person Kenny Tai Huynh; 21.08.2017
comment
Не могли бы вы загрузить проект на GitHub, чтобы я мог сравнить с моим проектом. Спасибо. - person Rad; 22.08.2017
comment
Но это просто обычное весеннее веб-приложение. Это не то, что я пытаюсь сделать. Мой контроллер не обычный, он в контексте управления. Я объяснил это в вопросе. - person Rad; 24.08.2017
comment
Можете ли вы поделиться своим гитхабом текущего выпуска?! Как и в моем предыдущем ответе, каким бы ни был ваш контроллер, просто убедитесь, что @ControllerAdvice действует, и это поможет обернуть исключение. - person Kenny Tai Huynh; 24.08.2017