2012-04-27 38 views
11

我有以下代碼來管理兩種類型的存儲庫。這兩個存儲庫類都繼承了一個接口,以允許重新初始化其資源。類型[...]的不滿意的依賴關係,在注入點使用限定符[@Default](使用@Stateful EJB和CDI)

public interface CachingRepository 
{ 
    public void invalidateCache(); 
} 

全球,應用程序作用域回購:

@Named("globalRepo") 
@ApplicationScoped 
public class GlobalRepository implements CachingRepository 
{ 
    private List<Category> categories; 

    ... 

    @Override 
    public void invalidateCache() 
    { 
     categories = null; 
    } 

    ... 
} 

每用戶,會話範圍回購:

@Named("userRepo") 
@SessionScoped 
//@Stateful   // <- NOTE HERE 
public class UserRepository implements CachingRepository, Serializable 
{ 
    private List<MyFile> files; 

    @Override 
    public void invalidateCache() 
    { 
     files = null; 
    } 

    ... 
} 

在注入這個(不@Stateful)插入上下文

@Named 
@ViewScoped 
public class MyHandler implements Serializable 
{ 
    @Inject 
    private UserRepository userRepo; 

    ... 
} 

它的工作。然而,增加@StatefulUserRepository類時,部署失敗,異常一句話:

Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [UserRepository] with qualifiers [@Default] at injection point [[field] @Inject private de.company.project.pack.MyHandler.userRepo] 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:275) 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:244) 
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:107) 
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:127) 
    at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:346) 
    at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:331) 
    at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:366) 
    at org.jboss.as.weld.WeldContainer.start(WeldContainer.java:83) 
    at org.jboss.as.weld.services.WeldService.start(WeldService.java:76) 
    ... 5 more 

添加CDI bean的名字一樣

@Inject @Named("userRepo") 
private UserRepository userRepo; 

導致相同的異常。在與@Stateful一起工作的唯一一件事就是使用該接口在var聲明:

@Inject @Named("userRepo") 
private CachingRepository userRepo; 

我可能需要在此子類的功能。不過,這樣使用CachingRepository是不是真正需要的(目前)。

Q的

  1. 爲什麼沒有如預期這方面的工作? UserRepository var應該已經確定要實例化哪個類,不是嗎?這是什麼邏輯?
  2. 爲什麼@Stateful EJB註釋在這裏有如此嚴重的影響?爲什麼它本質上迫使我在var聲明中使用CachingRepository接口?

注意,我使用Seam 3面使得@ViewScoped成爲CDI視圖作用域的bean,所以手頭上的問題很可能仍然CDI-只

+0

哦,順便說一句,這似乎已經在一定程度上回答了這裏之前http://stackoverflow.com/questions/9038815/weld-001408-unsatisfied-dependencies-when-injecting-ejbs-that-implement-interfac,但爲什麼「如果你使用EJB,你不能再使用該實現」?這背後的邏輯是什麼?爲什麼不可能呢?這個慣例似乎存在,但爲什麼呢? – Kawu 2012-04-27 07:25:05

+0

正如我寫的,我看不出有任何意義上,它這一點,我很高興,這是不可能的了,所以我不能幫助但─) – 2012-04-27 09:10:40

+0

你知道你需要'@ Named'當且僅當您需要用於CDI託管bean的JSF訪問?它所做的只是提供一個合格的EL名稱,它不會**向CDI託管bean(由beans.xml完成​​)創建一個pojo ... – 2012-04-27 11:52:14

回答

9

我有同樣的問題,這個誤導的異常...

通過增加@StatefulUserRepository你暴露CachingRepository接口的EJB方法,而不必宣稱沒有接口視圖。將@LocalBean添加到UserRepository以激活無界面視圖。請參閱EJB 3.1規範第4.9.8「會話Bean的無接口視圖」

bean類必須指定,它暴露了通過其bean類定義或部署描述符無接口視圖。以下規則適用:

  • ...
  • 如果bean公開至少一個其他客戶端來看,豆 指定,它通過在該 @LocalBean註釋的方式暴露了一個無接口視圖bean類或部署 描述符。
  • ...

我還指this stackoverflow回答有關無接口視圖的詳細信息。

+0

不錯,正是我需要的,謝謝! – Kawu 2012-05-01 03:45:57

+1

我沒有任何EJB。我甚至沒有在我的代碼中的任何地方使用任何@Default註釋。但在Wildfly啓動時仍然會拋出這個異常。我搜查了很多,但每個人都在談論EJB。 – Sujoy 2017-07-03 14:32:21

相關問題