- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我使用 @EntityListeners
在保存到 Db 之前和加载之后进行操作。在我的 Listener 类中,我调用了一个 Ecryptor
(它需要从配置文件中获取信息),因此不能静态调用加密器,需要将其注入(inject)到我的 Listener 中。对吧?
嗯,EntityListeners 中的注入(inject)不能立即完成,但您有一些方法可以做到这一点,例如使用 SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
甚至这里显示的方法。 https://guylabs.ch/2014/02/22/autowiring-pring-beans-in-hibernate-jpa-entity-listeners/
太好了,问题是:没有一个解决方案支持单元测试!在运行测试时,我在模型监听器中注入(inject)的加密器始终为 null
。
在这里SpringBeanAutowiringSupport does not inject beans in jUnit tests有一个创建此上下文并传递给实例化对象的解决方案,但它没有解决我的问题,因为我有“注入(inject)”要添加到它。
有什么方法可以在我的测试中创建上下文并以某种方式将其传递给我的听众?如果没有,我可以通过任何方式为我的加密器创建一个静态方法,并且仍然可以访问环境 API 来读取我的属性?
包监听器:
public class PackageListener{
@Autowired
Encryptor encryptor;
@PrePersist
public void preSave(final Package pack){
pack.setBic(encryptor.encrypt(pack.getBic()));
}
...
我的测试
@Test
@WithuserElectronics
public void testIfCanGetPackageById() throws PackageNotFoundException{
Package pack = packagesServiceFactory.getPackageService().getPackage(4000000002L);
}
打包服务
public Package getPackage(Long id) throws PackageNotFoundException{
Package pack = packageDao.find(id);
if (pack == null) {
throw new PackageNotFoundException(id);
}
return pack;
}
加密器:
public class Encryptor{
private String salt;
public Encryptor(String salt){
this.salt = salt;
}
public String encrypt(String string){
String key = this.md5(salt);
String iv = this.md5(this.md5(salt));
if (string != null) {
return encryptWithAesCBC(string, key, iv);
}
return string;
}
...
最佳答案
您可以创建一个 DemoApplicationContextInitializer
类来将 appliationContext
引用存储在主类的静态属性中。
public class DemoApplicationContextInitializer implements
ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext ac) {
Application.context = ac;
}
}
@SpringBootApplication
public class Application {
public static ApplicationContext context;
public static void main(String[] args) throws Exception {
new SpringApplicationBuilder(Application.class)
.initializers(new DemoApplicationContextInitializer())
.run(args);
}
}
然后您可以在您的实体监听器中访问上下文
public class PackageListener{
//@Autowired
Encryptor encryptor;
@PrePersist
public void preSave(final Package pack){
encryptor = Application.context.getBean(Encryptor.class);
pack.setBic(encryptor.encrypt(pack.getBic()));
}
}
为了在你的 junit 测试中工作,只需像这样在你的测试中添加初始化程序......
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT, classes = Application.class)
@ContextConfiguration(classes = Application.class, initializers = DemoApplicationContextInitializer.class)
public class MyTest {
...
}
它在我的环境中没有任何问题。希望对你也有帮助。
关于java - @EntityListeners 注入(inject) + jUnit 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47590917/
我有一堂这样的课: @Entity @Customizer(value=UsuarioCustomizer.class) @Indexes({ @Index(name="idx_login_s
我有一个带有注释的实体 @EntityListener(MyListener.class) 在 MyListener 类中,我有一个用 注释的方法 @PrePersist 在这个方法中,我是否有在实体
我有一个带有 EmebeddedId 的实体。实体上的实体监听器(加载时去除 Strings 上的空白)按预期被触发,id Embeddable 上的同一监听器根本没有被触发。 我做错了吗?如何修复?
伙计们! 如果我定义一个实体类并用 @MappedSuperclass 注释它和一个 @EntityListener ,在子类中是否还会调用监听器来处理生命周期事件? 例子: @MappedSuper
当我尝试启动服务器 JBoss 7.0 时遇到问题,因为抛出错误。当将entityListiner放在Entity上时会发生这种情况。 是否可以注入(inject)实体监听器? 跟踪: MSC0000
我们有一个仅包含实体和 persistence.xml 的持久性存档。我们有一个包含 ejb 内容的 ejb 模块。 现在,对于特定用例,我们需要添加一个 EntityListener,它可以访问服务
假设我有这个类(class): @EntityListeners({MyListener.class}) class MyClass { String name; String surname
1、简介 1.1 @entitylisteners 官方解释:可以使用生命周期注解指定实体中的方法,这些方法在指定的生命周期事件发生时执行相应的业务逻辑。 简单来说,就是监听实体对象的增删改查
我有一个与 customerBudget 实体有关联的客户。 CustomerEntityListener 将创建一个 customerBudget 实体。 我收到以下错误: IllegalState
我有一个看起来像这样的 JPA 实体。请注意 @EntityListeners 注释: import javax.persistence.EntityListeners; import org.spr
我有一个 Application 对象和一些 Form 对象。每次保存表单时,我想更新Application.lastUpdated。应用程序有一个 EntityListener,我想用它来设置 Ap
我有以下 JPA 实体 - 规则和策略。我希望如此,因此对规则的任何更新都将设置策略的最后修改日期。几个小时后,我发现我无法从 EntityListener 中调用实体管理器。 因此,我的问题是更新规
我已经创建了实体监听器 public class SomeListener { @PrePersist @PreUpdate public void someAction(fi
我正在设计数据库和实体。我需要为某些实体定义共享生命周期操作。 我可以在接口(interface)上注释 @EntityListeners 以便实现该接口(interface)的实体影响吗? @Ent
如上所述 - 如果持久调用失败,我们已经修改了模型,这意味着我们正在使用(现在已修改,但由于异常而实际上并未持久化)模型。如果这是在服务层而不是 EntityListener 中,那么我们实际上可以在
我知道 JSR-000220 Enterprise JavaBeans 3.0 Final Release(持久性)规范指出: “一般来说,可移植应用程序不应调用 EntityManager 或 Qu
我需要在 EntityListener 类中注入(inject) EntityManager,以便我可以对其执行 CRUD 操作。 POJO: @Entity @EntityListner(Audit
我使用 @EntityListeners 在保存到 Db 之前和加载之后进行操作。在我的 Listener 类中,我调用了一个 Ecryptor(它需要从配置文件中获取信息),因此不能静态调用加密器,
我正在尝试构建一个基于Restfull和Jersey1.17的Web服务。部署在Tomcat服务器上。 在我的项目中,我需要使用 hibernate4 来与我的 Oracle 11g XE 数据库进行
我有一个实体监听器,用于查找选定实体的更改。 @PostUpdate @PostPersist void onChange(RhEntity data) { InjectHelper.getI
我是一名优秀的程序员,十分优秀!