在jboss上部署应用程序期间无法解析WSDL - 也许是Woodstox

时间:2014-06-26 15:06:17

标签: maven wsdl cxf apache-camel jboss7.x

我在jboss上部署应用程序时遇到了问题。我发现一些信息,改变woodstox的版本可能有所帮助,但它不是...... 经度:

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]

我完全不知道还能检查什么...我的环境:

  • svn 1.7.9(r1462340)Apache Maven 3.1.1
  • (0728685237757ffbf44136acec0402957f723d9a; 2013-09-17 Maven home:
  • Java版本:1.7.0_45,供应商:Oracle Corporation操作系统名称:“linux”,
  • 版本:“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)
  • 在jboss里面的Woodstox:4.1.1(我将它改为4.2.1和4.2.0)

我的wsdl定义:

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

和端点:

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

当我调试时,我发现了一些属性,称为: org.apache.cxf.stax.allowInsecureParser。如何设置为true?在这些情况下,解析wsdl可能不会有任何问题。

1 个答案:

答案 0 :(得分:0)

这个解决方法对我来说很好:

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

来自: CXF 2.7.x Woodstox Compatibility via Maven

我发现在我的依赖项中我正确的lib:4-2-0,但我不知道为什么jboss从某处使用另一个lib ...在我看来更好的解决方案是将jboss设置为jboss不会覆盖库。在另一个案例中,我仍然会收到这样的警告:

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. 
相关问题