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

CDI焊接忽略@Inject

颛孙和悌
2023-03-14

像这样上课:

public class A {
   @Inject B b;
   @Inject C c;
}

有没有可能告诉Weld不要注射到c中?我可以否决使用事件的类:

<T> void processAnnotatedType(@Observes  ProcessAnnotatedType<T> pat) 

但是B物体也不会被注射。我在搜索类似这样的东西:“如果类名是A,字段类型是C,那么省略注入。”

更具体地说,我希望HK2引擎注入“C”字段,问题是HK2和焊接都使用@注入注释。

我尝试了西利亚罗斯的解决方案。我找到了想要添加自html" target="_blank">定义注入实现的类型,比如:

<T> void processIT(@Observes ProcessInjectionTarget<T> pat, BeanManager beanManager) {      
            Set<InjectionPoint> injectionPoints = pat.getInjectionTarget().getInjectionPoints();
            for (InjectionPoint injectionPoint : injectionPoints) {
                if (injectionPoint.getType().equals(B.class)) {
                    l.info("Adding CustomInjection to  {}", pat.getAnnotatedType().getJavaClass());
                    pat.setInjectionTarget(new CustomInjection<T>(pat.getInjectionTarget(), beanManager));
                }
            }
        }
    }
}

在我添加了覆盖注入(…)在美国

public CustomInjection(InjectionTarget<T> originalInjectionTarget, BeanManager beanManager) {
    this.wrappedInjectionTarget = originalInjectionTarget;
    this.beanManager = beanManager;
}

比如:

@Override
public void inject(T instance, CreationalContext<T> ctx) {

    l.trace("Injecting into {}", instance);
//....create my own HK2 object. Can it be just new B() for example ?!       
    locator =ServiceLocatorUtilities.createAndPopulateServiceLocator();  
    B b = locator.createAndInitialize(B.class);

    l.trace("First injecting standard dependencies {}", instance);
    wrappedInjectionTarget.inject(instance, ctx);
    // dispose created by CDI B type object ?! - seems messy but works 
    manageBViaReflection((x, y, z) -> x.set(y, z), instance, b);
}

在Manager eBViaReflection中,我只是将对象B-b设置为类型B的字段X,并在实例Y-实例上命名b。

微妙的不准确之处在于:

wrappedInjectionTarget.inject(instance, ctx);

在B上执行和CDI注入。我有制作人输入B,但我想在这个特定的类中自己创建它——而不是使用制作人。必须处理对象B,当我使用manageBViaReflection覆盖它的值时,我必须首先处理它——这有点凌乱,但通常这种想法是可行的。

Siliarus,Jwells1313-也许你还有什么建议?

共有1个答案

张勇
2023-03-14

好的,从Weld/CDI的角度来看,这里是如何禁用这些字段的注入。请注意,我不知道HK2,所以我不知道接下来要如何将其链接到那里,但从CDI的角度来看,您需要将bean设置为@Dependent(以避免在事情变得更糟的地方代理)。您还没有指定CDI的版本,所以我将记录这两个版本,1。x和2.0。

实际上,我想到的是两件事情,第一,是ProcessAnNotatedType阶段,在这个阶段,您可以删除@Inject注释,这样当CDI获取该注释类型(它将其转换为bean)时,它将不再将其视为注入点。您可以按以下方式操作:

void processAnnotatedType(@Observes  ProcessAnnotatedType<T> pat) {
  pat.configureAnnotatedType().remove(Inject.class); // CDI 2.0 solution
  // for CDI 1.x you need to implement your own AT, which 
  // will do just the same, the call this:
  // pat.setAnnotatedType(yourOwnAT);
}

第二,考虑了ProcessInjectionTarget。您需要用自己的实现包装InjectionTarget。这种方法的优点是,您可以在这里直接连接HK2内部。其主要思想是覆盖javax。企业注射spi。注射靶标。注入(T,创造性上下文)

void processIT(@Observes  ProcessInjectionTarget<T> pat) {
  pat.setInjectionTarget(myITImpl); // just set your wrapped impl here
  // there is no diff here in CDI 1.x and 2.0, no configurator here
}

无论你选择哪种方式,请记住CDI有一个很好的巨大的TCK测试集,它涵盖了所有这些东西,因此可以作为一个例子来看看如何实现这样的包装器。

 类似资料:
  • 有一个简单的Mongo DB生产者连接到Mongo数据库 我的src/main/resources/meta-inf中的一个资源文件 WeldContext和WeldJUnit4Runner来自这里-http://memorynotfound.com/java-se-unit-testing-cdi-junit-jboss-weld-se/

  • 问题:尝试将 WAR 部署到 Glassfish 4.1.1 时,我不断收到以下 WELD 异常。应用程序在 Wildfly 9.0 上正确部署。 加载应用程序时出现异常:java.lang.IllegalStateException:ContainerBase。addChild:开始:org.apache.catalina。生命周期异常:org.apache.catalina。生命周期异常:or

  • 问题内容: 比方说,我有一个名为接口,以及三种实现- ,和。 现在,我希望每当我的托管bean(或任何Web组件)收到一条消息时,便在所有社交网络中共享它。我试过了: 但这没有用(部署错误)。(也尝试了预选赛-同样的结果) 那么,有没有办法注入接口的所有(或某些)实现的列表? 我知道给定注入点不应包含多个可能的bean的规则。我想我可以通过创建一个产生列表的生产者并使用来实现这一点,但这对于这项任

  • 我试图提供一个机会注入任意枚举给定的注入点和字符串值(这是在生产方法中获得) 任意是指如果我有枚举我的和枚举你的,我想用相同的生产者方法注入它们两个或任何其他一个。 所以我尝试了几种方法:1。 2.我将返回类型更改为对象。 在这两种情况下,我都会收到由:org引起的下一个异常。jboss。焊接例外情况。DeploymentException:WELD-001408:在注入点[BackedAnnot

  • 我正在学习jboss Weld Event教程中的Weld Event,我想写一个观察事件并在事件被激发时打印helloword的示例。 这是我的代码: 它不起作用,给出以下异常信息: 容器中似乎没有可以初始化的bean 那么我该怎么做才能使它运行,我的beans.xml是空的 也许我应该在beans.xml中做些什么? 或者我应该编写一个实现事件接口的Java类? 任何内容都将适用。

  • 嗨,我对OpenShift有个问题。错误是: PropertyNotFoundException:目标不可达,标识符“登录控制器”解析为空