Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在AbstractInstallerScreen中创建Jersey客户端的依赖关系问题_Java_Install4j - Fatal编程技术网

Java 在AbstractInstallerScreen中创建Jersey客户端的依赖关系问题

Java 在AbstractInstallerScreen中创建Jersey客户端的依赖关系问题,java,install4j,Java,Install4j,在Install4j项目中,我们希望使用Jersey执行对Web服务器的调用。我们为此任务实现了一个AbstractInstallAction,它使用 Client client = Client.create(new DefaultClientConfig()); 这在CustomAction中工作得很好;现在我想在AbstractInstallerScreen中使用相同的代码;在屏幕中调用相同的代码行会导致以下异常(我缩短了日志条目,但我想你会明白这一点): 2016年10月6日上午10:

在Install4j项目中,我们希望使用Jersey执行对Web服务器的调用。我们为此任务实现了一个AbstractInstallAction,它使用

Client client = Client.create(new DefaultClientConfig());
这在CustomAction中工作得很好;现在我想在AbstractInstallerScreen中使用相同的代码;在屏幕中调用相同的代码行会导致以下异常(我缩短了日志条目,但我想你会明白这一点):

2016年10月6日上午10:10:24 com.sun.jersey.spi.inject.Errors processErrorMessages
严重:在资源和/或提供程序类中检测到以下错误和警告:
严重:参数索引0处缺少构造函数public com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$App(com.sun.jersey.spi.inject.Injectable,javax.ws.rs.ext.Providers)的依赖项
严重:参数索引0处缺少构造函数public com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$Text(com.sun.jersey.spi.inject.Injectable,javax.ws.rs.ext.Providers)的依赖项
严重:参数索引0处缺少构造函数public com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General(com.sun.jersey.spi.inject.Injectable,javax.ws.rs.ext.Providers)的依赖项
严重:参数索引0处缺少构造函数public com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$App(com.sun.jersey.spi.inject.Injectable,javax.ws.rs.ext.Providers)的依赖项
严重:参数索引0处缺少构造函数public com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$Text(com.sun.jersey.spi.inject.Injectable,javax.ws.rs.ext.Providers)的依赖项
严重:参数索引0处缺少构造函数public com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General(com.sun.jersey.spi.inject.Injectable,javax.ws.rs.ext.Providers)的依赖项
严重:参数索引0处缺少构造函数public com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$App(com.sun.jersey.spi.inject.Injectable,javax.ws.rs.ext.Providers)的依赖项
严重:参数索引0处缺少构造函数public com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$Text(com.sun.jersey.spi.inject.Injectable,javax.ws.rs.ext.Providers)的依赖项
...
严重:缺少以下字段的依赖项:com.sun.jersey.spi.MessageBodyWorkers com.sun.jersey.json.impl.provider.entity.json WithPaddingProvider.bodyWorker
com.sun.jersey.spi.inject.Errors$ErrorMessagesException
位于com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170)
位于com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:136)
位于com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:199)
位于com.sun.jersey.api.client.client.(client.java:188)
位于com.sun.jersey.api.client.client.(client.java:171)
位于com.sun.jersey.api.client.client.create(client.java:683)
...
在我的POM文件中,我使用以下方式加载jersey依赖项:

<dependency>
    <groupId>com.sun.jersey.contribs</groupId>
    <artifactId>jersey-multipart</artifactId>
    <version>1.18.1</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.18.1</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.18.1</version>
</dependency>

com.sun.jersey.contribs
泽西多部分
1.18.1
泽西岛
泽西岛客户
1.18.1
泽西岛
泽西json
1.18.1

所以问题是:我应该如何在安装程序屏幕中进行调用,以避免出现异常,比如缺少依赖项,或者在自定义操作中使用jersey有什么区别?

这是由于JAX-WS误用了上下文类加载器

在脚本和操作中,install4j会因为这个原因临时重置上下文类加载器,但在屏幕和表单组件中,这不会发生

如果您这样调用代码:

ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();
try {
    Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
    // TODO Add your code that uses JAX-WS
} finally {
    Thread.currentThread().setContextClassLoader(oldContextClassLoader);
}

应该行。

解决了我的问题!非常感谢。
ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();
try {
    Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
    // TODO Add your code that uses JAX-WS
} finally {
    Thread.currentThread().setContextClassLoader(oldContextClassLoader);
}