Search code examples
mavenwsdlcxfapache-cameljboss7.x

Failed to parse WSDL during deploying app on jboss - maybe Woodstox


I've a problem during deploying application on jboss. I found some information that changing version of woodstox might help, but it wasn't... Log:

16:58:09,079 INFO  [stdout] (MSC service thread 1-2) [org.apache.cxf.service.factory.ReflectionServiceFactoryBean] Failed to parse WSDL
16:58:09,080 INFO  [stdout] (MSC service thread 1-2) javax.wsdl.WSDLException: WSDLException: faultCode=PARSER_ERROR: java.lang.RuntimeException: Cannot create a secure XMLInputFactory
16:58:09,080 INFO  [stdout] (MSC service thread 1-2)    at org.apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.java:257)

16:58:09,104 INFO  [stdout] (MSC service thread 1-2) Caused by: java.lang.RuntimeException: Cannot create a secure XMLInputFactory
16:58:09,104 INFO  [stdout] (MSC service thread 1-2)    at org.apache.cxf.staxutils.StaxUtils.createXMLInputFactory(StaxUtils.java:312)

16:58:09,514 ERROR [org.springframework.web.context.ContextLoader] (MSC service thread 1-2) Context initialization failed: org.apache.camel.FailedToCreateProducerException: Failed to create Producer for endpoint: Endpoint[cxf://bean:adapter.NotificationService?dataFormat=PAYLOAD]. Reason: org.apache.cxf.service.factory.ServiceConstructionException: No valid WSDL classpath:/interface/adapter/notification-service/v10/NotificationService.wsdl nor service class is specified.
        at org.apache.camel.impl.ProducerCache.doGetProducer(ProducerCache.java:409) [camel-core-2.12.3.jar:2.12.3]
        at org.apache.camel.impl.ProducerCache.acquireProducer(ProducerCache.java:123) [camel-core-2.12.3.jar:2.12.3]

I've absolutely no idea what else can i check... My environment:

  • svn 1.7.9 (r1462340) Apache Maven 3.1.1
  • (0728685237757ffbf44136acec0402957f723d9a; 2013-09-17 Maven home:
  • Java version: 1.7.0_45, vendor: Oracle Corporation OS name: "linux",
  • version: "3.11.0-12-generic", arch: "amd64", family: "unix" javac
  • 1.7.0_45 java version "1.7.0_45" Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
  • Woodstox inside jboss: 4.1.1 (I was changing it to 4.2.1 and 4.2.0)

My wsdl definition:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions name="NotificationService"
    targetNamespace="http://service/NotificationService/v10"
    xmlns:tns="http://service/NotificationService/v10"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">

    <wsdl:types>
        <xs:schema
            targetNamespace="http://service/NotificationService/v10">
            <xs:include schemaLocation="NotificationService.xsd" />
        </xs:schema>
    </wsdl:types>

    <!-- notifyPaymentStatus message-->

    <wsdl:message name="notifyPaymentStatusParameters">
        <wsdl:part name="notifyPaymentStatusPart" element="tns:notifyPaymentStatusRQ">
        </wsdl:part>
    </wsdl:message>
    <wsdl:message name="notifyPaymentStatusResult">
        <wsdl:part name="notifyPaymentStatusPart" element="tns:notifyPaymentStatusRS">
        </wsdl:part>
    </wsdl:message>


    <!-- notifyError message-->

    <wsdl:message name="notifyErrorParameters">
        <wsdl:part name="notifyErrorPart" element="tns:notifyErrorRQ">
        </wsdl:part>
    </wsdl:message>
    <wsdl:message name="notifyErrorResult">
        <wsdl:part name="notifyErrorPart" element="tns:notifyErrorRS">
        </wsdl:part>
    </wsdl:message>


    <wsdl:portType name="NotificationService">
        <wsdl:operation name="notifyPaymentStatus">
            <wsdl:input name="notifyPaymentStatusParameters" message="tns:notifyPaymentStatusParameters" />
            <wsdl:output name="notifyPaymentStatusResult" message="tns:notifyPaymentStatusResult" />
        </wsdl:operation>
        <wsdl:operation name="notifyError">
            <wsdl:input name="notifyErrorParameters" message="tns:notifyErrorParameters" />
            <wsdl:output name="notifyErrorResult" message="tns:notifyErrorResult" />
        </wsdl:operation>
    </wsdl:portType>

    <wsdl:binding name="NotificationServiceBinding" type="tns:NotificationService">
        <soap:binding style="document"
            transport="http://schemas.xmlsoap.org/soap/http" />
        <wsdl:operation name="notifyPaymentStatus">
            <soap:operation soapAction="" />
            <wsdl:input>
                <soap:body use="literal" />
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal" />
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="notifyError">
            <soap:operation soapAction="" />
            <wsdl:input>
                <soap:body use="literal" />
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal" />
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>

    <wsdl:service name="NotificationService">
        <wsdl:port name="NotificationServicePort" binding="tns:NotificationServiceBinding">
            <soap:address location="http://www.example.org/" />
        </wsdl:port>
    </wsdl:service>


</wsdl:definitions>

and endpoint:

<cxf:cxfEndpoint id="adapter.NotificationService"
    endpointName="s:NotificationServicePort" serviceName="s:NotificationService"
    wsdlURL="classpath:/interface/adapter/notification-service/v10/NotificationService.wsdl"
    xmlns:s="http://service/NotificationService/v10">
    <cxf:properties>
        <entry key="schema-validation-enabled"
            value="true" />
    </cxf:properties>
    <cxf:inInterceptors>
        <ref bean="logInInterceptor" />
    </cxf:inInterceptors>
    <cxf:inFaultInterceptors>
        <ref bean="logInInterceptor" />
    </cxf:inFaultInterceptors>
    <cxf:outInterceptors>
        <ref bean="logOutInterceptor" />
    </cxf:outInterceptors>
    <cxf:outFaultInterceptors>
        <ref bean="logOutInterceptor" />
    </cxf:outFaultInterceptors>
</cxf:cxfEndpoint>

When i was debugging i found some property, which is called: org.apache.cxf.stax.allowInsecureParser. How can I set it on true? In these case probably I won't have any problems with parsing wsdl.


Solution

  • this one workaround works fine for me:

    <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetObject">
            <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
                <property name="targetClass" value="java.lang.System" />
                <property name="targetMethod" value="getProperties" />
            </bean>
        </property>
        <property name="targetMethod" value="putAll" />
        <property name="arguments">
            <util:properties>
                <prop key="org.apache.cxf.stax.allowInsecureParser">true</prop>
            </util:properties>
        </property>
    </bean>
    

    from : CXF 2.7.x Woodstox Compatibility via Maven

    I found that in my dependencies I've correct lib: 4-2-0, but I don't know why jboss is using another lib from somewhere... In my opinion better sollution would be to set on jboss to not overwrite libraries. In another case I'm still getting warning like this:

    2014-06-27 12:59:58,932 WARN  (MSC service thread 1-16) [org.apache.cxf.staxutils.StaxUtils] Could not create a secure Stax XMLInputFactory.  Found class com.ctc.wstx.stax.WstxInputFactory.  Suggest Woodstox 4.2.0 or newer.