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

橙三吉。 提交于 2019-12-12 03:01:30

问题


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.


回答1:


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. 


来源:https://stackoverflow.com/questions/24434052/failed-to-parse-wsdl-during-deploying-app-on-jboss-maybe-woodstox

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!