Kaw*_*awu 16 java cdi seam3 ejb-3.0 java-ee-6
我有以下代码来管理两种存储库.两个存储库类都继承一个接口以允许重新初始化其资源.
public interface CachingRepository
{
public void invalidateCache();
}
Run Code Online (Sandbox Code Playgroud)
全局,应用程序范围的回购:
@Named("globalRepo")
@ApplicationScoped
public class GlobalRepository implements CachingRepository
{
private List<Category> categories;
...
@Override
public void invalidateCache()
{
categories = null;
}
...
}
Run Code Online (Sandbox Code Playgroud)
每个用户,会话范围的回购:
@Named("userRepo")
@SessionScoped
//@Stateful // <- NOTE HERE
public class UserRepository implements CachingRepository, Serializable
{
private List<MyFile> files;
@Override
public void invalidateCache()
{
files = null;
}
...
}
Run Code Online (Sandbox Code Playgroud)
将此(不@Stateful)注入上下文时
@Named
@ViewScoped
public class MyHandler implements Serializable
{
@Inject
private UserRepository userRepo;
...
}
Run Code Online (Sandbox Code Playgroud)
有用.但是,在添加@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
Run Code Online (Sandbox Code Playgroud)
添加CDI bean的名称就像
@Inject @Named("userRepo")
private UserRepository userRepo;
Run Code Online (Sandbox Code Playgroud)
导致同样的例外.唯一可行的方法@Stateful是在var声明中使用接口:
@Inject @Named("userRepo")
private CachingRepository userRepo;
Run Code Online (Sandbox Code Playgroud)
我可能在这里需要子类功能,所以使用CachingRepository并不是真正需要的(目前).
问:
UserRepository变种应该已经确定以哪一个类实例,不应该吗?这是什么逻辑?@StatefulEJB注释在这里有如此严重的影响?为什么它本质上迫使我CachingRepository在var声明中使用接口?请注意,我使用Seam 3 Faces使其@ViewScoped成为CDI视图范围的bean,因此手头的问题可能仍然只是CDI.
kra*_*tan 10
我对这个误导性的例外有同样的问题......
通过添加@Stateful,UserRepository可以公开CachingRepository接口的EJB方法,而无需声明无接口视图.单击"添加" @LocalBean以UserRepository激活无界面视图.请参阅EJB 3.1规范,第4.9.8节"会话Bean的无接口视图"
bean类必须指定它通过bean类定义或部署描述符公开无接口视图.以下规则适用:
- ...
- 如果bean公开了至少一个其他客户端视图,则bean通过bean类或部署描述符中的@LocalBean批注指定它公开无接口视图.
- ...
我还参考了这个stackoverflow答案,了解有关无接口视图的更多信息.
| 归档时间: |
|
| 查看次数: |
39586 次 |
| 最近记录: |