Bean エイリアシングに関するこの投稿のフォローアップとして
プロパティを使用してBean参照を交換する目的で、エイリアスを使用して上記の投稿と同様のことを試みています(文字通り、上記の投稿と同じ目的を念頭に置いています)。
ただし、試してみると、Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'crypto.provider' が発生します。
デリゲートを使用して、この同じプレースホルダーをコンストラクター パラメーターとして渡すと、正常に動作します。以下はコードです
#property file
crypto.provider = safenet
applicationContext.xml
<beans>
<alias name="${crypto.provider}" alias="defaultProvider" />
</beans>
クラス:
@Component ("caesar")
public class CaesarCipherEncryptionProvider implements EncryptionProvider{
//implementation here
}
@Component ("safenet")
public class SafenetEncryptionProvider implements EncryptionProvider{
//implementation here
}
テストケース
public class SafeNetEncryptionProviderTest extends AbstractIntegrationTest {
@Autowired
@Qualifier("defaultProvider") // note: Intellij can't find this bean
private EncryptionProvider provider;
@Test
public void testEncryptDecrypt() throws Exception{
String plaintext = "every.other.email.address.is.shorter.than.this.email.address" +
"@long-email-addresses-incorporated.home-of-the-extra-long-email-addresses.com" +
".just.kidding.this.domain.is.really.German.de";
byte[] plainTextAsBytes = plaintext.getBytes("UTF-8");
byte[] encrypted = provider.encrypt(plaintext);
String decrypted = provider.decrypt(encrypted);
assertFalse(Arrays.equals(plainTextAsBytes, encrypted));
assertEquals(plaintext, decrypted);
}
}