gpt4 book ai didi

java - 从 CDI Proxy 获取真实对象

转载 作者:行者123 更新时间:2023-12-02 13:00:44 24 4
gpt4 key购买 nike

我寻找一种干净的 CDI 解决方案,而不是依赖于 WELD 的解决方案,但到目前为止一无所获......

我需要测试使用 @Inject @Any MyInterface beans 获得的对象列表中的每个元素是否都是代理,当 true 时,我需要获取真实的对象进行内省(introspection)并获取该对象的所有属性。

我的 WELD 实现:

MyInterface interf = obj;
if (isProxy(interf )) {
interf = (Config) ((TargetInstanceProxy)interf ).getTargetInstance();
}

其中 isProxy 是这样定义的(CDI 解决方案?):

public boolean isProxy(Object obj) {
try{
return Class.forName("org.jboss.weld.bean.proxy.ProxyObject").isInstance(obj);
} catch (Exception e) {
LOGGER.error("Unable to check if object is proxy", e);
}
return false;
}

任何建议/指示。在官方文档中我发现没有提及内省(introspection)( here )

然后我想通过这样的方式获取 bean 的所有属性:

Arrays.stream(interf.getClass().getDeclaredFields()).forEach(
field -> extractStuff(...)
);

我们使用 Wildfly 和 WELD,但不想将我们绑定(bind)到 CDI 的实现。提前致谢!

编辑:更准确地说,问题是:您是否知道 WELD 已经使用 TargetInstanceProxy 实现了一个干净的 CDI 解决方案?如果我需要回到学校或者我理解我在写的内容,则不会。感谢您花时间提供帮助!

最佳答案

CDI 有意隐藏(或者更确切地说不暴露)内部结构,因为在针对接口(interface)进行编程时,它们对最终用户来说应该不重要。此外,弄乱它可能会导致奇怪的错误,因为您应该始终调用方法通过代理,而不是实际实例。

所以简短的回答是 - 不,没有纯粹的 CDI 方法可以做到这一点。(至少不是预期的。)

但是,鉴于您已经在使用 Weld,还有其他方法。除了 TomEE 之外,Weld 几乎附带了所有 EE 服务器,因此依赖 Weld API 应该是非常安全的。现在为什么我要这么说 - 在 Weld 3.x (WildFly 12+) 中,API 被扩展为包含 WeldConstructWeldClientProxy它们是由 Weld 子类(拦截器/装饰器)和/或客户端代理实现的接口(interface) - 有关更多信息,请参阅这些类的 javadoc。

因此,如果您必须这样做,那么您可以添加对 Weld API 的依赖项,如下所示:

<dependency>
<groupId>org.jboss.weld</groupId>
<artifactId>weld-api</artifactId>
<version>x.y.z</version>
</dependency>

然后,在您的代码中,您可以通过执行以下操作来检查注入(inject)的对象是否是代理:

@Inject
Foo foo;

public void doSomething() {
if (foo instanceof WeldClientProxy) {
// foo is a proxy
} else {
// not a proxy
}
}

如果您想获取实际实例,WeldClientProxy allows you to obtain Metadata您可以从中获取 retrieve the underlying contextual instance 。这是我能让您最接近您所追求的目标。

关于java - 从 CDI Proxy 获取真实对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51981660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com