CXF - ClassCastException (SEIStub/ClientProxy)
Asked Answered
S

7

15

I'm trying to build a client jar file to access a webservice. I'm including the jar in a servlet/war that makes the client webservice calls. I'm getting the following error:

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)

I came across this post http://yaytay.wordpress.com/2010/03/06/lsned-29-persuading-jdk-6-to-use-cxf-classes-rather-than-its-own-avoiding-seistub/ which says to fix the problem you need to include cxf-rt-frontend-jaxws as a dependency, which I do. So, that isn't the problem/solution in my case.

My client jar pom has these dependencies:

<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>

The servlet war contains the following in its 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

I've also read some posts that talk about a javax.xml.ws.spi.Provider file, but haven't been able to find any references that detail what it should be named, contain and placed.

Can anybody point me in the right direction?

Szombathely answered 14/4, 2011 at 22:13 Comment(0)
S
8

The solution was to include a sun-web.xml (or glassfish-web.xml) file in the war WEB-INF. See How to pick CXF over Metro on Glassfish

EDIT

Contents of 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> 
Szombathely answered 7/12, 2011 at 21:55 Comment(4)
I swear to God, if this works for me, you've got some bounty rolling your way ;)Aquiline
Can you post the xml files that worked for you? Or at least the relevant parts?Aquiline
Thanks for the bounty. I'm just glad my answer was useful to someone else since I've found the answers to many of my questions from SO.Szombathely
Is there a way to do that programmatically?Maximalist
B
4

Remove JAX-WS Libraries from buildpath, so this can resolves my problem that is (ClassCastException) SEIStub to ClientProxy.

Bifoliate answered 19/9, 2014 at 2:27 Comment(0)
C
3

If all else fails, you can use reflection to override the delegate of the service.

        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();
Cherycherye answered 8/8, 2015 at 10:39 Comment(3)
(relevant question: #6364833 )Cherycherye
I am trying this, but I am getting: NoSuchField delegateMaximalist
Are you sure you're using the right Service.class? The fully qualified name is javax.xml.ws.Service. I sure hope this implementation detail didn't changeCherycherye
S
3

I just had this issue while upgrading our application to Java 11. In the end it turned out that we had some weired dependency setup and two "conflicting" libs:

cxf-rt-frontend-simple vs. cxf-rt-frontend-jaxws

So I removed all the simple dependencies and replaced them with jaxws and now all is fine ->

<dependency>
 <groupId>org.apache.cxf</groupId>
 <artifactId>cxf-rt-frontend-jaxws</artifactId>
 <version>${cxf.version}</version>
</dependency>

Credits to this blog post -> http://www.littlebigextra.com/exception-how-to-resolve-com-sun-xml-internal-ws-client-sei-seistub-cannot-be-cast-to-org-apache-cxf-frontend-clientproxy/

For further reading I recommend this thread on Java >8 migrations: Replacements for deprecated JPMS modules with Java EE APIs

Stormi answered 14/11, 2018 at 16:19 Comment(0)
B
1

I tried CXF in the past and came across strange exceptions like this one. I assume you already tried CXF mailing list.

I would try to go slow: start with a working example from the CFX distribution and make one change at a time until you get to the problem.

Bistre answered 15/4, 2011 at 0:56 Comment(0)
P
1

Instead of using constructor

Cebbcws ws = new Cebbcws();
CebbcwsPortType wsport = ws.getCebbcwsPort();

Invoke the service using JaxWsProxyFactoryBean

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.getClientFactoryBean().getServiceFactory().setWsdlURL(Cebbcws.WSDL_LOCATION);
factory.setServiceName(Cebbcws.SERVICE);
factory.setEndpointName(Cebbcws.CebbcwsPort);
CebbcwsPortType wsport = factory.create(CebbcwsPortType.class);

Source: https://mcmap.net/q/298059/-jax-ws-when-apache-cxf-is-installed-it-quot-steals-quot-default-jdk-jax-ws-implementation-how-to-solve

Pankey answered 14/11, 2019 at 11:44 Comment(0)
M
0

This error also happened while migrating to sbt 1.3.6 with OpenJdk 11.

But acually I was using:

"com.sun.xml.ws" % "jaxws-ri" % "xxx"

and replacing with apache's jaxws fixes the error:

"org.apache.cxf" % "cxf-rt-frontend-jaxrs" % "3.3.0"
Malorie answered 8/1, 2020 at 16:48 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.