在SpringREST中处理错误场景

在SpringREST中处理错误场景,spring,rest,spring-mvc,exception-handling,Spring,Rest,Spring Mvc,Exception Handling,IMHO例外情况适用于例外情况。如果可以毫无例外地处理场景,则不应引发异常 创建异常至少需要1毫秒,并且会对性能产生影响。那么,处理错误场景的最佳方法是什么 场景#1: ResponseEntity createOrder(@RequestBody Order order){ if(order.items == null) return ResponseEntity.badRequest().build(); ... } 场景#2: Spring提供@ControllerAdvice

IMHO例外情况适用于例外情况。如果可以毫无例外地处理场景,则不应引发异常

创建异常至少需要1毫秒,并且会对性能产生影响。那么,处理错误场景的最佳方法是什么

场景#1:

ResponseEntity createOrder(@RequestBody Order order){
 if(order.items == null)
   return ResponseEntity.badRequest().build();
 ...
}
场景#2: Spring提供@ControllerAdvice和ResponseEntityExceptionHandler,如中所述

ResponseEntity-createOrder(@RequestBody-Order){
if(order.items==null)
抛出新的CustomException();
...
}
@控制器建议
公共类RestResponseEntityExceptionHandler扩展ResponseEntityExceptionHandler{
@ExceptionHandler(值={CustomException.class})
受保护的ResponseEntity handleConflict(RuntimeException ex,WebRequest请求){
字符串bodyOfResponse=“Error”;
返回手柄内部(例如,响应主体,
新的HttpHeaders(),HttpStatus.BAD_请求,请求);
}
}

好吧,在您有的特定情况下,我将使用Hibernate进行验证,而不是让无效数据进入控制器

 public class Order {
 ...
     @NotNull
     @NotEmpty
     private List<Integer> items;
 }
公共类秩序{
...
@NotNull
@空空如也
私人清单项目;
}
当案例项为空或null时,它将自动创建400错误(但内部使用异常)

要处理其他异常,我将使用
@ExceptionHandler
,就像您在那里看到的那样,每个控制器或通过
@ControllerAdvice
(全局捕获)

创建异常至少需要1毫秒


异常很慢,但没有那么慢。

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

输入由业务规则验证,并基于此返回错误状态。我的问题是,我们可以在正常的程序流中自己处理这些错误和验证案例,而不是抛出异常并进行处理。在这种情况下,我仍然更喜欢异常。它允许更好的设计,例如将验证逻辑提取到验证器类中。另一个答案指出,响应格式是集中式的。您是否尝试过使用不带堆栈跟踪的异常?对于这种情况,它们更有效。感谢@xsx4u的建议
 public class Order {
 ...
     @NotNull
     @NotEmpty
     private List<Integer> items;
 }