CXF-ClassCastException (SEIStub/ClientProxy)
Я пытаюсь создать файл jar клиента для доступа к веб-сервису. Я включаю jar в сервлет / war, который делает вызовы веб-службы клиента. Я получаю следующую ошибку:
INFO: 2011 Apr 14 14:57:32,780 MDT [http-thread-pool-8181(4)] ERROR my.package.ClientServlet - Caught 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.package.Client.<init>(Client.java:54)
at my.package.ClientServlet.testService(TestServlet.java:118)
я наткнулся на этот пост http://yaytay.wordpress.com/2010/03/06/lsned-29-persuading-jdk-6-to-use-cxf-classes-rather-than-its-own-avoiding-seistub/ который говорит, чтобы исправить проблему, вам нужно включить cxf-rt-frontend-jaxws
как зависимость, что я и делаю. Так, это не проблема/решение в моем случае.
мой клиент jar pom имеет следующие зависимости:
<properties>
<cxf.version>2.3.3</cxf.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-security</artifactId>
<version>${cxf.version}</version>
</dependency>
</dependencies>
война сервлетов содержит в своем lib следующее:
asm-3.3.jar
bcprov-jdk15-1.45.jar
commons-logging-1.1.1.jar
cxf-api-2.3.3.jar
cxf-common-schemas-2.3.3.jar
cxf-common-utilities-2.3.3.jar
cxf-rt-bindings-soap-2.3.3.jar
cxf-rt-bindings-xml-2.3.3.jar
cxf-rt-core-2.3.3.jar
cxf-rt-databinding-jaxb-2.3.3.jar
cxf-rt-frontend-jaxws-2.3.3.jar
cxf-rt-frontend-simple-2.3.3.jar
cxf-rt-ws-addr-2.3.3.jar
cxf-rt-ws-security-2.3.3.jar
cxf-tools-common-2.3.3.jar
geronimo-javamail_1.4_spec-1.7.1.jar
jaxb-impl-2.1.13.jar
log4j-1.2.14.jar
neethi-2.0.4.jar
my-client-cxf-1.0.jar
serializer-2.7.1.jar
slf4j-api-1.4.2.jar
slf4j-log4j12-1.4.2.jar
stax2-api-3.0.2.jar
woodstox-core-asl-4.0.8.jar
wsdl4j-1.6.2.jar
wss4j-1.5.11.jar
xalan-2.7.1.jar
xml-resolver-1.2.jar
XmlSchema-1.4.7.jar
xmlsec-1.4.4.jar
Я также читал некоторые сообщения, которые говорят о javax.xml.ws.spi.Provider
файл, но не смогли найти никаких ссылок, которые подробно описывают, что он должен быть назван, содержать и помещен.
может ли кто-нибудь указать мне в правильном направлении?
4 ответов
решение состояло в том, чтобы включить sun-web.xml (или glassfish-web.xml) файл в war WEB-INF. См.Как выбрать CXF над метро на Glassfish
редактировать
содержимое 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>
Если все остальное не удается, можно использовать отражение для переопределения делегата службы.
QName qName = new QName(wsTargetNamespace, wsName);
service = new YourServiceScheduler(loc, qName);
Field delegateField = Service.class.getDeclaredField("delegate");
delegateField.setAccessible(true);
ServiceDelegate previousDelegate = (ServiceDelegate)delegateField.get(service);
if(!previousDelegate.getClass().getName().contains("cxf")) {
ServiceDelegate serviceDelegate = ((Provider) Class.forName("org.apache.cxf.jaxws.spi.ProviderImpl").newInstance())
.createServiceDelegate(loc, qName, service.getClass());
log.info("The " + getClass().getSimpleName() + " delegate is changed from " + "[" + previousDelegate + "] to [" +
serviceDelegate +
"]");
delegateField.set(service, serviceDelegate);
}
port = service.getYourServiceSoap();
Я пробовал CXF в прошлом и наткнулся на странные исключения, подобные этому. Я предполагаю, что вы уже пробовали список рассылки CXF.
Я бы попытался идти медленно: начните с рабочего примера из дистрибутива CFX и внесите одно изменение за раз, пока не доберетесь до проблемы.
удалите библиотеки JAX-WS из buildpath, чтобы это могло решить мою проблему (ClassCastException
) SEIStub для ClientProxy.