我有以下代碼來管理兩種類型的存儲庫。這兩個存儲庫類都繼承了一個接口,以允許重新初始化其資源。類型[...]的不滿意的依賴關係,在注入點使用限定符[@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;
...
}
它的工作。然而,增加@Stateful
到UserRepository
類時,部署失敗,異常一句話:
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的:
- 爲什麼沒有如預期這方面的工作?
UserRepository
var應該已經確定要實例化哪個類,不是嗎?這是什麼邏輯? - 爲什麼
@Stateful
EJB註釋在這裏有如此嚴重的影響?爲什麼它本質上迫使我在var聲明中使用CachingRepository
接口?
注意,我使用Seam 3面使得@ViewScoped
成爲CDI視圖作用域的bean,所以手頭上的問題很可能仍然CDI-只。
哦,順便說一句,這似乎已經在一定程度上回答了這裏之前http://stackoverflow.com/questions/9038815/weld-001408-unsatisfied-dependencies-when-injecting-ejbs-that-implement-interfac,但爲什麼「如果你使用EJB,你不能再使用該實現」?這背後的邏輯是什麼?爲什麼不可能呢?這個慣例似乎存在,但爲什麼呢? – Kawu 2012-04-27 07:25:05
正如我寫的,我看不出有任何意義上,它這一點,我很高興,這是不可能的了,所以我不能幫助但─) – 2012-04-27 09:10:40
你知道你需要'@ Named'當且僅當您需要用於CDI託管bean的JSF訪問?它所做的只是提供一個合格的EL名稱,它不會**向CDI託管bean(由beans.xml完成)創建一個pojo ... – 2012-04-27 11:52:14