【问题标题】:Can you use dependency injection in persistent entities?你可以在持久实体中使用依赖注入吗?
【发布时间】: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


    【解决方案1】:

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

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

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

    如何让我的持久性框架重新注入依赖项 从数据存储中检索对象时?

    ... 可能相当棘手,因为依赖项在某些星座(阅读:范围)中被代理,但直接在其他星座中注入。

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

    【讨论】:

    • 谢谢你,@Jan。在考虑了您的 cmets(这使我找到了关键搜索词 CDI、“焊接”和托管 bean)之后,我得出结论,我的设计模式并不常见。我现在只使用带有 setter 和 getter 的轻量级 bean。我将逻辑移动到单独的“处理器”类中。整个事情看起来不是很面向对象,但是处理器类现在是可测试的。再次感谢您。
    猜你喜欢
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多