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

如何制作java。朗,反思一下。来自两个独立类加载器的代理?

丁光华
2023-03-14

我使用CXF JAXRSClientFactory从各种JAX-RS接口创建代理实例。在内心深处,这个工厂调用代理。newProxyInstance(),传入我的接口和CXF客户端接口。

在OSGi下,如果包含我的接口类的捆绑包导入,这将非常有效org.apache.cxf.jaxrs.client.但是有一天,我决定从我的应用程序类中隐藏CXF,所以我创建了一个捆绑包,将客户端工厂封装在服务中。现在我从代理那里得到IllegalArgumentExcema,说“我的界面在类加载器中不可见”或“客户端在类加载器中不可见”。

问题是我的工厂捆绑包导入了CXF,但没有导入我的应用程序。我的应用程序包不导入CXF。因此,容器中的任何地方都没有可以看到CXF客户端类和我的JAX-RS接口的类加载器。

有没有办法在不将CXF导入我的应用程序包的情况下解决这个问题?例如,我的工厂包能否动态生成一个新的类加载器,它是两个类加载器的联合体,这样它就可以同时看到CXF和我的应用程序类?或者我可以骗代理接受这两个接口吗?

共有1个答案

薛栋
2023-03-14

从CXF 2.6.1开始,这是一个可以解决的问题。已解决的问题CXF-4290添加了一个新的API,将自定义类加载器传递给JAXRSClientFactory。再加上新的组织。阿帕奇。cxf。贾克斯。客户ProxyClassLoader类,我现在可以为任意应用程序类制作代理。

    ProxyClassLoader classLoader = new ProxyClassLoader();
    classLoader.addLoader(resourceApiClass.getClassLoader());
    classLoader.addLoader(JAXRSClientFactoryBean.class.getClassLoader());

    JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
    bean.setAddress(baseUrl);
    bean.setServiceClass(resourceApiClass);
    bean.setClassLoader(classLoader);
    return bean.create(resourceApiClass);
 类似资料:
  • 我试图在程序中加载一个jar文件来调用不同的方法。我有一个类来完成这项工作,但是该类使用加载jar文件,它依赖于系统类加载程序,因此,例如,如果加载的jar执行它完成整个应用程序的执行,终止当前运行的Java虚拟机。我的意图是,如果加载的jar最后一次这样做,它只完成jar,而不是整个应用程序。此外,我希望能够关闭jar,以便在需要时可以稍后重新启动它。我使用以下代码从jar实例化所需的类,并从我

  • 大话来自一个程序员的反思 程序员大军鱼龙混杂,水平的高低无法简单的从一个功能完成情况来评定,同样一个需求,功能都可以完成,但是不同程序员完成质量会不一样,完成质量的好坏需要从多方面评定,可以参考这些条件:易维护,易拓展,高可用,高稳定,高性能,安全性,容错,风控 洞察身边的程序猿,可以归类出这几种类型: 理论型,理论能力很强,对前沿技术略有了解,性格比较强势,需求分析和方案设计头头是道,对自己的设

  • 我想将多个数据库的更改聚合到一个数据库中,所以我想在每个数据库旁边运行一个Debezium连接器和一个Kafka服务器/代理,并使用Kafka接收器连接器从所有这些Kafka中消费写入一个数据库。 问题是,我是否可以使用单个 Kafka 接收器连接器实例同时使用来自多个独立(不是集群)的 Kafka 代理。

  • JVM如何进行内部管理 如果在两个不同的用户定义的类装入器中装入相同版本的类装入? 2.如果在两个不同的用户定义类加载程序(相同的类名和包)中加载不同版本的类。如果JVM加载了将在我的应用程序中引用的两个类。 我们知道JVM在类、包 我想知道JVM内部如何处理这些情况。

  • 我试图修改几个类的字节代码,这些类的打包jar文件不在类路径中-它们是在给定URL的运行时由自定义的加载的。我尝试使用和来拦截那些类,但失败了。类加载器是遗留项目的一部分,因此我无法直接对其进行更改。 代理可以很好地处理AppClassLoader“本地”加载的类,但只会忽略那些由自定义类加载器加载的类。 CustomClassLoader: 我的代理中使用的ClassFileTransforme

  • 问题内容: 我想从另一个控制器的函数中加载一个控制器,因为我集成到项目中的库我不想将其加载到控制器中,因为我想保持它的清洁和相关性。 我有默认的控制器,所以我可以加载,这样我怎么能从main函数访问控制器,所以我不必将控制器放在url中。 如果我可以从主控制器功能中加载控制器功能,我仍然愿意使用HMVC。 问题答案: 您无法从CI中的控制器加载控制器-除非您使用HMVC或其他工具。 您应该考虑一下