在注入点使用限定符[@Default]的类型[...]的不满意依赖(使用带有CDI的@Stateful EJB)

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)

有用.但是,在添加@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
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并不是真正需要的(目前).

:

  1. 为什么这不按预期工作?该UserRepository变种应该已经确定以哪一个类实例,不应该吗?这是什么逻辑?
  2. 为什么@StatefulEJB注释在这里有如此严重的影响?为什么它本质上迫使我CachingRepository在var声明中使用接口?

请注意,我使用Seam 3 Faces使其@ViewScoped成为CDI视图范围的bean,因此手头的问题可能仍然只是CDI.

kra*_*tan 10

我对这个误导性的例外有同样的问题......

通过添加@Stateful,UserRepository可以公开CachingRepository接口的EJB方法,而无需声明无接口视图.单击"添加" @LocalBeanUserRepository激活无界面视图.请参阅EJB 3.1规范,第4.9.8节"会话Bean的无接口视图"

bean类必须指定它通过bean类定义或部署描述符公开无接口视图.以下规则适用:

  • ...
  • 如果bean公开了至少一个其他客户端视图,则bean通过bean类或部署描述符中的@LocalBean批注指定它公开无接口视图.
  • ...

我还参考了这个stackoverflow答案,了解有关无接口视图的更多信息.

  • 我没有任何EJB.我甚至没有在我的代码中的任何地方使用任何@Default注释.但仍然在Wildfly创业时它正在抛出这个例外.我搜索了很多,但每个人都在谈论EJB. (3认同)