132

I'm trying to create a bean from sources that were generated by wsdl2java.

Every time I try to run my Spring Boot app, I get the following error:

Caused by: java.lang.ClassCastException: class org.apache.cxf.endpoint.ClientImpl cannot be cast to class com.xignite.services.XigniteCurrenciesSoap (org.apache.cxf.endpoint.ClientImpl and com.xignite.services.XigniteCurrenciesSoap are in unnamed module of loader 'app')

I'm not sure how exactly I'm to include generated sources in my main Spring Boot application as a module.

My directory structure is:

├── build
│   └── generatedsources
│       └── src
│           └── main
│               └── java
│                   └── com
│                       └── xignite
│                           └── services
│      
└── src
    └── main
        ├── java
        │   └── io
        │       └── mateo
        │           └── stackoverflow
        │               └── soapconsumption
        └── resources
           └── wsdls

Relevant system info:

openjdk version "11.0.1" 2018-10-16
OpenJDK Runtime Environment 18.9 (build 11.0.1+13)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)
  • Spring Boot 2.1.2.RELEASE
  • Gradle 5.2

I've also uploaded the project onto Github here: https://github.com/ciscoo/soap-consumption-spring-boot

Johannes Kuhn
  • 14,778
  • 4
  • 49
  • 73
Cisco
  • 20,972
  • 5
  • 38
  • 60
  • 1
    not very sure about wsdl here...but, did you try adding a `module-info.java` to your project and/or ensure that the module you're depending upon (for classes `org.apache.cxf.endpoint.ClientImpl`) is resolved on the modulepath rather than the classpath. – Naman Feb 05 '19 at 14:54
  • 28
    There is no “*because*” in the error message. All this addendum tells you, is, that both classes are located in the same module, the unnamed module of loader 'app', which helps the reader to understand that this problem is entirely unrelated to modules. `ClientImpl` simply is not a subtype of `XigniteCurrenciesSoap`; it's an ordinary `ClassCastException`. – Holger Feb 10 '19 at 13:08
  • 5
    In my case it was a little bit different. Class Cast Exception sometime happen because of the conflict between different version of the java. in pom.xml i set to use "1.8 but in Intellje IDE i set to use java version 11. after changing java version from 11 to 8 problem solved for me. – Saman Salehi Jun 13 '21 at 15:36
  • I was using Kotlin alongside Java , simply recompiling the kotlin class resolved the issue – Harsh May 31 '22 at 07:58

5 Answers5

77

I had a similar case, and (as mentioned by @Holger in the comment) the module info in the message is simply misleading - this is an actual case of trying to cast something to something that doesn't match it.

In your case, ClientImpl simply is not a subtype of XigniteCurrenciesSoap.

orirab
  • 2,915
  • 1
  • 24
  • 48
  • 8
    I had a similar problem and thought it was impossible to be a ClassCastException. After finding this answer I properly examed the exception again and it turned out I was extending from a superclass with a same name in a different package. So even though it might look like a different problem, it really is a ClassCastException. – Maarten Meeusen Dec 19 '19 at 10:04
  • 3
    At the time I asked the question, I was still fairly new with Apache CXF. The reason for the class cast exception was because I was using JaxWsClientFactoryBean instead of JaxWsProxyFactoryBean. The former returns a ClientImpl while the latter returns a proxy that you must cast. I'm working on something new for work and remembered this question. – Cisco Jan 13 '21 at 04:39
  • 2
    In my case, I am trying to convert List to List and am getting same problem – cd491415 Oct 17 '21 at 22:08
  • In my case, there are 2 similar classes in the *test* & *app* modules of my project, and it was trying to cast `MyClass` from the *app* module to the `MyClass` from the *test* one. Since the *app* had been updated recently, I got to transfer the `MyClass` changes into the *test* module, and now it works! @Holger & @orirab, thanks for your hints! :) – Katia Savina Jul 13 '23 at 09:48
  • I faced this error during a migration of an old application written in Spring 3 running fine in Java 8 and JBoss EAP 7.4, to Spring 5 / Java 11 / Wildfly 26.1.3. The old application was having some java classes generated from wsdl with xjc on jdk8 for a SOAP webservice that caused the above problem. In order to solve I have needed to regenerate the classes with jdk11 by using maven jaxb2-maven-plugin 2.5.0 version. That plugin version was needed due to generate classes with `import javax.xml.bind.*` and maintain the application dependency with jakarta.xml.bind-api 2.3.3 – fl4l Aug 17 '23 at 15:05
2

The stacktrace is trying to tell you that you have casted XigniteCurrenciesSoap to ClientImpl.

Such as the example below:

Object returnObj= getXigniteCurrenciesSoap();
return (ClientImpl) returnObj;

You have to find out where you did that in your code and fix it.

Caio Oliveira
  • 1,243
  • 13
  • 22
1

I was getting very similar above exception.

java.lang.ClassCastException: class [B cannot be cast to class org.apache.avro.generic.GenericRecord ([B is in module java.base of loader 'bootstrap'; org.apache.avro.generic.GenericRecord is in unnamed module of loader org.springframework.boot.loader.LaunchedURLClassLoader 

Root cause was my Gradle dependency had exclude statement, i.e.

exclude group: 'org.springframework.cloud', module: 'spring-cloud-stram-binder-kafka',

I commented it as below and things were working fine after that:

implementation ('com.xyz.lux:lux-acitor:1.25.0') {
  //exclude group: 'org.springframework.cloud', module: 'spring-cloud-stream-binder-kafka'
  exclude group: 'org.slf4j', module: 'slf4j-reload4j'
  exclude group: 'io.confluent', module: 'confluent-log4j'
}
aSemy
  • 5,485
  • 2
  • 25
  • 51
Sanjay Tank
  • 103
  • 9
0

I had the same problem. The problem in my case was that I already had a class with the same name in another place. So try changing the class name.

zaher
  • 15
  • 1
  • 5
0

I had the same issue using spring cloud stream kafka, when i tried to consume the message it throw the exception.

In my case, it is because Spring boot needed any kind of dependency which would allow the Serde (serialisation or deserialisation). Just added the json one.

       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
            <version>3.0.2</version>
            <scope>compile</scope>
        </dependency>

after that i was able to keep moving forward. Remember if you have Spring Web dependency then this above dependency is automatically included