我想为我的持久实体带来依赖注入,但我不确定如何做到这一点。
我的 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
}
}