Dbに保存する前とロードした後で、@EntityListeners
を使用して操作を行います。 Listenerクラスの中でEcryptor
(設定ファイルから情報を取得する必要があります)を呼び出すため、暗号化プログラムを静的に呼び出すことができず、Listenerに注入する必要があります。右?@EntityListeners注入+ jUnitテスト
まあ、EntityListenersの注入はすぐにはできませんが、SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
やここに示した方法を使用するなど、いくつかの方法があります。 https://guylabs.ch/2014/02/22/autowiring-pring-beans-in-hibernate-jpa-entity-listeners/
クールで問題は次のとおりです。いずれのソリューションもユニットテストをサポートしていません。私がモデルListenerに注入した暗号化器を実行するテストは、常にnull
です。
ここでSpringBeanAutowiringSupport does not inject beans in jUnit testsこのコンテキストを作成してインスタンス化されたオブジェクトに渡すソリューションがありますが、追加する「注入」があるので問題は解決しません。
私のテストでコンテキストを作成して何とかそれをリスナーに渡す方法はありますか? もしそうでなければ、私は自分の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;
}
Encryptorは:
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;
}
...
「null」の場合は、コンテキストを使用していません。あなたのテストでは、テストで作成されたコンテキストを使用しているのかどうか疑問に思っています(テストで何をしているのかは分かりません)。 –
あなたのコメントのためにありがとう@ M.Deinum、私は私の 'BaseTest'クラスで' @ContextConfiguration(classes = {ApplicationConfiguration.class}) 'を使ってコンテキストを作成しています。 'Encryptor'(EntityListenerから呼び出されたもの)を除いて、すべての注入と設定が正常に動作します –
私が実際にあなたがサービスを取得している方法でそれを使用しているのか疑問に思っています... –