19

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

public interface CachingRepository
{
    public void invalidateCache();
}

全局的、应用范围的 repo:

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

    ...

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

    ...
}

每个用户,会话范围的 repo:

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

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

    ...
}

将 this(不带@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(目前)并不真正需要使用。

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

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

4

5 回答 5

11

我对这个误导性异常有同样的问题......

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

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

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

我还参考了这个 stackoverflow答案以获取有关无界面视图的更多信息。

于 2012-04-30T19:23:32.360 回答
2

我有同样的错误。

引起:org.jboss.weld.exceptions.DeploymentException:WELD-001408:在注入点 [BackedAnnotatedField] @Inject ...

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

@Inject
UserTransaction trans;

而不是@Inject,我使用@Resource注释。

于 2019-08-29T06:48:03.790 回答
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"/>
于 2019-05-07T18:51:44.847 回答
0

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

解决问题:

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

现在一切都很好。

于 2019-05-21T10:16:48.123 回答
0

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

于 2020-04-06T12:12:14.380 回答