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

为什么CDI在使用注释参数时不满足依赖关系?

皮景龙
2023-03-14

我定义了一个限定符来指定我想要注入的bean子类。当限定符在注入点没有指定参数时,一切都按预期工作。当我在注入点指定属性和值时,我会得到一个CDI不满足依赖项错误。我正在部署Glassfish 4.0。此外,在注入的bean上使用无界面视图,但我认为这在这种情况下并不重要。

限定符的目的是获得一个特定于Postgres的子类(使用各种不同的数据库来比较任何行为差异)。该参数用于指定Postgres模式(默认为公共)。

限定符在Postgres.java中是这样定义的:

@Qualifier
@Retention(RUNTIME)
@Target({ FIELD, TYPE, METHOD })
public @interface Postgres
{
  String schema() default "public";
}

注入的子类在DBCmdPostgres.java中是这样的:

@Stateless
@Postgres
public class DBCmdPostgres
    extends DBCmd
{
...
  @PostConstruct
  public void postConstruct()
  {
    Class cl = getClass();
    Postgres postgresAnnotation = (Postgres)cl.getAnnotation(Postgres.class);
    if (postgresAnnotation != null) {
      System.out.println(">> @Postgres(schema = " + postgresAnnotation.schema() +")");
    }
  }
...
}

基类在DBCmd中如下所示。java

@Stateless
@Default
abstract public class DBCmd
{
...
}

注入点是JSF会话范围内的支持beanindexBacker中的这一点。java

  @Inject @Postgres(schema = "foo") private DBCmd postgresCmds;

如果我在注入点省略了(schema=“foo”),事情就会如我所期望的那样工作,并且PostConstruct方法会显示正确的默认值“public”。如果添加(schema=“foo”)部分,则在部署到Glassfish时会出现以下错误:

[2013-09-18T08:36:24.209-0500] [glassfish 4.0] [SEVERE] [] [javax.enterprise.system.core] [tid: _ThreadID=36 _ThreadName=admin-listener(3)] [timeMillis: 1379511384209] [levelValue: 1000] [[
  Exception while loading the app : CDI deployment failure:WELD-001408 Unsatisfied dependencies for type [DBCmd] with qualifiers [@Postgres] at injection point [[BackedAnnotatedField] @Inject @Postgres private jsfBackers.IndexBacker.postgresCmds]
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [DBCmd] with qualifiers [@Postgres] at injection point [[BackedAnnotatedField] @Inject @Postgres private jsfBackers.IndexBacker.postgresCmds]
    at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:403)
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:325)
    at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:177)
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:208)
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:519)
    at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:505)
    at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:480)
    at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:536)
    at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:216)
    at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:131)
    at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:328)
...

bean当前是无状态的,但如果我们能找出错误,它将变成有状态的(用于存储/使用模式参数的值,以及一些其他内容)。

共有1个答案

於子晋
2023-03-14

您的参数应标记为@Nonbinding,以便像这样正确解析

要读取值:

其中ip是您的注入点对象,注释类是您想要读取的类(T是它的类型)

final Set<Annotation> annotations = ip.getQualifiers();
        for (final Annotation a : annotations) {
            try {
                if (a.annotationType().isAssignableFrom(annotationClass)) {
                    t = (T) a;
                    break;
                }
            }
            catch (final ClassCastException e) {
            }
        }`
 类似资料:
  • 在SecurityServiceImpl中注入此RoleRepo时,我面临此错误。 我的spring上下文文件 我的角色类

  • java.lang.noClassDefoundError:scala/collection/gentraversableonce$class at kafka.utils.pool.(pool.scala:28)~[kafka2.10-0.8.1.1.jar:na] at kafka.consumer.FetchRequestandResponseStatsRegistry$.~[kafka2.

  • 问题内容: 我有一个节点包。当我从程序包的根目录运行时,它会安装很多东西,但是会打印出一些如下所示的错误消息: npm WARN未满足依赖项/ Users / seanmackesey / google_drive / code / explore / generator / node_modules / findup-sync / node_modules / glob需要graceful- f

  • 我有bean,它实现了两个接口(远程和本地)。我还添加了注释,用于使用无接口视图访问bean。 我使用的原因取自JBoss AS7快速入门示例: > WeatherDataBean具有: 资源具有:

  • 我从Spring MVC开始,阅读了《Spring in Action》一书,我正在使用Spitter应用程序进行第5章的练习,但我遇到了以下错误: org.springframework.beans.factory.[C:\xampp\htdocs.metadata.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\spitter\WEB-I

  • 我觉得我一定忽略了什么。 null Grunt@0.4.2应该匹配所有这些依赖项,但npm说它不匹配,安装失败。我是不是忽略了什么? 根据请求,我的package.json文件: