gpt4 book ai didi

spring-data - 从测试运行时如何在 Spring-Data 中启用异常翻译?

转载 作者:行者123 更新时间:2023-12-01 06:33:21 26 4
gpt4 key购买 nike

我正在使用 Spring-Data 并希望让 PersistenceExceptions翻译成斯普林斯 DataAccessExceptions .

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

据我了解documentation命名空间声明 <jpa:repositories>激活注解为 @Repository 的 Bean 的持久性异常转换. Java 配置 ( @EnableJpaRepositories ) 也是这种情况吗?

这是否意味着,我必须用 @Repository 注释我的 Spring-Data 存储库接口(interface)还是使用如上所述配置的 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();
}
}

最佳答案

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

根据 PersistenceExceptionTranslationPostProcessor文档:

All of Spring's applicable resource factories (e.g. LocalContainerEntityManagerFactoryBean) implement the PersistenceExceptionTranslator interface out of the box.



我的配置...
@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() { ... }

关于spring-data - 从测试运行时如何在 Spring-Data 中启用异常翻译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18014568/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com