@ControllerAdvice异常处理程序方法未被调用

时间:2013-05-16 08:24:01

标签: spring spring-mvc

我有以下控制器类

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/所述进行了跟踪。

如果有人知道,请告诉我们为什么处理程序不处理异常。

5 个答案:

答案 0 :(得分:12)

我找到了上述问题的解决方案。实际上@ControllerAdvice需要XML文件中的MVC名称空间声明。或者我们可以将@EnableWebMvc与@ControllerAdvice注释一起使用。

答案 1 :(得分:3)

我有类似的问题。

管理在2017年9月修复它。

我的情况是Exception处理程序在它自己的com.example.Exceptions包中,问题是它没有被Spring ComponentScan扫描。

解决方案是将其添加到ComponentScan中,如下所示:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您只需执行以下两个步骤:

  1. 在全局异常处理程序类之上添加 @ControllerAdvice
  2. 在组件扫描中添加例外类的包名称,即

      

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

答案 4 :(得分:-1)

我认为问题可能是您的控制器方法抛出Exception,但您的@ControllerAdvice方法会捕获特定的异常。将它们组合成一个捕获Exception的处理程序,或者使控制器抛出这些特定的异常。

所以你的控制器方法签名应该是:

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

或者您的控制器建议应该只有一个带注释的方法:

@ExceptionHandler({
    Exception.class
})