wsdl2rest call with Apache Camel using spring boot --> How To Fix : Cast Error?

Viewed 340

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

enter image description here

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

0 Answers
Related