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传播到其他层
这种异常处理方法正确吗
我应该在所有层中记录异常,还是在控制器的末尾记录异常
我正在抓拍
PersistenceException
并重新播放DBException
。既然DBException
是一个RuntimeException
,我认为spring事务应该在发生异常时回滚吗
谢谢
# 1 楼答案
是的,永远不要将特定于层的异常传播到它上面的层。如果您希望数据层的客户端从异常中恢复,那么创建一个新的自定义检查异常,并将其从save方法中的catch块中抛出
应该只在一个地方进行日志记录,因为多个级别的日志记录可能会让程序员在检查堆栈跟踪时混淆异常的原始来源。在这种情况下,我认为最好将SQLException记录在save方法的catch块中,因为您正在重新引发RuntimeException,save方法的调用方可能不一定会捕获异常并记录它
是的,Spring事务在运行时异常的情况下回滚。这是因为调用方代码在RuntimeException情况下不能做很多事情,因为它表示不可恢复的条件。这种行为在Docs中定义
更多关于异常处理的最佳实践here