【发布时间】:2012-07-24 19:52:12
【问题描述】:
我想为我的持久实体带来依赖注入,但我不确定如何实现。
我的 GWT 应用程序中的加盐哈希算法需要 Base64 实现。 GWT 附带旧版本的 commons-codec。由于名称冲突(我不使用 Maven),我可以弄清楚如何使用旧版本或使用另一种实现,例如 Base64.iharder.net。
在调整了几个备选方案后,我为每个备选方案创建了一个接口和适配器类。我注入了一个实现。这似乎是一个经典的用例。
创建持久实体后一切正常。然而,在存储和检索它们之后,先前注入但未持久化的字段被实例化为空值。
这个问题很有意义。我使用 DataNucleus,它添加了一个无参数构造函数。 DataNucleus 不会再次注入依赖项。
在从数据存储中检索对象时,如何要求我的持久性框架重新注入依赖项?
谢谢。
// salted hash for password storage
@PersistenceCapable
public class SaltedHash implements Serializable {
private static final long serialVersionUID = 1L;
private String salt;
private String hash;
@NotPersistent
private final Base64Codec base64Codec;
@NotPersistent
private final Sha265Hash sha256Hash;
@NotPersistent
private final Random random;
@Inject
public SaltedHash(Base64Codec b64, Sha256Hash sha256, Random rnd) {
base64Codec = b64;
sha256Hash = sha256;
random = rnd;
}
public void setSecret(String secret) {
salt = base64Codec.encode(generateSalt());
hash = base64Codec.encode(sha256Hash.hash(salt + secret));
}
public boolean matches(String secret) {
String maybe = base64Codec.encode(sha256Hash.hash(salt + secret));
return hash.equals(maybe);
}
private byte[] generateSalt() {
// use random to generate a salt
}
}
【问题讨论】:
标签: dependency-injection guice cdi datanucleus