Dependency injection 您可以在持久性实体中使用依赖项注入吗?
我希望将依赖注入引入到我的持久实体中,但我不确定如何实现 GWT应用程序中的salted哈希算法需要Base64实现。GWT附带了一个旧版本的commons编解码器。由于名称冲突—我不使用Maven—我可以找出如何使用旧的实现,或者使用另一个实现,例如Base64.iharder.net 在调整了几个备选方案之后,我为每个方案创建了一个接口和适配器类。我注入了一个实现。这似乎是一个经典的用例 创建持久实体时,一切都运行良好。但是,在存储和检索这些字段之后,以前注入的字段和未持久化的字段将使用空值实例化 这个问题很有道理。我使用DataNucleus,它添加了一个无参数构造函数。DataNucleus不会再次注入依赖项 从数据存储中检索对象时,如何要求持久性框架重新注入依赖项 多谢各位Dependency injection 您可以在持久性实体中使用依赖项注入吗?,dependency-injection,guice,cdi,datanucleus,Dependency Injection,Guice,Cdi,Datanucleus,我希望将依赖注入引入到我的持久实体中,但我不确定如何实现 GWT应用程序中的salted哈希算法需要Base64实现。GWT附带了一个旧版本的commons编解码器。由于名称冲突—我不使用Maven—我可以找出如何使用旧的实现,或者使用另一个实现,例如Base64.iharder.net 在调整了几个备选方案之后,我为每个方案创建了一个接口和适配器类。我注入了一个实现。这似乎是一个经典的用例 创建持久实体时,一切都运行良好。但是,在存储和检索这些字段之后,以前注入的字段和未持久化的字段将使用空值
// 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
}
}
持久实体的生命周期通常与托管bean的生命周期解耦。这就是为什么不鼓励在JPA管理的实体中使用DI/CDI的原因 根据这一定义,JPA实体在技术上受到管理 豆。但是,实体有其特殊的生命周期、状态和时间 身份模型,通常由JPA或使用new实例化。 因此,我们不建议直接注入实体类。我们 特别建议不要指定@Dependent以外的作用域 对于实体类,因为JPA不能持久化注入的CDI 代理 我认为情况与DataNucleus类似。尤其是这个 如何要求持久性框架重新注入依赖项 从数据存储检索对象时 。。。这可能相当棘手,因为依赖关系在某些星座(读:scopes)中是代理的,但在其他星座中是直接注入的
我的猜测是,如果您以实体不依赖DI的方式重新设计您的模型,那么会容易得多。谢谢,@Jan。在考虑了您的评论(这让我想到了关键搜索词CDI、“weld”和托管bean)后,我得出结论,我的设计模式并不常见。我现在只使用带有setter和getter的轻量级bean。我将逻辑转移到单独的“处理器”类中。整个过程似乎不是很面向对象,但处理器类现在是可测试的。再次感谢你。