@ControllerAdvice метод обработчика исключений не вызван

У меня есть класс контроллера

package com.java.rest.controllers;
@Controller
@RequestMapping("/api")
public class TestController {

@Autowired
private VoucherService voucherService;


@RequestMapping(value = "/redeemedVoucher", method = { RequestMethod.GET })
@ResponseBody
public ResponseEntity redeemedVoucher(@RequestParam("voucherCode") String voucherCode) throws Exception {
    if(voucherCode.equals( "" )){
        throw new MethodArgumentNotValidException(null, null);
    }
    Voucher voucher=voucherService.findVoucherByVoucherCode( voucherCode );
    if(voucher!= null){
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Type", "application/json; charset=utf-8");
        voucher.setStatus( "redeemed" );
        voucher.setAmount(new BigDecimal(0));
        voucherService.redeemedVoucher(voucher);
        return new ResponseEntity(voucher, headers, HttpStatus.OK);

    }
    else{
        throw new ClassNotFoundException();
    }
};

}

И для обработки исключений я использую обработчик справки Spring3.2, следуя

package com.java.rest.controllers;


@ControllerAdvice
public class VMSCenteralExceptionHandler extends ResponseEntityExceptionHandler{

@ExceptionHandler({
    MethodArgumentNotValidException.class
})
public ResponseEntity<String> handleValidationException( MethodArgumentNotValidException methodArgumentNotValidException ) {
    return new ResponseEntity<String>(HttpStatus.OK );
}

 @ExceptionHandler({ClassNotFoundException.class})
        protected ResponseEntity<Object> handleNotFound(ClassNotFoundException ex, WebRequest request) {
            String bodyOfResponse = "This Voucher is not found";
            return handleExceptionInternal(null, bodyOfResponse,
              new HttpHeaders(), HttpStatus.NOT_FOUND , request);
        }

}

Я определил определение XML bean как

<context:component-scan base-package="com.java.rest" />

Исключение из контроллера не обрабатывается обработчиком контроллера. У меня много часов в Интернете, но я не могу найти никаких ссылок, почему это происходит. Я следовал, как описано http://www.baeldung.com/2013/01/31/exception-handling-for-rest-with-spring-3-2/ здесь.

Если кто-нибудь знает, пожалуйста, сообщите, почему обработчик не обрабатывает исключение.

Ответ 1

Я нашел решение этой проблемы. Фактически @ControllerAdvice требуется объявление пространства имен MVC в файле XML. Или мы можем использовать @EnableWebMvc с аннотацией @ControllerAdvice.

Ответ 2

У меня была схожая проблема.

Удалось исправить это в сентябре 2017 года.

Мое дело было в том, что обработчик Exception был в своем собственном пакете com.example.Exceptions, и проблема была в том, что он не был отсканирован Spring ComponentScan.

Решение состоит в том, чтобы добавить его в ComponentScan следующим образом:

@ComponentScan({ "x.y.z.services", "x.y.z.controllers", "x.y.z.exceptions" })

Ответ 3

public class VMSCenteralExceptionHandler implements HandlerExceptionResolver {
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    }
}

и добавьте bean в свой файл config.xml

<bean class="com.java.rest.controllers.VMSCenteralExceptionHandler " />

Ответ 4

Вам просто нужно выполнить следующие два шага:

  • Добавить @ControllerAdvice поверх глобального класса обработчика исключений.
  • Добавьте имя пакета для класса исключений в компонент-сканирование i.e.

    <context:component-scan base-package="com.hr.controller,com.hr.exceptions" />

Ответ 5

Я думаю, проблема в том, что ваш метод контроллера выбрасывает Exception, но ваши методы @ControllerAdvice обнаруживают определенные исключения. Либо совместите их с одним обработчиком, который ловит Exception, или заставляет ваш контроллер выбрасывать те особые исключения.

Итак, ваша подпись метода контроллера должна быть:

public ResponseEntity redeemedVoucher(@RequestParam("voucherCode") String voucherCode) throws MethodArgumentNotValidException, ClassNotFoundException;

ИЛИ ваш советник может иметь только один метод с аннотацией:

@ExceptionHandler({
    Exception.class
})