Java 在Spring Boot中处理rest控制器中的异常

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(

我使用SpringBoot创建RESTWeb服务。 我想知道在控制器中处理异常的更好方法是什么。我看到了其他问题,没有找到答案

我的控制器:

@GetMapping
public ResponseEntity<?> saveMyUser(){
    MyUser myUser = new MyUser(“Anna”);

    //throws SQLException
    MyUserDetails userDetails = userService.saveMyUser(myUser);

    //if successful
    return ResponseBody.ok(userDetails);
}
因此,在这一点上,我至少有两个简单的选择:

  • 将异常添加到方法签名。 在这里,我可以依靠SpringBoot将有关异常和状态代码的所有信息传递给客户机。然而,我不知道这是否是一种可靠的方法

  • 用try/catch环绕并手动传递有关异常的所有信息


  • 什么是更好的简单方法

    您可以使用
    @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停止向客户端发送信息,只有状态代码。不知道为什么。你的方法很管用。