有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Spring WebApp中的java JPA异常处理

我正在开发一个SpringWeb应用程序,它有DAO、服务、控制器和视图层。JPA被用于数据库访问。我用于JPA异常处理的方法如下

public class DBException extends RuntimeException {
   implemented constructors to call appropriate RuntimeException constructors.
}

public MyDAOClass {
   public void save(Object object) {
       try {
           entityManager.persist(object);
       }catch(PersistenceException e) {
           throw new DBException("Error occurred in save", e);
       }
   }
}

public class MyServiceClass {
    public void serviceMethod() {
        dao.save(object);
    }
}

public class MyRestController {
    public void controllerMethod() {
        service.save();
    }
    @ExceptionHandler(DBException.class)
    public String handleDBException(DBException e, HttpServletRequest req) {
        implemented code to log & handle exception.
    }

}

我想在异常中获得更多信息,这就是创建自定义DBException的原因,而且我不想将PersistenceException传播到其他层

  1. 这种异常处理方法正确吗

  2. 我应该在所有层中记录异常,还是在控制器的末尾记录异常

  3. 我正在抓拍PersistenceException并重新播放DBException。既然DBException是一个RuntimeException,我认为spring事务应该在发生异常时回滚吗

谢谢


共 (1) 个答案

  1. # 1 楼答案

    Is this correct approach for exception handling ?

    是的,永远不要将特定于层的异常传播到它上面的层。如果您希望数据层的客户端从异常中恢复,那么创建一个新的自定义检查异常,并将其从save方法中的catch块中抛出

    Should I log the exception in all layers or logging it at the end at controller is good ?

    应该只在一个地方进行日志记录,因为多个级别的日志记录可能会让程序员在检查堆栈跟踪时混淆异常的原始来源。在这种情况下,我认为最好将SQLException记录在save方法的catch块中,因为您正在重新引发RuntimeException,save方法的调用方可能不一定会捕获异常并记录它

    I am catching PersistenceException and rethrowing DBException. Since DBException is a RuntimeException I think spring transaction should rollback in event of exception ?

    是的,Spring事务在运行时异常的情况下回滚。这是因为调用方代码在RuntimeException情况下不能做很多事情,因为它表示不可恢复的条件。这种行为在Docs中定义

    更多关于异常处理的最佳实践here