Java 在Spring Boot中处理rest控制器中的异常
我使用SpringBoot创建RESTWeb服务。 我想知道在控制器中处理异常的更好方法是什么。我看到了其他问题,没有找到答案 我的控制器:Java 在Spring Boot中处理rest控制器中的异常,java,spring,rest,spring-boot,exception,Java,Spring,Rest,Spring Boot,Exception,我使用SpringBoot创建RESTWeb服务。 我想知道在控制器中处理异常的更好方法是什么。我看到了其他问题,没有找到答案 我的控制器: @GetMapping public ResponseEntity<?> saveMyUser(){ MyUser myUser = new MyUser(“Anna”); //throws SQLException MyUserDetails userDetails = userService.saveMyUser(
@GetMapping
public ResponseEntity<?> saveMyUser(){
MyUser myUser = new MyUser(“Anna”);
//throws SQLException
MyUserDetails userDetails = userService.saveMyUser(myUser);
//if successful
return ResponseBody.ok(userDetails);
}
因此,在这一点上,我至少有两个简单的选择:
什么是更好的简单方法 您可以使用
@controlleravice
注释创建一个附加类,稍后您可以为每个异常编写自定义响应逻辑,例如:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler({SQLException.class})
public ResponseEntity<Object> sqlError(Exception ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Some SQL exception occured");
}
}
@ControllerAdvice
公共类GlobalExceptionHandler{
@ExceptionHandler({SQLException.class})
公共响应属性sqlError(异常ex){
返回ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(“发生了一些SQL异常”);
}
}
此外,您还可以扩展和覆盖从异常映射到HTTP响应的默认行为
另外,请注意,它为您的案例保存了非常有用的信息。您可以使用
@controlleravice
注释创建一个附加类,稍后您将能够为每个异常编写自定义响应逻辑,例如:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler({SQLException.class})
public ResponseEntity<Object> sqlError(Exception ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Some SQL exception occured");
}
}
@ControllerAdvice
公共类GlobalExceptionHandler{
@ExceptionHandler({SQLException.class})
公共响应属性sqlError(异常ex){
返回ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(“发生了一些SQL异常”);
}
}
此外,您还可以扩展和覆盖从异常映射到HTTP响应的默认行为
另外,请看一下,它为您的案例提供了非常有用的信息。不要自己处理这些信息。让控制器
中的所有方法抛出异常(您不在乎)。然后用@ExceptionHandler
注释一个方法:您有许多选项:不要抛出SQLExcpetion。这意味着您正在使用普通的JDBC。Iinstead使用已经处理所有这些的jdbctempatte
。另外,Spring Boot将处理JdbcTemplate
引发的DataAccessException
,因为它是一个未经检查的异常(也称为RuntimeException
)。如果您想在此控制器或代码中执行某些特定操作,您可以使用@ExceptionHandler
@spi不想将其作为答案发布?这就是我需要的。谢谢,不要自己处理。让控制器中的所有方法抛出异常(您不在乎)。然后用@ExceptionHandler
注释一个方法:您有许多选项:不要抛出SQLExcpetion。这意味着您正在使用普通的JDBC。Iinstead使用已经处理所有这些的jdbctempatte
。另外,Spring Boot将处理JdbcTemplate
引发的DataAccessException
,因为它是一个未经检查的异常(也称为RuntimeException
)。如果您想在此控制器或代码中执行某些特定操作,您可以使用@ExceptionHandler
@spi不想将其作为答案发布?这就是我需要的。谢谢。但当我尝试从材料中的ResponseEntityExceptionHandler扩展时,控制器方法中的注释@Valid停止向客户端发送信息,只有状态代码。不知道为什么。您的方法工作得很好。但是当我尝试从材料中的ResponseEntityExceptionHandler进行扩展时,控制器方法中的注释@Valid停止向客户端发送信息,只有状态代码。不知道为什么。你的方法很管用。