12

我有以下控制器类

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/的描述进行了操作。

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

4

5 回答 5

11

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

于 2013-05-16T11:42:37.060 回答
4

我有类似的问题。

在 2017 年 9 月设法修复它。

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

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

@ComponentScan({ "x.y.z.services", "x.y.z.controllers", "x.y.z.exceptions" })
于 2017-10-09T12:59:57.580 回答
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 " />
于 2013-05-16T14:23:32.187 回答
0

您只需要执行以下 2 个步骤:

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

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

于 2016-11-23T10:32:54.853 回答
-1

我认为问题可能是您的控制器方法抛出Exception但您的@ControllerAdvice方法捕获特定异常。要么将它们组合成一个可以捕获的处理程序Exception,要么让你的控制器抛出那些特定的异常。

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

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

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

@ExceptionHandler({
    Exception.class
})
于 2013-05-16T08:37:18.123 回答