【问题标题】:Is Exception handling required in Spring Transaction?Spring Transaction 中是否需要异常处理?
【发布时间】:2012-12-02 18:23:54
【问题描述】:

我对事务的异常处理有疑问。为了清楚地说明我的问题,我想展示我的配置:

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="transactionInterceptor" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager" ref="transactionManager" />
    <property name="transactionAttributeSource">
        <bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource" />
    </property>
</bean>

<bean id="baseService" abstract="true">
    <property name="daoProvider" ref="daoProvider" />
</bean>

<bean id="customerService" parent="transactionInterceptor">
    <property name="target">
        <bean class="com.edfx.adb.service.CustomerService" parent="baseService" />
    </property>
</bean>

<bean id="daoProvider" class="com.edfx.adb.dao.provider.DaoProvider">   
    <property name="customerDao" ref="customerDao" />
</bean>

<bean id="customerDao" class="com.edfx.adb.dao.CustomerDao">
    <constructor-arg value="#{T(com.edfx.adb.persist.entity.Customer)}" />
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

活动的事务类是:

@Transactional
public class CustomerService extends BaseService implements ICustomerService {

    @Transactional(readOnly = true)
    public Customer getCustomerById(String id) {
        return getDaoProvider().getCustomerDao().getCustomerById(id);
    }

    @Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = { Throwable.class })
    public void addNewCustomer(CustomerDTO customerDTO) {
        Customer customer = new Customer();

        customer.setCustomerId(customerDTO.getCustomerId());
        customer.setCustomerName(customerDTO.getCustomerName());
        customer.setActive(customerDTO.isActive());

        getDaoProvider().getCustomerDao().save(customer);
    }
}

我的疑惑在于方法addNewCustomer。我已经设置了rollbackFor = { Throwable.class }

它是如何工作的?

我还需要显式处理以下异常:

@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = { Throwable.class })
public boolean addNewCustomer(CustomerDTO customerDTO) {
    Customer customer = new Customer();

    customer.setCustomerId(customerDTO.getCustomerId());
    customer.setCustomerName(customerDTO.getCustomerName());
    customer.setActive(customerDTO.isActive());

    try {
        getDaoProvider().getCustomerDao().save(customer);
    } catch (Throwable throwable) {
        return false;
    }

    return true;
}

我通过从客户表中删除一列强制创建了一个异常,但该异常没有在 try-catch 块中捕获,而是我可以从调用 addNewCustomer 的托管 bean 中捕获该异常方法。

【问题讨论】:

    标签: java spring exception-handling transactions


    【解决方案1】:

    这是 Spring 文档的摘录

    在其默认配置中,Spring 框架的事务 基础设施代码仅在情况下标记事务以进行回滚 运行时,未经检查的异常;也就是当抛出异常 是 RuntimeException 的实例或子类。 (错误也会 - 通过 默认 - 导致回滚)。抛出的检查异常 来自事务方法不会导致默认回滚 配置。

    您设置 rollbackFor = Throwable.class,现在 Spring 将回滚任何异常/错误。默认情况下,不管我们喜不喜欢,Spring 只会对 RuintimeException 进行回滚,否则提交

    【讨论】:

    • 强制我通过从客户表中删除一列创建了一个异常,但是该异常没有在 try-catch 块中捕获,而是我可以从我拥有的托管 bean 中捕获该异常调用了addNewCustomer 方法。
    • 实际上在您的具体情况下 rollbackFor = Throwable.class 没有任何意义,因为 addNewCustomer 不能抛出任何已检查的异常,因为它没有声明任何异常,并且默认情况下会捕获 RuntimeExceptions。
    • 感谢您的解释。请问,spring的xml配置好不好?
    • 似乎还可以。但我建议你看看static.springsource.org/spring-data/data-jpa/docs/current/…,以防你还没有。使用数据库的新方法。
    • @Evgeniy Dorofeev-this 链接您在此答案的最新评论中提到的哪个版本的 Spring?我觉得很有趣。我尝试过使用 Spring 3.0.2 版,但没有与此版本相关的类或接口。请告诉我。我非常渴望使用这种方法。
    【解决方案2】:

    Spring 框架只抛出 RuntimeExceptions,从技术上讲,您永远不必捕获任何异常。

    【讨论】:

    • 谢谢。 spring的xml配置是不是没问题? hibernate 的保存方法会引发 Hibernate 异常。我不需要处理吗?
    • 我没有遇到任何异常。我正在编写代码,同时我对异常处理感到好奇。我正在努力使我的代码没有错误。
    • 不知何故,我可以通过删除客户表中的列来引发异常。但奇怪的是无法处理异常。
    猜你喜欢
    • 1970-01-01
    • 2012-01-24
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 2021-05-31
    相关资源
    最近更新 更多