4

我正在使用 Spring-Data 并希望将PersistenceExceptions其翻译为 Springs DataAccessExceptions

我用它激活了 Spring-Data,@EnableJpaRepositories我可以看到,它org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0是在启动期间由 Spring 加载的。APersistenceExceptionTranslator也可以。

据我了解的文档命名空间声明<jpa:repositories>激活 Beans 注释的持久性异常翻译@Repository。Java配置(@EnableJpaRepositories)也是这种情况吗?

这是否意味着,我必须@Repository使用上面提到的配置的 Spring Data 来注释我的 Spring-Data 存储库接口,或者它是可选的?

这是界面:

@Repository
public interface DemoDao extends JpaRepository<Demo, Long> {}

这是测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestDaoWithEmbeddedDatabaseConfiguration.class})
@Transactional
public class DemoTest {

    @Test(expected = DataAccessException.class)
    public void testFindByTransactionStatus() throws Exception {
        persistDemoDataWithUniqueConstraintError(); // this calls DemoDao#save()
    }
}

这会产生:

javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException

我不知道如何启用异常翻译。有任何想法吗?

编辑1:

这是测试配置和 Spring 设置:

@Configuration
@ComponentScan("com.demo.dao")
@EnableJpaRepositories("com.demo.dao")
@EnableTransactionManagement
public class TestDaoWithEmbeddedDatabaseConfiguration {
    // DataSource (EmbeddedDatabaseBuilder), EntityManagerFactory @Bean configuration

    @Bean
    public PersistenceExceptionTranslator persistenceExceptionTranslator() {
        return new HibernateExceptionTranslator();
    }
}
4

1 回答 1

0

我发现持久性异常翻译是默认的,使用 Spring 4.1.5.RELEASE 和 Spring Data JPA 1.7.2.RELEASE。

PersistenceExceptionTranslationPostProcessor javadoc

所有 Spring 适用的资源工厂(例如 LocalContainerEntityManagerFactoryBean)都实现了开箱即用的 PersistenceExceptionTranslator 接口。

我的配置...

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef="emfb", ...)
@ComponentScan(...)
public class TestConfig {
    @Bean public LocalContainerEntityManagerFactoryBean emfb() { ... }
    ...
}

...和一个 JUnit4 测试,例如...

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={TestConfig.class})
public class MyTest {
    ...
    @Test public void expectFKViolation() { ... }
    ...
}

...结果是:

Tests in error: expectFKViolation(...): ...; nested exception is org.hibernate.PropertyValueException

Grepping测试输出org.hibernate.PropertyValueException

o.s.t.c.s.DirtiesContextTestExecutionListener - After test method: 
context [ ..., testException = org.springframework.dao.DataIntegrityViolationException: 
not-null ...; nested exception is org.hibernate.PropertyValueException ... ]

在测试方法上设置已翻译的 testException 类型会使测试变为绿色:

@Test(expected="org.springframework.dao.DataIntegrityViolationException.class")
public void expectFKViolation() { ... }
于 2015-03-23T16:27:14.170 回答