当前位置: 首页 > 知识库问答 >
问题:

类型[...]在注入点带有限定符[@Default]的不满足的依赖项(使用@StateEJB和CDI)

越涵衍
2023-03-14

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

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;

    ...
}

但是,当向UserRepository类添加@Stat时,部署失败,例外情况如下:

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;

会导致相同的异常。唯一与@Stabate一起工作的是使用var声明中的接口:

@Inject @Named("userRepo")
private CachingRepository userRepo;

然而,我可能需要子类功能,所以使用CachingRepository并不是真正需要的(目前)。

问题:

  1. 为什么这不能像预期的那样起作用?UserRepositoryvar应该已经确定了要实例化的类,不是吗?这有什么逻辑

注意,我使用Seam 3 Faces使@ViewScoped成为一个CDI视图范围bean,所以手头的问题可能仍然只是CDI。

共有3个答案

裴英才
2023-03-14

我也有同样的问题。

这就是我所做的来解决它:

我必须用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;

}

下面是一个配置,它位于您的独立完整配置下。xml文件。

<property name="services.discount.endpoint" value="http://localhost:8080/my_service/MyService/MyServiceImpl"/>
楮庆
2023-03-14

我也犯了同样的错误。

原因:org。jboss。焊接例外。DeploymentException:WELD-001408:在注入点[BackedAnnotatedField]@Inject]处带有限定符@Default的UserTransaction类型的未满足依赖项。。。

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

@Inject
UserTransaction trans;

我没有使用@Inject,而是使用了@Resources注释。

傅星光
2023-03-14

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

通过将@Stateful添加到UserRepository中,可以公开CachingRepository接口的EJB方法,而无需声明无接口视图。将@LocalBean添加到UserRepository以激活无接口视图。参见EJB3.1规范,第4.9.8节“会话Bean的无接口视图”

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

关于无接口视图的更多信息,我也参考这个stackoverflow答案。

 类似资料:
  • 我在JBoss上部署我的Java应用程序时遇到了一个愚蠢的问题。在我使用接口类更改源代码之前,一切都很好。所以这是我的问题: ... 在JBoss 7.1上部署时会出现以下错误: 10:05:34838错误[org.jboss.msc.service.fail](msc服务线程1-6)MSC00001:无法启动服务jboss。部署。单元“mdk-exchange-1.1.0.战争”。WeldSer

  • 我有下面的代码来管理两种存储库。两个存储库类都继承了一个接口,以允许重新初始化它们的资源。 将此(不带)注入上下文时 它起作用了。但是,将添加到类时,部署失败,并出现一个异常: 添加CDI bean的名称,如 结果为相同的异常。与配合使用的唯一方法是使用var声明中的接口: 但是,我在这里可能需要子类功能,因此(目前)并不希望使用。 问: null

  • 在JBoss上部署我的Java应用程序时,我遇到了一个愚蠢的问题。在我使用接口类更改源代码之前,一切都很好。所以我的问题是: 10:05:34,838错误[org.jboss.MSC.service.fail](MSC服务线程1-6)MSC00001:无法启动服务jboss.deployment.unit。“MDK-Exchange-1.1.0.war”。WeldService:org.jboss

  • 在部署到jboss arquilian服务器时,我遇到了以下问题(在部署本地jboss服务器时似乎没有这个问题 org.jboss.weld.exceptions.DeploymentException:WELD-001408类型[CarPolicyServiceWithContext]的依赖项不满足,其限定符为[@default],位于注入点[[field]@Inject com.athlon.

  • 问题内容: 我有以下代码来管理两种存储库。两个存储库类都继承一个接口,以允许对其资源进行重新初始化。 全局的,应用程序范围的存储库: 每个用户的会话范围的存储库: 当将此(无)注入上下文时 有用。但是,在添加到类中时,部署失败,并显示以下异常: 添加CDI bean的名称,例如 结果相同。唯一可以结合使用的方法是在var声明中使用该接口: 但是,我可能在这里需要子类功能,因此(现在)确实不需要使用

  • 我确实遇到了与这里所解释的相同的问题:JBOSS7.1.3:@EJB工作而@Inject失败,这可能是相同的设置(Wildfly 8.0)。 尽管有一个带有producer的资源类,但我不能注入一个Logger实例。Neiter在控制器中,也不在EJB中。“问题1”如果我错了,请纠正我,我应该可以将它们注入@model bean和注有@stateless(EJB)的bean中,不是吗? 下面是我的