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

时间:2012-04-27 07:10:45

标签: java ejb-3.0 java-ee-6 cdi seam3

我有以下代码来管理两种存储库。两个存储库类都继承了一个接口,以允许重新初始化其资源。

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并不是真正需要的(目前)。

问的

  1. 为什么这不按预期工作? UserRepository var应该已经识别要实例化的类,不应该吗?这是什么逻辑?
  2. 为什么@Stateful EJB注释在这里有如此严重的影响?为什么它本质上迫使我在var声明中使用CachingRepository接口?

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

5 个答案:

答案 0 :(得分:10)

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

通过向@Stateful添加UserRepository,您可以公开CachingRepository接口的EJB方法,而无需声明无接口视图。将@LocalBean添加到UserRepository以激活无界面视图。请参阅EJB 3.1规范,第4.9.8节“会话Bean的无接口视图”

  

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

     
      
  • ...
  •   
  • 如果bean暴露了至少一个其他客户端视图,那么bean   指定它通过以下方式公开无界面视图   bean类或部署中的@LocalBean批注   描述符。
  •   
  • ...
  •   

我还会参考this stackoverflow答案,了解有关无界面视图的更多信息。

答案 1 :(得分:0)

我有同样的问题。

这就是我要解决的问题:

我必须使用下面的wildfly容器生成要尝试注入的EJB:

@ApplicationScoped
    public class Resources {
     private static final String DISCOUNT_SERVICE_ENDPOINT_PROPERTY =
        "services.discount.endpoint";
     private MyServiceImpl myService;
    }

@Produces
 public MyServiceImpl produceMyServiceImpl() {
     if (myService == null) {
         String endpoint = System.getProperty(DISCOUNT_SERVICE_ENDPOINT_PROPERTY);
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setServiceClass(MyServiceImpl.class);
        factory.setServiceName(MyService.SERVICE);
        factory.setAddress(endpoint);
        myService = (MyServiceImpl) factory.create();
     }
     return myService;

}

下面是一个配置,位于您standalone-full.xml文件下。

<property name="services.discount.endpoint" value="http://localhost:8080/my_service/MyService/MyServiceImpl"/>

答案 2 :(得分:0)

我有同样的问题。我希望这可以帮助某人。

要解决此问题:

  • 右键单击项目
  • 点击Properties
  • 找到Project facets
  • Project facets上,激活选项CDI
  • 应用并保存。

现在一切都很好。

答案 3 :(得分:0)

我有同样的错误。

  

由以下原因引起:org.jboss.weld.exceptions.DeploymentException:WELD-001408:   带限定符的UserTransaction类型的依赖关系未满足   @默认在注入点[BackedAnnotatedField] @Inject ...

我这样解决了这个问题: 收到错误时,我以这种方式使用UserTransaction。

@Inject
UserTransaction trans;

我使用@Inject注释代替了@Resource

答案 4 :(得分:0)

也许您应该在bean类上添加非参数化的构造方法。 我在Jboss文档中读到说:具有没有参数的构造函数(或用@Inject注释指定的构造函数)的具体Java类是bean。