0

测试我的应用程序我决定关闭数据库。

public Object getEntityById(Class<?> clazz, Object _id) throws PersistenceServiceException {
    Object o = null;
    try {
        o = entityManager.find(clazz, _id);
    } catch (Exception e) {
        throw new PersistenceServiceException(e);
    }
    return o;
}

因此,任何数据库异常都应该传递给调用者

在控制器中我有

    try {
        template = (Template)persistenceService.getEntityById(Template.class, id);
    } catch (PersistenceServiceException e) {
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        response.setStatusMessage("INTERNAL SERVER ERROR");
        response.setData(e);
        return  response;
    }

调试时,我可以看到 DatabaseException 被抛出。

但是在servlet上下文中,一旦我有了这个......

<beans:bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <beans:property name="defaultErrorView" value="core/error.uncatched" />
</beans:bean>

它一直将上述错误视为未处理。

我怎样才能在控制器上捕捉到它?为什么会这样?

例外

ERROR: org.springframework.transaction.interceptor.TransactionInterceptor - **Application exception overridden by commit exception**
com.company.exceptions.PersistenceServiceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.0.v20130619-7d05127): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
4

3 回答 3

0

您应该使用PersistenceException来捕获异常。因为您使用的是 JPA。

于 2013-09-05T07:04:23.880 回答
0

事实是事务上下文抛出了一个 TransactionSystemException(一个 RunTimeException),所以我所做的包装异常再次被 TransactionSystemException 包装。最后一个需要添加到控制器的 catch 子句中。

无论如何,我现在没有将其标记为正确。如果有人想添加一些东西,欢迎。

于 2013-09-05T18:09:52.123 回答
0

堆栈跟踪显示了这两个异常:

内部异常:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障

这意味着数据库无法访问。这是因为您已经关闭了数据库。是有关此异常的讨论。

错误:org.springframework.transaction.interceptor.TransactionInterceptor -应用程序异常被提交异常覆盖

Spring 框架的事务基础结构的默认配置仅在抛出的异常是未经检查的异常时才将事务标记为回滚。如果您已将其定义PersistenceServiceException为已检查异常,则不会导致 Spring 事务回滚。您正在捕获未检查的异常(在您的getEntityById方法中),将其转换为已检查的异常,然后您将抛出此已检查的异常。

PersistenceServiceException要解决这个问题,您可以配置事务基础架构以通过以下方式回滚事务

更改PersistenceServiceException为运行时异常(PersistenceServiceException extends RuntimeException)

或通过注释您的服务

@Transactional(rollbackFor = PersistenceServiceException.class)

于 2013-09-06T03:51:35.950 回答