@ExceptionHandler(Exception.class)不处理所有类型的异常

时间:2018-06-06 14:31:09

标签: java spring spring-boot exception-handling

我正在尝试使用@ExceptionHandler(Exception.class)处理所有类型的异常。但它并没有处理所有类型的异常。

当我尝试从邮递员/浏览器访问错误的HTTP方法时,我没有得到任何响应空白页面即将到来。

可以请任何人告诉我为什么我没有得到任何回复或告诉我我的代码是否做错了什么?

    @Order(Ordered.HIGHEST_PRECEDENCE)
    @ControllerAdvice
    public class RestExceptionHandler extends ResponseEntityExceptionHandler {


        @ExceptionHandler(Exception.class)
        public ResponseEntity<ExceptionMessage> handleAllExceptionMethod(Exception ex,WebRequest requset,HttpServletResponse res) {


            ExceptionMessage exceptionMessageObj = new ExceptionMessage();

            exceptionMessageObj.setStatus(res.getStatus());
            exceptionMessageObj.setError(ex.getLocalizedMessage());     
            exceptionMessageObj.setException(ex.getClass().getCanonicalName());
            exceptionMessageObj.setPath(((ServletWebRequest) requset).getRequest().getServletPath());  

            return new ResponseEntity<ExceptionMessage>(exceptionMessageObj, new HttpHeaders(), HttpStatus.INTERNAL_SERVER_ERROR);          
        } 

3 个答案:

答案 0 :(得分:3)

覆盖ResponseEntityExceptionHandler#handleExceptionInternal()或不延长ResponseEntityExceptionHandler

@Order(Ordered.HIGHEST_PRECEDENCE)上的@ControllerAdvice应该在根据this answer调用ResponseEntityExceptionHandler之前工作,这表明需要Spring Framework 4.3.7。

答案 1 :(得分:1)

这将处理从控制器方法中引发的异常。

如果发送没有映射的请求,则根本不会调用控制器方法,因此在这种情况下@ExceptionHandler将会过时。

也许有关创建自定义处理程序的文章可能有所帮助:article

答案 2 :(得分:0)

使用RequestMapping,您可以为每个Http代码创建不同的响应。在这个例子中,我将展示如何控制错误并相应地给出响应。

这是具有服务规范的RestController

@RestController
public class User {

    @RequestMapping(value="/myapp/user/{id}", method = RequestMethod.GET)
    public ResponseEntity<String> getId(@PathVariable int id){

        if(id>10)
            throw new UserNotFoundException("User not found");

        return ResponseEntity.ok("" + id);
    }

    @ExceptionHandler({UserNotFoundException.class})
    public ResponseEntity<ErrorResponse> notFound(UserNotFoundException ex){

        return new ResponseEntity<ErrorResponse>(
            new ErrorResponse(ex.getMessage(), 404, "The user was not found") , HttpStatus.NOT_FOUND);
    }
}

在getId方法中,如果customerId&lt; 10它应该响应客户ID作为正文消息的一部分,但是当客户大于10时应该抛出异常,在这种情况下服务应该响应ErrorResponse。

public class ErrorResponse {

    private String message;
    private int code;
    private String moreInfo;

    public ErrorResponse(String message, int code, String moreInfo) {
        super();
        this.message = message;
        this.code = code;
        this.moreInfo = moreInfo;
    }

    public String getMessage() {

        return message;
    }

    public int getCode() {

        return code;
    }

    public String getMoreInfo() {

        return moreInfo;
    }
}

最后我使用了一个特定的Exception来查找“Not Found”错误

public class UserNotFoundException extends RuntimeException {

    public UserNotFoundException(String message) {
        super(message);
    }
}