处理Spring REST中的错误情况

时间:2017-12-01 04:22:25

标签: spring rest spring-mvc exception-handling

恕我直言的例外情况适用于特殊情况。如果可以毫无例外地处理场景,则不应抛出异常。

创建异常需要至少1毫秒,并且会带来性能影响。那么处理错误情况的最佳方法是哪种?

场景#1:

ResponseEntity createOrder(@RequestBody Order order){
 if(order.items == null)
   return ResponseEntity.badRequest().build();
 ...
}

方案#2: Spring提供了Error Handling for REST with Spring

中提到的@ControllerAdvice和ResponseEntityExceptionHandler
ResponseEntity createOrder(@RequestBody Order order){
     if(order.items == null)
       throw new CustomException();
     ...
    }

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value = { CustomException.class })
    protected ResponseEntity<Object> handleConflict(RuntimeException ex, WebRequest request) {
        String bodyOfResponse = "Error";
        return handleExceptionInternal(ex, bodyOfResponse, 
          new HttpHeaders(), HttpStatus.BAD_REQUEST, request);
    }
}

2 个答案:

答案 0 :(得分:1)

我个人会选择场景#2,因为它是集中的。稍后您可以更改该特定异常的响应代码或添加一些详细日志记录。在性能方面,#1显然更快,但我会忽略时差

答案 1 :(得分:0)

嗯,在特定情况下,我会使用Hibernate进行验证,而不是让无效数据进入控制器开始。

 public class Order {
 ...
     @NotNull
     @NotEmpty
     private List<Integer> items;
 }

对于案例项,它将自动创建400错误为空或为空(但内部使用异常)。

要处理其他异常,我会使用@ExceptionHandler,无论是每个控制器还是通过@ControllerAdvice(全局捕获)。

  

创建例外需要至少1毫秒

例外情况很慢,但速度并不慢。