I am doing kind of gateway project with wsdl using xcf , camel and spring boot(maven).My plan all about ;
1-I used xcf for extract the wsdl classes on my target folder. 2-Also ı manage to configure my rest route using camel's Exchange,Process
And my problem is when ı try to make request on my localhost:9090/personnel/50 I am facing that Fault.
org.apache.cxf.interceptor.Fault: class localhost.wsdls_akademikpersonel.akademikpersonelsorgulav1.TcKimlikNodanAkademikPersonelBilgisiv1 cannot be cast to class java.lang.Long (localhost.wsdls_akademikpersonel.akademikpersonelsorgulav1.TcKimlikNodanAkademikPersonelBilgisiv1 is in unnamed module of loader 'app'; java.lang.Long is in module java.base of loader 'bootstrap')
at org.apache.cxf.jaxws.interceptors.WrapperClassOutInterceptor.handleMessage(WrapperClassOutInterceptor.java:107)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:530)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:434)
at org.apache.camel.component.cxf.CxfProducer.process(CxfProducer.java:117)
at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:169)
at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:404)
at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:148)
at org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:60)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:147)
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:287)
at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:83)
at org.apache.camel.support.AsyncProcessorSupport.process(AsyncProcessorSupport.java:41)
at org.apache.camel.component.undertow.UndertowConsumer.handleRequest(UndertowConsumer.java:233)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:370)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:836)
at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.ClassCastException: class localhost.wsdls_akademikpersonel.akademikpersonelsorgulav1.TcKimlikNodanAkademikPersonelBilgisiv1 cannot be cast to class java.lang.Long (localhost.wsdls_akademikpersonel.akademikpersonelsorgulav1.TcKimlikNodanAkademikPersonelBilgisiv1 is in unnamed module of loader 'app'; java.lang.Long is in module java.base of loader 'bootstrap')
at localhost.wsdls_akademikpersonel.akademikpersonelsorgulav1.TcKimlikNodanAkademikPersonelBilgisiv1_WrapperTypeHelper1.createWrapperObject(Unknown Source)
at org.apache.cxf.jaxws.interceptors.WrapperClassOutInterceptor.handleMessage(WrapperClassOutInterceptor.java:91)
... 20 more
FYI My base project was "https://dzone.com/articles/soap-transformation-with-apache-camel-java-dsl"
And I did Some Modify For Pom.xml like
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.6.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.rmendes</groupId>
<artifactId>camel-soap2rest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>camel-soap2rest</name>
<description>Apache Camel Simple Soap2Rest convertes</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
<!-- <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
-->
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-cxf-starter</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-core</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-soap</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-rest-starter</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-rest-openapi-starter</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-undertow-starter</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-http</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-swagger-java</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>swagger-ui</artifactId>
<version>3.38.0</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>webjars-locator</artifactId>
<version>0.40</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-swagger-java</artifactId>
<version>3.5.0</version>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<wsdlOptions>
<wsdlOption>
<wsdl>src/main/resources/PersonelSorgulama.wsdl</wsdl>
<extraargs>
<extraarg>-p</extraarg>
<extraarg>personelSorgulama</extraarg>
</extraargs>
<extraargs>
<extraarg>-autoNameResolution</extraarg>
</extraargs>
</wsdlOption>
<wsdlOption>
<wsdl>src/main/resources/Asbs_External_ConnectionsSoap12.wsdl</wsdl>
<extraargs>
<extraarg>-p</extraarg>
<extraarg>asbsExternal</extraarg>
</extraargs>
</wsdlOption>
<wsdlOption>
<wsdl>src/main/resources/KurumsalWebServices.wsdl</wsdl>
<extraargs>
<extraarg>-p</extraarg>
<extraarg>KurumsalWebServices</extraarg>
</extraargs>
<extraargs>
<extraarg>-autoNameResolution</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
PersonnelSorgulama.wsdl is my temp
<element name="tcKimlikNodan_Akademik_Personel_Bilgisiv1">
<complexType>
<sequence>
<element name="TC_KIMLIK_NO" type="xsd:long"/>
</sequence>
</complexType>
</element>
<element name="tcKimlikNodan_Akademik_Personel_Bilgisiv1Response">
<complexType>
<sequence>
<element name="AkademikPersonel" type="impl:AkademikPersonel"/>
<element name="Sonuc" type="impl:Sonuc"/>
</sequence>
</complexType>
</element>
<complexType name="AkademikPersonel">
<sequence>
<element name="TC_KIMLIK_NO" type="xsd:long" nillable="true"/>
<element name="ADI" type="xsd:string" nillable="true"/>
<element name="SOYADI" type="xsd:string" nillable="true"/>
<element name="KADRO_UNVAN" type="xsd:string" nillable="true"/>
<element name="BIRIM_ID" type="xsd:long" nillable="true"/>
</sequence>
</complexType>
<complexType name="Sonuc">
<sequence>
<element name="DurumAciklama" type="xsd:string" nillable="true"/>
</sequence>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="tcKimlikNodan_Akademik_Personel_Bilgisiv1Request">
<wsdl:part name="parameters" element="impl:tcKimlikNodan_Akademik_Personel_Bilgisiv1"/>
</wsdl:message>
<wsdl:message name="tcKimlikNodan_Akademik_Personel_Bilgisiv1Response">
<wsdl:part name="parameters" element="impl:tcKimlikNodan_Akademik_Personel_Bilgisiv1Response"/>
</wsdl:message>
<wsdl:portType name="AkademikPersonelSorgulav1_PortType">
<wsdl:operation name="tcKimlikNodan_Akademik_Personel_Bilgisiv1">
<wsdl:input name="tcKimlikNodan_Akademik_Personel_Bilgisiv1Request" message="impl:tcKimlikNodan_Akademik_Personel_Bilgisiv1Request"/>
<wsdl:output name="tcKimlikNodan_Akademik_Personel_Bilgisiv1Response" message="impl:tcKimlikNodan_Akademik_Personel_Bilgisiv1Response"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="WSDLs_AkademikPersonel_AkademikPersonelSorgulav1_PortSoapBinding" type="impl:AkademikPersonelSorgulav1_PortType">
<wsdlsoap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<wsdl:operation name="tcKimlikNodan_Akademik_Personel_Bilgisiv1">
<wsdlsoap:operation soapAction="WSDLs_AkademikPersonel_AkademikPersonelSorgulav1_Binder_tcKimlikNodan_Akademik_Personel_Bilgisiv1"/>
<wsdl:input name="tcKimlikNodan_Akademik_Personel_Bilgisiv1Request">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="tcKimlikNodan_Akademik_Personel_Bilgisiv1Response">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
XCF created IMPL
/**
* This class was generated by Apache CXF 3.4.2
* 2021-03-17T16:18:11.788+03:00
* Generated source version: 3.4.2
*
*/
@WebService(targetNamespace = "http://localhost/WSDLs.AkademikPersonel:AkademikPersonelSorgulav1", name = "AkademikPersonelSorgulav1_PortType")
@XmlSeeAlso({ObjectFactory.class})
public interface AkademikPersonelSorgulav1PortType {
@WebMethod(operationName = "tcKimlikNodan_Akademik_Personel_Bilgisiv1", action = "WSDLs_AkademikPersonel_AkademikPersonelSorgulav1_Binder_tcKimlikNodan_Akademik_Personel_Bilgisiv1")
@RequestWrapper(localName = "tcKimlikNodan_Akademik_Personel_Bilgisiv1", targetNamespace = "http://localhost/WSDLs.AkademikPersonel:AkademikPersonelSorgulav1", className = "localhost.wsdls_akademikpersonel.akademikpersonelsorgulav1.TcKimlikNodanAkademikPersonelBilgisiv1")
@ResponseWrapper(localName = "tcKimlikNodan_Akademik_Personel_Bilgisiv1Response", targetNamespace = "http://localhost/WSDLs.AkademikPersonel:AkademikPersonelSorgulav1", className = "localhost.wsdls_akademikpersonel.akademikpersonelsorgulav1.TcKimlikNodanAkademikPersonelBilgisiv1Response")
public void tcKimlikNodanAkademikPersonelBilgisiv1(
@WebParam(name = "TC_KIMLIK_NO", targetNamespace = "")
long tcKIMLIKNO,
@WebParam(mode = WebParam.Mode.OUT, name = "AkademikPersonel", targetNamespace = "")
javax.xml.ws.Holder<AkademikPersonel> akademikPersonel,
@WebParam(mode = WebParam.Mode.OUT, name = "Sonuc", targetNamespace = "")
javax.xml.ws.Holder<Sonuc> sonuc
);
}
**Also My Structure And classes Fyi **
CxfBeans.java
@Configuration
public class CxfBeans {
@Value("${endpoint.wsdl}")
private String SOAP_URL;
@Bean(name = "cxfConvertTemp")
public CxfEndpoint buildCxfEndpoint() {
CxfEndpoint cxf = new CxfEndpoint();
//String thePath = URLEncoder.encode(SOAP_URL, StandardCharsets.UTF_8);
cxf.setAddress(SOAP_URL);
cxf.setServiceClass(AkademikPersonelSorgulav1PortType.class);
return cxf;
}
}
RestConfig.java
@Component
public class RestConfig extends RouteBuilder{
@Override
public void configure() throws Exception {
restConfiguration()
.component("undertow").host("localhost").port(9090).bindingMode(RestBindingMode.auto).scheme("http")
.dataFormatProperty("prettyPrint", "true")
.contextPath("/")
.apiContextPath("/api-doc")
.apiProperty("api.title", "Camel2Soap")
.apiProperty("api.version", "1.0")
.apiProperty("host","")
.enableCORS(false);
rest("/personnel")
.get("/{num}")
.consumes("text/plain").produces("text/plain")
.description("Verify Personnel")
.param().name("num").type(RestParamType.path).description("Personnel Tkcn").dataType("long").endParam()
.to("direct:verify-personnel");
}
Soap2Rest.java
@Component
public class Soap2Rest extends RouteBuilder{
@Override
public void configure() throws Exception {
from("direct:verify-personnel")
.removeHeaders("CamelHttp*")
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
TcKimlikNodanAkademikPersonelBilgisiv1 c = new TcKimlikNodanAkademikPersonelBilgisiv1();
Object obj = exchange.getIn().getHeader("num");
c.setTCKIMLIKNO(123);
long pass = 123;
//c.setTCKIMLIKNO(Long.valueOf( exchange.getIn().getHeader("num").toString()));
exchange.getIn().setBody(c);
}
})
.setHeader(CxfConstants.OPERATION_NAME, constant("{{endpoint.personnel.verify.method}}"))
.setHeader(CxfConstants.OPERATION_NAMESPACE, constant("{{endpoint.namespace}}"))
.to("cxf:bean:cxfConvertTemp")
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
MessageContentsList response = (MessageContentsList) exchange.getIn().getBody();
TcKimlikNodanAkademikPersonelBilgisiv1Response r = (TcKimlikNodanAkademikPersonelBilgisiv1Response) response.get(0);
exchange.getIn().setBody("Adı: "+r.getAkademikPersonel().getADI());
}
})
.to("mock:output");
}
application.properties
endpoint.personnel.verify.method=tcKimlikNodan_Akademik_Personel_Bilgisiv1
logging.level.root=INFO
endpoint.namespace=*****I CHECKED IT IS OK*******
endpoint.wsdl=*****I CHECKED IT IS OK*******
Lets find it boys&girls :DD