Java Spring ExceptionHandler Controller 语法和良好实践

Posted

技术标签:

【中文标题】Java Spring ExceptionHandler Controller 语法和良好实践【英文标题】:Java Spring ExceptionHandler Controller syntax and good practices 【发布时间】:2021-12-02 10:08:16 【问题描述】:

我想在 Spring 中正确处理我的异常,所以我有一个关于 exceptionHandler 语法的问题:如果它们被异常处理程序捕获,是否可以在控制器中抛出特定异常?

更具体地说:

这里是例外:

public class UnknownUserException extends Exception 

    private static final long serialVersionUID = 1L;

    public UnknownUserException(String message) 
        super(message);
    

这里是 ExceptionHandler 和 UnknownUserException 的具体方法:

@ControllerAdvice
@ResponseBody
public class ControllerExceptionHandler 

    @ExceptionHandler(UnknownUserException.class)
    @ResponseStatus(value = HttpStatus.NOT_FOUND)
    public ErrorMessage unknownUserExceptionMessage(UnknownUserException ex, WebRequest request) 
       ErrorMessage message = new ErrorMessage("The user doesn't exist: " +ex.getLocalizedMessage(), ex);
       return message;
      


这是一个可能引发该异常的映射示例:

@GetMapping("/user/id")
    public ResponseEntity<UserProfileDto> getById(@PathVariable Long id) throws UnknownUserException 
            UserProfileDto user = userService.findById(id);
            return ResponseEntity.ok(user);
    

userService.findById(id) 可能会抛出 UnknownUserException。

据我了解,如果服务抛出特定异常,controllerAdvice 会“覆盖”控制器,但是,我应该如何处理我的控制器?我应该再次抛出异常(如上)还是捕获特定异常并返回 ResponseEntity(HttpStatus.NOT_FOUND) ?

【问题讨论】:

【参考方案1】:

在理想情况下,当您知道在您的情况下应该立即抛出异常,因为您提到服务方法将抛出UnknownUserException,这是正确的做法。您的 Controller Advice 应该能够处理该异常。 ContollerAdvice 将处理在请求执行期间抛出的任何匹配异常,无论异常的来源如何。

有关处理异常的其他选项,请参阅this 链接

【讨论】:

感谢您的确认,关于何时抛出/捕获异常,我仍然有点麻烦。 当您有其他服务可供选择时,您应该捕获异常。换句话说,捕获那些对服务请求没有任何影响的异常。例如获取可用书籍的请求,您可以从数据库或缓存中获取书籍列表。如果数据库关闭,您可以从缓存中服务(捕获 db 异常)请求。但请确保在响应中添加信息,表明它不是完整/最新的响应。 我明白了,谢谢,这很有帮助。我还没有为应用程序构建缓存,但这引起了我的注意,所以我现在就查找它,因为实现它是一件有趣且有用的事情。至少,我看到我以正确的方式使用了 catch,因为现在,我只在我的存储服务中捕获 Exception 以返回默认图像,以防在获取我的文件时出错(前面的损坏的 src 非常难看 ^ ^).

以上是关于Java Spring ExceptionHandler Controller 语法和良好实践的主要内容,如果未能解决你的问题,请参考以下文章

java代码怎么配置spring

[Spring实战系列](15)使用Spring基于Java的配置

java [CashierControllerTest] Spring Controller单元测试类#java #spring

Java面试题--Spring篇

java web的 怎么加载spring

Spring