Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection 您可以在持久性实体中使用依赖项注入吗?_Dependency Injection_Guice_Cdi_Datanucleus - Fatal编程技术网

Dependency injection 您可以在持久性实体中使用依赖项注入吗?

Dependency injection 您可以在持久性实体中使用依赖项注入吗?,dependency-injection,guice,cdi,datanucleus,Dependency Injection,Guice,Cdi,Datanucleus,我希望将依赖注入引入到我的持久实体中,但我不确定如何实现 GWT应用程序中的salted哈希算法需要Base64实现。GWT附带了一个旧版本的commons编解码器。由于名称冲突—我不使用Maven—我可以找出如何使用旧的实现,或者使用另一个实现,例如Base64.iharder.net 在调整了几个备选方案之后,我为每个方案创建了一个接口和适配器类。我注入了一个实现。这似乎是一个经典的用例 创建持久实体时,一切都运行良好。但是,在存储和检索这些字段之后,以前注入的字段和未持久化的字段将使用空值

我希望将依赖注入引入到我的持久实体中,但我不确定如何实现

GWT应用程序中的salted哈希算法需要Base64实现。GWT附带了一个旧版本的commons编解码器。由于名称冲突—我不使用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
  }
}

持久实体的生命周期通常与托管bean的生命周期解耦。这就是为什么不鼓励在JPA管理的实体中使用DI/CDI的原因

根据这一定义,JPA实体在技术上受到管理 豆。但是,实体有其特殊的生命周期、状态和时间 身份模型,通常由JPA或使用new实例化。 因此,我们不建议直接注入实体类。我们 特别建议不要指定@Dependent以外的作用域 对于实体类,因为JPA不能持久化注入的CDI 代理

我认为情况与DataNucleus类似。尤其是这个

如何要求持久性框架重新注入依赖项 从数据存储检索对象时

。。。这可能相当棘手,因为依赖关系在某些星座(读:scopes)中是代理的,但在其他星座中是直接注入的


我的猜测是,如果您以实体不依赖DI的方式重新设计您的模型,那么会容易得多。

谢谢,@Jan。在考虑了您的评论(这让我想到了关键搜索词CDI、“weld”和托管bean)后,我得出结论,我的设计模式并不常见。我现在只使用带有setter和getter的轻量级bean。我将逻辑转移到单独的“处理器”类中。整个过程似乎不是很面向对象,但处理器类现在是可测试的。再次感谢你。