복붙노트

[SPRING] @ControllerAdvice 예외 핸들러 메소드가 호출되지 않습니다.

SPRING

@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 advice handler를 사용하고있다.

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" />

컨트롤러에서 throw 된 예외는 컨트롤러 조언 처리기에서 처리하지 않습니다. 나는 몇 시간 동안 봤지만 무슨 일이 일어나고 있는지 전혀 언급을 찾을 수 없었다. 나는 http://www.baeldung.com/2013/01/31/exception-handling-for-rest-with-spring-3-2/ 여기에 설명 된대로 따라 갔다.

아무도 모른다면 처리기가 예외를 처리하지 않는 이유를 알려주십시오.

해결법

  1. ==============================

    1.위의 문제에 대한 해결책을 찾았습니다. 실제로 @ControllerAdvice는 XML 파일에서 MVC 네임 스페이스 선언을 필요로합니다. 또는 @ControllerAdvice 주석과 함께 @EnableWebMvc를 사용할 수 있습니다.

    위의 문제에 대한 해결책을 찾았습니다. 실제로 @ControllerAdvice는 XML 파일에서 MVC 네임 스페이스 선언을 필요로합니다. 또는 @ControllerAdvice 주석과 함께 @EnableWebMvc를 사용할 수 있습니다.

  2. ==============================

    2.나는 비슷한 문제가 있었다.

    나는 비슷한 문제가 있었다.

    2017 년 9 월에 그것을 고칠 수 있었다.

    제 사례는 Exception 처리기가 자체 com.example.Exceptions 패키지에 있었고 문제가 Spring의 ComponentScan에 의해 검사되지 않았기 때문입니다.

    해결책은 다음과 같이 ComponentScan에 추가하는 것입니다.

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

    3.

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

    config.xml에 빈을 추가한다.

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

    4.다음 두 단계 만 수행하면됩니다.

    다음 두 단계 만 수행하면됩니다.

  5. ==============================

    5.문제는 아마 귀하의 컨트롤러 메서드가 예외를 throw하지만 귀하의 @ControllerAdvice 메서드가 특정 예외를 잡는 것 같아요. 예외를 포착하는 하나의 핸들러에 이들을 결합하거나 컨트롤러가 이러한 특정 예외를 던지게하십시오.

    문제는 아마 귀하의 컨트롤러 메서드가 예외를 throw하지만 귀하의 @ControllerAdvice 메서드가 특정 예외를 잡는 것 같아요. 예외를 포착하는 하나의 핸들러에 이들을 결합하거나 컨트롤러가 이러한 특정 예외를 던지게하십시오.

    따라서 컨트롤러 메소드 서명은 다음과 같아야합니다.

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

    또는 컨트롤러에 대한 조언에는 주석이있는 방법이 하나만 있어야합니다.

    @ExceptionHandler({
        Exception.class
    })
    
  6. from https://stackoverflow.com/questions/16582411/controlleradvice-exception-handler-method-are-not-get-called by cc-by-sa and MIT license