[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.위의 문제에 대한 해결책을 찾았습니다. 실제로 @ControllerAdvice는 XML 파일에서 MVC 네임 스페이스 선언을 필요로합니다. 또는 @ControllerAdvice 주석과 함께 @EnableWebMvc를 사용할 수 있습니다.
위의 문제에 대한 해결책을 찾았습니다. 실제로 @ControllerAdvice는 XML 파일에서 MVC 네임 스페이스 선언을 필요로합니다. 또는 @ControllerAdvice 주석과 함께 @EnableWebMvc를 사용할 수 있습니다.
-
==============================
2.나는 비슷한 문제가 있었다.
나는 비슷한 문제가 있었다.
2017 년 9 월에 그것을 고칠 수 있었다.
제 사례는 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) { } }
config.xml에 빈을 추가한다.
<bean class="com.java.rest.controllers.VMSCenteralExceptionHandler " />
-
==============================
4.다음 두 단계 만 수행하면됩니다.
다음 두 단계 만 수행하면됩니다.
-
==============================
5.문제는 아마 귀하의 컨트롤러 메서드가 예외를 throw하지만 귀하의 @ControllerAdvice 메서드가 특정 예외를 잡는 것 같아요. 예외를 포착하는 하나의 핸들러에 이들을 결합하거나 컨트롤러가 이러한 특정 예외를 던지게하십시오.
문제는 아마 귀하의 컨트롤러 메서드가 예외를 throw하지만 귀하의 @ControllerAdvice 메서드가 특정 예외를 잡는 것 같아요. 예외를 포착하는 하나의 핸들러에 이들을 결합하거나 컨트롤러가 이러한 특정 예외를 던지게하십시오.
따라서 컨트롤러 메소드 서명은 다음과 같아야합니다.
public ResponseEntity redeemedVoucher(@RequestParam("voucherCode") String voucherCode) throws MethodArgumentNotValidException, ClassNotFoundException;
또는 컨트롤러에 대한 조언에는 주석이있는 방법이 하나만 있어야합니다.
@ExceptionHandler({ Exception.class })
from https://stackoverflow.com/questions/16582411/controlleradvice-exception-handler-method-are-not-get-called by cc-by-sa and MIT license