Я использую @EntityListeners
для выполнения операций перед тем, как сохранить в своем Db и после загрузки.
Внутри класса Listener я делаю вызов Ecryptor
(который должен извлекать информацию из файла конфигурации), поэтому шифрование нельзя вызвать статически и нужно ввести в мой Listener. Правильно?
Ну, инъекции в EntityListeners не могут быть выполнены сразу, но у вас есть некоторые способы сделать это, например, используя SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
или даже метод, показанный здесь. https://guylabs.ch/2014/02/22/autowiring-pring-beans-in-hibernate-jpa-entity-listeners/
Прохладный, проблема в том, что ни одно из решений не поддерживает модульное тестирование! При запуске тестов, которые я ввел в мою модель, в качестве хранителя всегда есть null
.
Здесь SpringBeanAutowiringSupport не вставляет beans в тесты jUnit. Существует решение для создания этого контекста и перехода к экземпляру объекта, но он не решает мою проблему так как у меня есть "Инъекция", чтобы добавить к ней.
Любой способ создать контекст в моих тестах и каким-то образом передать его моим слушателям? Если нет, каким-либо образом я могу создать статический метод для моего Encryptor и все еще иметь доступ к 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;
}
...