我正在尝试向Glassfish 3.1.1部署一个使用CXF Web服务客户端库和Jersey Web服务客户端库的战争。为了让Glassfish使用CXF而不是Metro作为JAX-WS实现,我将包含一个glassfish-web.xml
文件,其中包含以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Application Server 9.0 Servlet 2.5//EN'
'http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd'>
<glassfish-web-app>
<!-- Need this to tell Glassfish not to load the JAX-WS RI classes so it will
use the CXF ones instead -->
<class-loader delegate="false" />
</glassfish-web-app>
这会给我的泽西岛客户造成不良影响:
2011 Oct 19 15:04:16,994 MDT [http-thread-pool-80(3)] ERROR my.company.MyServlet - Error testing JerseyClient
java.lang.NoSuchMethodError: com.sun.jersey.core.spi.component.ProviderServices.<init>(Ljava/lang/Class;Lcom/sun/jersey/core/spi/component/ProviderFactory;Ljava/util/Set;Ljava/util/Set;)V
at com.sun.jersey.api.client.Client.init(Client.java:242)
at com.sun.jersey.api.client.Client.access$000(Client.java:118)
at com.sun.jersey.api.client.Client$1.f(Client.java:191)
at com.sun.jersey.api.client.Client$1.f(Client.java:187)
at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193)
at com.sun.jersey.api.client.Client.<init>(Client.java:187)
at com.sun.jersey.api.client.Client.<init>(Client.java:170)
at com.sun.jersey.api.client.Client.create(Client.java:679)
at my.company.MyJerseyClient.<init>(MyJerseyClient.java:93)
由于泽西岛图书馆被列入战争(并且预计不会在Glassfish中提供),我不明白这一点。
如果我不包含glassfish-web.xml
文件,Jersey客户端工作正常,但我在CXF客户端上收到此错误:
2011-10-19T15:00:53.993-0600|WARNING|glassfish3.1.1|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=32;_ThreadName=Thread-2;|StandardWrapperValve[my-servlet]: PWC1406: Servlet.service() for servlet my-servlet threw exception
java.lang.ClassCastException: com.sun.xml.ws.client.sei.SEIStub cannot be cast to org.apache.cxf.frontend.ClientProxy
at org.apache.cxf.frontend.ClientProxy.getClient(ClientProxy.java:93)
at my.company.MyCXFClient.<init>(MyCXFClient.java:53)
是否可以在同一场战争中部署(和工作)这两个库?
答案 0 :(得分:0)
这是不可能的。因为客户端部分依赖于jax-rs api并且你不能有一个war使用的两个不同的jax-rs实现,除非你用单独的类加载器完全隔离它们,因为jax-rs api本身指向一个实现(和对于某些工厂对象,不能指向两个实现。
更新:糟糕,我看到你正在使用一个用于SOAP而另一个用于REST。这可能有用,但我不确定。尝试执行以下操作: