Hi Camel-Riders,
we are (still) using SMX4.5 (Camel 2.10.7) and are trying to proxy a
SOAP call to external URL (plus reading statistics from input
message). For offline testing we have created a SoapUI mock target and
we declare schemaLocations inside the cxfEndpoint. Unfortunately the
schemata are not read at time of cxfEndpoint consumer creation:
15:36:40,366 WARN [ReflectionServiceFactoryBean] Failed to parse WSDL
javax.wsdl.WSDLException: WSDLException (at
/wsdl:definitions/wsdl:types/xsd:schema): faultCode=PARSER_ERROR:
Problem parsing
'https://newskies-test.someairline.com/SessionManager.svc?xsd=xsd1'.:
java.net.UnknownHostException: newskies-test.someairline.com
at com.ibm.wsdl.xml.WSDLReaderImpl.getDocument(WSDLReaderImpl.java:2198)
at com.ibm.wsdl.xml.WSDLReaderImpl.parseSchema(WSDLReaderImpl.java:830)
at com.ibm.wsdl.xml.WSDLReaderImpl.parseSchema(WSDLReaderImpl.java:654)
at com.ibm.wsdl.xml.WSDLReaderImpl.parseTypes(WSDLReaderImpl.java:610)
at com.ibm.wsdl.xml.WSDLReaderImpl.parseDefinitions(WSDLReaderImpl.java:320)
at com.ibm.wsdl.xml.WSDLReaderImpl.readWSDL(WSDLReaderImpl.java:2352)
at com.ibm.wsdl.xml.WSDLReaderImpl.readWSDL(WSDLReaderImpl.java:2338)
at org.apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.java:245)
at org.apache.cxf.wsdl11.WSDLManagerImpl.getDefinition(WSDLManagerImpl.java:190)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.isEmptywsdl(ReflectionServiceFactoryBean.java:2598)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.isFromWsdl(ReflectionServiceFactoryBean.java:543)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:547)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:265)
at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:101)
at org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:159)
at org.apache.camel.component.cxf.CxfConsumer.<init>(CxfConsumer.java:240)
at org.apache.camel.component.cxf.CxfEndpoint.createConsumer(CxfEndpoint.java:204)
We have dowloaded all corresponding schemata (e.g.
"https://newskies-test.someairline.com/SessionManager.svc?xsd=xsd1")
and referenced them via the schemaLocation config.
Following the endpoint and camelContext:
Endpoint definition:
<!-- this is the CXF web service we use as the front end -->
<cxf:cxfEndpoint id="frontendSessionManager"
address="http://0.0.0.0:8090/SessionManager.svc"
wsdlURL="etc/SessionManager/SessionManager.wsdl"
<!-- WSDL: wsdlURL="etc/SessionManager/SessionManager.wsdl"
wsdlURL="http://localhost:8088/SessionManager.svc?wsdl -->
<cxf:inInterceptors>
<ref bean="loggingInInterceptor" />
</cxf:inInterceptors>
<cxf:outInterceptors>
<ref bean="loggingOutInterceptor" />
<ref bean="sAAJOutInterceptor" />
<!-- ref bean="isb4uStatisticCalculatorInterceptor"/ -->
</cxf:outInterceptors>
<cxf:inFaultInterceptors>
<ref bean="loggingInInterceptor" />
</cxf:inFaultInterceptors>
<cxf:outFaultInterceptors>
<ref bean="loggingOutInterceptor" />
</cxf:outFaultInterceptors>
<cxf:schemaLocations>
<!--
<cxf:schemaLocation>http://localhost:8088/SessionManager.svc?WSDL橪;interface=BasicHttpBinding_ISessionManager橪;part=SessionManager.xsd</cxf:schemaLocation>
<cxf:schemaLocation>classpath:etc/SessionManager/xsd0-serviceContracts-sessionService.xsd</cxf:schemaLocation>
<cxf:schemaLocation>classpath:etc/SessionManager/xsd1-serialization.xsd</cxf:schemaLocation>
<cxf:schemaLocation>classpath:etc/SessionManager/xsd2-dataContracts-sessionService.xsd</cxf:schemaLocation>
<cxf:schemaLocation>classpath:etc/SessionManager/xsd3-webservices.xsd</cxf:schemaLocation>
<cxf:schemaLocation>classpath:etc/SessionManager/xsd4-webservices-dataContracts-common-enumerations.xsd</cxf:schemaLocation>
</cxf:schemaLocations>
<cxf:properties>
<!-- Set the publishedEndpointUrl which could override the service
address from generated WSDL as you want -->
<!--
<entry key="publishedEndpointUrl" value="http://localhost:8090" />
<entry key="synchronous" value="true" />
<!-- enable logging in cxf message mode -->
<entry key="dataFormat" value="MESSAGE" />
<entry key="schema-validation-enabled" value="false" />
</cxf:properties>
</cxf:cxfEndpoint>
CamelContext:
<!-- this is the Camel route which proxies the real web service and
forwards SOAP requests to it -->
<camel:camelContext id="context" streamCache="true" >
<!-- disable stream caching spool to disk -->
<camel:properties>
<camel:property key="CamelCachedOutputStreamThreshold" value="-1" />
</camel:properties>
<camel:endpoint id="backendSessionManager"
uri="http://localhost:8088/SessionManager.svc?httpClient.soTimeout=5000橪;throwExceptionOnFailure=false"
/>
<camel:route id="SessionManager" >
<!-- CXF consumer using MESSAGE format -->
<camel:from uri="cxf:bean:frontendSessionManager?dataFormat=MESSAGE" />
<camel:doTry>
<!-- send proxied request to real web service -->
<camel:to ref="backendSessionManager" />
</camel:doTry>
</camel:route>
</camel:camelContext>
There may be more errors in the definition but the failure to create
the cxfEndpoint consumer due to trying to look-up the schemata from
remote host instead of using the local copies is blocking our
progress.
The Root cause we tracked so far seems to be in
org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromWSDL[1].
whereby the serviceFactory is created up front but schemaLocations are
only read at the end via "initializeDataBindings".
Any idea how to resolve this (i.e. get the cxfEndpoint consumer
started with local schemata) would be welcome!
Regards,
Michael
[1] http://grepcode.com/file/repo1.maven.org/maven2/org.apache.cxf/cxf-bundle/2.7.7/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java#407
we are (still) using SMX4.5 (Camel 2.10.7) and are trying to proxy a
SOAP call to external URL (plus reading statistics from input
message). For offline testing we have created a SoapUI mock target and
we declare schemaLocations inside the cxfEndpoint. Unfortunately the
schemata are not read at time of cxfEndpoint consumer creation:
15:36:40,366 WARN [ReflectionServiceFactoryBean] Failed to parse WSDL
javax.wsdl.WSDLException: WSDLException (at
/wsdl:definitions/wsdl:types/xsd:schema): faultCode=PARSER_ERROR:
Problem parsing
'https://newskies-test.someairline.com/SessionManager.svc?xsd=xsd1'.:
java.net.UnknownHostException: newskies-test.someairline.com
at com.ibm.wsdl.xml.WSDLReaderImpl.getDocument(WSDLReaderImpl.java:2198)
at com.ibm.wsdl.xml.WSDLReaderImpl.parseSchema(WSDLReaderImpl.java:830)
at com.ibm.wsdl.xml.WSDLReaderImpl.parseSchema(WSDLReaderImpl.java:654)
at com.ibm.wsdl.xml.WSDLReaderImpl.parseTypes(WSDLReaderImpl.java:610)
at com.ibm.wsdl.xml.WSDLReaderImpl.parseDefinitions(WSDLReaderImpl.java:320)
at com.ibm.wsdl.xml.WSDLReaderImpl.readWSDL(WSDLReaderImpl.java:2352)
at com.ibm.wsdl.xml.WSDLReaderImpl.readWSDL(WSDLReaderImpl.java:2338)
at org.apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.java:245)
at org.apache.cxf.wsdl11.WSDLManagerImpl.getDefinition(WSDLManagerImpl.java:190)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.isEmptywsdl(ReflectionServiceFactoryBean.java:2598)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.isFromWsdl(ReflectionServiceFactoryBean.java:543)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:547)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:265)
at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:101)
at org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:159)
at org.apache.camel.component.cxf.CxfConsumer.<init>(CxfConsumer.java:240)
at org.apache.camel.component.cxf.CxfEndpoint.createConsumer(CxfEndpoint.java:204)
We have dowloaded all corresponding schemata (e.g.
"https://newskies-test.someairline.com/SessionManager.svc?xsd=xsd1")
and referenced them via the schemaLocation config.
Following the endpoint and camelContext:
Endpoint definition:
<!-- this is the CXF web service we use as the front end -->
<cxf:cxfEndpoint id="frontendSessionManager"
address="http://0.0.0.0:8090/SessionManager.svc"
wsdlURL="etc/SessionManager/SessionManager.wsdl"
<!-- WSDL: wsdlURL="etc/SessionManager/SessionManager.wsdl"
wsdlURL="http://localhost:8088/SessionManager.svc?wsdl -->
<cxf:inInterceptors>
<ref bean="loggingInInterceptor" />
</cxf:inInterceptors>
<cxf:outInterceptors>
<ref bean="loggingOutInterceptor" />
<ref bean="sAAJOutInterceptor" />
<!-- ref bean="isb4uStatisticCalculatorInterceptor"/ -->
</cxf:outInterceptors>
<cxf:inFaultInterceptors>
<ref bean="loggingInInterceptor" />
</cxf:inFaultInterceptors>
<cxf:outFaultInterceptors>
<ref bean="loggingOutInterceptor" />
</cxf:outFaultInterceptors>
<cxf:schemaLocations>
<!--
<cxf:schemaLocation>http://localhost:8088/SessionManager.svc?WSDL橪;interface=BasicHttpBinding_ISessionManager橪;part=SessionManager.xsd</cxf:schemaLocation>
<cxf:schemaLocation>classpath:etc/SessionManager/xsd0-serviceContracts-sessionService.xsd</cxf:schemaLocation>
<cxf:schemaLocation>classpath:etc/SessionManager/xsd1-serialization.xsd</cxf:schemaLocation>
<cxf:schemaLocation>classpath:etc/SessionManager/xsd2-dataContracts-sessionService.xsd</cxf:schemaLocation>
<cxf:schemaLocation>classpath:etc/SessionManager/xsd3-webservices.xsd</cxf:schemaLocation>
<cxf:schemaLocation>classpath:etc/SessionManager/xsd4-webservices-dataContracts-common-enumerations.xsd</cxf:schemaLocation>
</cxf:schemaLocations>
<cxf:properties>
<!-- Set the publishedEndpointUrl which could override the service
address from generated WSDL as you want -->
<!--
<entry key="publishedEndpointUrl" value="http://localhost:8090" />
<entry key="synchronous" value="true" />
<!-- enable logging in cxf message mode -->
<entry key="dataFormat" value="MESSAGE" />
<entry key="schema-validation-enabled" value="false" />
</cxf:properties>
</cxf:cxfEndpoint>
CamelContext:
<!-- this is the Camel route which proxies the real web service and
forwards SOAP requests to it -->
<camel:camelContext id="context" streamCache="true" >
<!-- disable stream caching spool to disk -->
<camel:properties>
<camel:property key="CamelCachedOutputStreamThreshold" value="-1" />
</camel:properties>
<camel:endpoint id="backendSessionManager"
uri="http://localhost:8088/SessionManager.svc?httpClient.soTimeout=5000橪;throwExceptionOnFailure=false"
/>
<camel:route id="SessionManager" >
<!-- CXF consumer using MESSAGE format -->
<camel:from uri="cxf:bean:frontendSessionManager?dataFormat=MESSAGE" />
<camel:doTry>
<!-- send proxied request to real web service -->
<camel:to ref="backendSessionManager" />
</camel:doTry>
</camel:route>
</camel:camelContext>
There may be more errors in the definition but the failure to create
the cxfEndpoint consumer due to trying to look-up the schemata from
remote host instead of using the local copies is blocking our
progress.
The Root cause we tracked so far seems to be in
org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromWSDL[1].
whereby the serviceFactory is created up front but schemaLocations are
only read at the end via "initializeDataBindings".
Any idea how to resolve this (i.e. get the cxfEndpoint consumer
started with local schemata) would be welcome!
Regards,
Michael
[1] http://grepcode.com/file/repo1.maven.org/maven2/org.apache.cxf/cxf-bundle/2.7.7/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java#407