从 CDI Proxy 获取真实对象

2023-12-31

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

我需要测试我获得的对象列表中的每个元素是否@Inject @Any MyInterfacebeans 是一个代理,当true我需要获取真实的对象进行内省并获取该对象的所有属性。

我的焊接实施:

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

where 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;
}

任何建议/指示。在官方文档中我发现没有提到内省(here http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#_injection_points)

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

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

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

EDIT:更准确地说,问题是:您知道 WELD 是一种干净的 CDI 解决方案吗?already实施与目标实例代理?如果我需要回学校或者我理解我在写的内容,则不会。感谢您花时间提供帮助!


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

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

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

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

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

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

@Inject
Foo foo;

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

如果你想获取实际实例,WeldClientProxy让您获得Metadata https://github.com/weld/api/blob/master/weld/src/main/java/org/jboss/weld/proxy/WeldClientProxy.java#L34您可以从中检索底层上下文实例 https://github.com/weld/api/blob/master/weld/src/main/java/org/jboss/weld/proxy/WeldClientProxy.java#L51。这是我能让你最接近你所追求的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 CDI Proxy 获取真实对象 的相关文章

随机推荐

  • 说明:register_shutdown_function [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 什么是register shutdo
  • 我已经被 async/await 宠坏了!现在正在努力解决明确的任务延续问题

    编辑 接受后 它可能不会立即显而易见 但 Servy 的答案是正确的 不需要自定义实现Unwrap在 monodroid 下 在我的评论中我说它不存在 但它确实存在 End edit 我正在编写一堆使用我们的 RESTful Web 服务的
  • Pytesseract - 使用用户模式

    我正在尝试将 tesseract 的用户模式与 pytesseract 一起使用 但似乎无法使该命令正常工作 这看起来应该相当简单 但文档很少 我使用的是 tesseract 3 05 01 这样做是行不通的 pytesseract ima
  • 在 Vim 中更改大小写

    Vim 中是否有命令可以更改所选文本的大小写 Visual select the text http vimdoc sourceforge net htmldoc visual html visual use then U for uppe
  • Python程序遍历目录并读取文件信息

    我刚刚开始使用 Python 但已经发现它比 Bash shell 脚本更加高效 我正在尝试编写一个 Python 脚本 该脚本将遍历从我启动脚本的目录分支的每个目录 并且对于它遇到的每个文件 加载此类的实例 class FileInfo
  • 我在颤振中遇到空安全问题

    我在 Flutter 中遇到空安全问题 我想将数据放入其中水平数据表 https pub dev packages horizontal data table在 Flutter 中 我用StreamBuilder但是当我在小部件内调用它时
  • Boost.Python.ArgumentError:python str 未转换为 std::string

    我收到一个错误 我无法理解尝试通过 Boost Python 包装一个相当简单的 C 类的意义 一 班级 include
  • 使用指令以驼峰命名法设置元素的属性值

    我正在尝试从这样的指令向 angularJs 元素添加属性 element attr startOffset val 但是当我检查该元素时 添加的属性是 startoffset 其中 o 不是大写字母 有什么方法可以向元素添加属性并保持单词
  • Django ORM原始删除查询不删除记录

    我在用raw sql为了方便我的查询以保持数据库最小化 我正在删除额外的记录 通过这个查询 d is from a loop and has values res MyModel objects raw DELETE FROM mydb m
  • JQuery Ajax 投票

    我正在用这个JQuery Ajax 投票系统指南 http ad1987 blogspot com 2009 02 reddit style voting with php mysql and html作为一个粗略的参考 但我对此的安全性有
  • 如何为 Risc-V(汇编语言)编写旋转操作 我们有像 8086 中那样的命令吗?

    我以前使用过8086的汇编语言 8086中的旋转操作只是一个命令 但我在 Risc V 汇编语言中找不到旋转操作的特定关键字 看起来扩展 B 最终应该定义这样的指令 在那之前你必须使用左移和右移来组合它 这是 MIPS32R2 rotrv
  • 如何从资源中播放WAV音频文件?

    如何从我的项目资源中播放 WAV 音频文件 我的项目是 C 中的 Windows 窗体应用程序 Because mySoundFile is a Stream 你可以利用SoundPlayer的重载构造函数 它接受Stream object
  • 什么是 RWS Monad 以及何时使用它

    我在 mtl 库中查找某些内容时遇到了 RWS Monad 及其 MonadTransformer 那里没有真正的文档 我想知道这是什么以及它在哪里使用 我发现 RWS 是 Reader Writer State 的缩写 它是这三个 mon
  • SELECT ... *FOR UPDATE* 的目的是什么?

    我很困惑你为什么要指定FOR UPDATE 为什么数据库关心你要如何处理来自SELECT 编辑 抱歉 我问的问题很糟糕 我知道文档说它将事情变成 锁定读取 我想知道的是 在哪些情况下 可观察的行为在指定之间会有所不同 FOR UPDATE并
  • 如何在Java中格式化时间间隔?

    我创建 J2SE 应用程序 该应用程序需要将两次以毫秒为单位的时间格式化为表示这两次时间之间间隔的字符串 long time1 1334331041677L Fri Apr 13 17 30 41 CEST 2012 long time2
  • 异步函数调用C++0x

    我正在使用以下代码测试 std async 函数http www justsoftwaresolutions co uk threading multithreading in c 0x part 8 futures and promise
  • WIndows API 中的“L”和“LPCWSTR”

    我发现 NetUserChangePassword 0 0 L ab L cd 将用户密码从 ab 更改为 cd 然而 NetUserChangePassword 0 0 LPCWSTR ab LPCWSTR cd 不起作用 返回值表示密码
  • 什么是“ANSI_X3.4-1968”编码?

    在我的系统上查看以下输出 STEP 101 python3 c import sys print sys stdout encoding ANSI X3 4 1968 STEP 102 STEP 103 locale LANG C LANG
  • 杰克编译花了很长时间

    升级我的项目以启用 Jack 和 Java8 功能后 我的 16GB MacBook 似乎无法再构建我的项目 我看到内存使用量越来越高 但进程总是卡在同一点 我的 Gradle 控制台 Executing tasks app assembl
  • 从 CDI Proxy 获取真实对象

    我寻找一种干净的 CDI 解决方案 而不是依赖于 WELD 的解决方案 但到目前为止一无所获 我需要测试我获得的对象列表中的每个元素是否 Inject Any MyInterfacebeans 是一个代理 当true我需要获取真实的对象进行