在SpringREST中处理错误场景
IMHO例外情况适用于例外情况。如果可以毫无例外地处理场景,则不应引发异常 创建异常至少需要1毫秒,并且会对性能产生影响。那么,处理错误场景的最佳方法是什么 场景#1:在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
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;
}