【问题标题】:Spring DAO exception translation inside transaction事务中的 Spring DAO 异常翻译
【发布时间】:2012-08-27 10:55:12
【问题描述】:

我正在使用 Spring 3.1.2Hibernate 4

我有一个带有 @Repository 注释的 DAO 实现类 MyDaoImpl,以便启用异常翻译。我有一个服务类MyService@Transactional 注释如下:

public class MyService implements IMyService {

    private MyDao myDao;

    @Autowired
    public void setMyDao(MyDao dao) {
       this.myDao = dao;
    }

    @Override
    @Transactional
    public void createA(String name)
    {
        A newA = new A(name);
        this.myDao.saveA(newA);
    }
}

我写了一个单元测试类MyServiceTest如下:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:beans.xml" })
@Transactional
@TransactionConfiguration(defaultRollback = true)
public class MyServiceTest implements IMyServiceTest {

    private IMyService myService;

    private SessionFactory sessionFactory;

    @Autowired
    public void setMyService(IMyService myService)
    {
        this.myService = myService;
    }

    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory)
    {
        this.sessionFactory = sessionFactory;
    }

    @Test
    @Override
    public void testCreateA()
    {
       //Assume that there is already a row of table A with the name "A1"
       //so I expect to get a Spring DataAccessException (or subtypes) 
       //when the session is flushed
       this.myService.createA("A1");

       this.sessionFactory.getCurrentSession().flush();

       //asserts
    }
}

当我运行测试时,我得到一个 Hibernate 特定异常ConstraintViolationException。我在论坛上发现这是因为翻译系统发生在事务之外,所以在这种情况下testCreateA()返回之后。我不知道这是否是真正的原因,但如果是,则意味着我无法测试翻译是否适用于我的 DAO。一种解决方案是从我的单元测试中删除 @Transactional 注释,但我不会从回滚功能中受益。

你有什么建议?


编辑:我已将在我的上下文中声明的 SessionFactory 添加到测试类中,以便我可以访问当前会话以进行刷新。

一些额外的解释:在这种情况下,当会话被刷新时(在事务内部),我得到了异常。我刷新会话以避免误报,正如文档中所解释的那样。此外,由于默认传播是必需的,testCreateA() 事务也用于对createA() 的调用,因此在testCreateA() 返回之前(通常)不会刷新更改。

【问题讨论】:

    标签: java spring exception dao


    【解决方案1】:

    你添加PersistenceExceptionTranslationPostProcessor bean 定义了吗?喜欢

       <!--
            Post-processor to perform exception translation on @Repository classes
            (from native exceptions such as JPA PersistenceExceptions to
            Spring's DataAccessException hierarchy).
        -->
        <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
    

    来自Spring doc

    自动应用持久性异常的 Bean 后处理器 翻译成任何带有@Repository注解的bean,添加 对应的PersistenceExceptionTranslationAdvisor 暴露 代理(现有的 AOP 代理或新生成的代理) 实现了目标的所有接口)。

    将本机资源异常转换为 Spring 的 DataAccessException 等级制度。自动检测实现 PersistenceExceptionTranslator 接口,后续询问 翻译候选异常

    【讨论】:

    • 我在文档 static.springsource.org/spring/docs/3.1.x/… 中没有看到这个。你确定它仍然相关吗?
    • @Mickael:AFAIK @Repository 表示用于异常翻译的类,PersistenceExceptionTranslationPostProcessor 执行翻译任务。检查我的编辑。
    • 我已经编辑了我的问题。添加后处理器并不能解决我的问题,我仍然在测试用例中遇到 Hibernate 特定异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2011-08-27
    • 2015-04-14
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多