- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
像这样上课:
public class A {
@Inject B b;
@Inject C c;
}
是否可以告诉 Weld 不要注入(inject)到 c 中?我可以使用事件否决 A 类:
<T> void processAnnotatedType(@Observes ProcessAnnotatedType<T> pat)
但是 B 对象也不会被注入(inject)。我正在搜索类似这样的内容:“如果类名是 A 并且字段类型是 C,则忽略注入(inject)。”
更具体地说,我希望 HK2 引擎注入(inject)“C”字段,问题是 HK2 和 Weld 都在使用 @Inject 注释。
我尝试了 Siliarus 解决方案。我找到了我想要添加我的自定义注入(inject)实现的类型:
<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));
}
}
}
}
}
然后我在 CustomInjection 中添加了覆盖的注入(inject)(...)
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);
}
在 manageBViaReflection 中,我只是将对象 B - b 设置为类型 B 的字段 X 和实例 Y - 实例上的名称 b。
微妙的不准确之处在于:
wrappedInjectionTarget.inject(instance, ctx);
在 B 上执行和 CDI 注入(inject)。我有生产者来键入 B,但我想在这个特定的类中自己创建它——不使用生产者。对象 B 必须被处置,当我使用 manageBViaReflection 覆盖它的值时,我必须首先处置它——它有点困惑,但通常这个想法是可行的。
Siliarus,jwells131313 - 也许你有任何进一步的建议?
最佳答案
好的,从 Weld/CDI 的角度来看,这里是如何禁用对这些区域的注入(inject)。请注意,我不知道 HK2,所以我不知道你想如何将它链接到那里,但从 CDI 的角度来看,你需要将 bean 作为 @Dependent
。 (以避免在事情变得更糟糕的地方代理)。您还没有指定 CDI 的版本,所以我会为 1.x 和 2.0 都做注释。
实际上我想到的是两件事,首先,它是 ProcessAnnotatedType
阶段,您可以在其中删除@Inject 注释,以便当 CDI 采用该注释类型(它变成 bean)时,它将不再将其视为注入(inject)点。你会这样做:
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
用你自己的实现。这种方法的优势在于您可以直接在此处 Hook HK2 内部结构。主要思想是覆盖 javax.enterprise.inject.spi.InjectionTarget.inject(T, CreationalContext<T>)
并将 HK2 代码放在这里,所以当 CDI 实际尝试进行注入(inject)时,它会使用 HK2。
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 tests它涵盖了所有这些内容,因此可以用作示例来了解如何实现此类包装器。
关于java - CDI Weld 省略 @Inject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40592677/
这是我在这里的第一篇文章,也是我第一次使用 C++。我正在查看从 Internet 获得的一些代码,但我对此有疑问。 它有一个 for 循环,像这样: for(cin >> t;t--;) 我明白它在
我目前正在开发一个网站,除其他外,该网站允许用户通过显示或隐藏他们已购买的商品来过滤市场。这适用于基本的 AJAX 调用,该调用传递可用过滤器的当前条件,然后使用 CodeIgniter 的事件记录构
我创建了一个 MWE,其中通过添加 来更改单行解决编译器错误。 以下代码无法编译: import java.util.List; public class MainClass { publi
当我想测试一些 PostgreSQL 函数 FOO() 的行为时,我发现执行类似 SELECT FOO(bar) 的查询很有用,bar一些数据我用作直接输入,而无需从真实表中SELECT。 我读到我们
在 PHP、Java、C++(以及许多其他语言)中,for 循环是这样使用的: for(int i=0;i<10;i++) 如果我已经初始化了i,我该如何省略初始化语句呢? 最佳答案 在 Java、C
我发现我们的 Android 应用出现了一个奇怪的问题,特别是在 4.4 版的 Moto X 上。 在偏好 Activity 中,所有标题的前 8 个字符都在开头用省略号截断。这也发生在溢出菜单和整个
我有一个 XElement,我必须解析它以删除结束标记中的空白。我的代码如下所示: var stringBuilder = new StringBuilder(); using (var string
假设我有两个接口(interface),X和 Y ,它们共享一些字段,但也有独立的字段: interface X { abc: number; foo: number; bar: numb
我有这个模型: var accountSchema = new mongoose.Schema({ 'seeker': { 'fullName': String,
我在 R 中运行一个具有大量时间和位置固定效应的回归。我尝试将一个漂亮的汇总表输出到 Latex 中。我从 stargazer 包切换到 huxtable,因为 stargazer 在忽略固定效果时表
假设我有一个数据框: a df a b c d 1 0 9 10 2 1 10 13 3 NA 11 14 4 3 NA 7 5 4 13 22 现在假设我
我在 R 中运行一个具有大量时间和位置固定效应的回归。我尝试将一个漂亮的汇总表输出到 Latex 中。我从 stargazer 包切换到 huxtable,因为 stargazer 在忽略固定效果时表
我想删除一个属性并返回一个新对象而不改变原始对象。 我知道我们可以像这样使用 Lodash 轻松做到这一点: const profile = { name: 'Maria', age: 30 } _.
我正在通过更改一些内容来修改 javascript 对象。当我重新创建它时,我会得到每个 key 对的索引号。 "0":{...},"1":{...}, 如何删除/省略这些 0、1、2、3、4 数字的
我正在一个非常方便且名称丰富的网站 here 上完成示例之一。 ,具体来说: func applyMutliplication(value: Int, multFunction: Int -> Int
这个问题在这里已经有了答案: Why do java source files require package declarations? (4 个答案) 关闭 6 年前。 我是 Java 的新手,
在下面的代码中: Widget makeWidget() { return Widget(); } void foo(Widget widget) { ... } foo(makeWid
这是我使用下面的调用调用的过程: CALL abc('01-04-2011','14-04-2014','28,29,36,37,38','33,34,35,41,42,43') 但问题是下面提到的查
嘿,我正在寻找一种在 yui 数据表中省略文本的好方法。我的意思是,格式化文本,使其很好地适合其单元格,并且如果文本必须被 chop ,则在其后面有一个椭圆 (...)。 我想在不使用 CSS 选择器
我有一个如下表(记录)。 ID Status AA124 Pass AA125 Pass Z_AA134 Fail Z_AA135
我是一名优秀的程序员,十分优秀!