2012-07-24 69 views
2

我想將持久性實體的依賴注入,但我不知道它是如何做到的。你可以在持久實體中使用依賴注入嗎?

我的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 
    } 
} 

回答

3

持久實體的生命週期通常與託管bean的生命週期分離。這就是爲什麼在JPA管理實體中使用DI/CDI而不鼓勵。

根據這個定義,JPA實體在技術上被管理爲 beans。但是,實體有其特定的生命週期,狀態和身份模型,通常由JPA實例化或使用新的。 因此我們不建議直接注入一個實體類。我們 特別建議不要將@Dependent 以外的作用域分配給實體類,因爲JPA無法持續注入CDI 代理。

我認爲情況與DataNucleus相似。尤其是這...

我怎麼能要求我的持久性框架在從數據存儲中檢索對象時重新注入依賴項 ?

...可能是相當棘手的,因爲依賴關係是在某些星座(代碼:範圍)代理,但直接注入其他人。

我的猜測是,它的更容易如果你重新設計你的模型的方式,實體不依賴DI。

+0

謝謝@an。在考慮了你的意見後(我把它引向了關鍵的搜索術語CDI,「焊接」和託管的豆類),我的結論是我的設計模式並不常見。我現在只使用輕量級豆類和setter和getters。我將邏輯轉移到單獨的「處理器」類中。整個事情似乎並不是面向對象的,但處理器類現在可以測試。再次謝謝你。 – 2012-07-31 21:09:37