2

I'm unable to configure Cross Origin Resource Sharing support to an Http Inbound Gateway.

I'm using Spring Integration 4.2.0.RELEASE

A snippet of configuration is:

<int-http:inbound-gateway id="facade-rest-inbound-gateway" 
    request-channel="orchestrator-request-channel"
    reply-channel="orchestrator-response-channel"
    supported-methods="GET"
    path="/facade/orders/{customerId}"
    payload-expression="#pathVariables.customerId">
    <int-http:header name="customerId" expression="#pathVariables.customerId"/>
    <int-http:header name="async"      expression="#requestParams.async"/>

    <int-http:cross-origin origin="*" allowed-headers="*" />

</int-http:inbound-gateway>

Spring Initialization fails with the following exception stack trace:

23:28:47,099 ERROR [org.springframework.web.context.ContextLoader] (MSC service thread 1-14) Context initialization failed: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 63 in XML document from URL [vfs:/content/data-aggregator-esb-0.0.1-SNAPSHOT.war/WEB-INF/classes/spring/integration-context.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 63; columnNumber: 62; cvc-complex-type.2.4.a: Invalid content was found starting with element 'int-http:cross-origin'. One of '{"http://www.springframework.org/schema/integration/http":header}' is expected.
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:399) [spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336) [spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304) [spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181) [spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217) [spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188) [spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125) [spring-web-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94) [spring-web-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129) [spring-context-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:604) [spring-context-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:509) [spring-context-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446) [spring-web-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328) [spring-web-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) [spring-web-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:173) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:190) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:87)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.start(UndertowDeploymentService.java:72)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_75]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_75]
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_75]
Caused by: org.xml.sax.SAXParseException; lineNumber: 63; columnNumber: 62; cvc-complex-type.2.4.a: Invalid content was found starting with element 'int-http:cross-origin'. One of '{"http://www.springframework.org/schema/integration/http":header}' is expected.
    at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
    at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.xs.XMLSchemaValidator.reportSchemaError(Unknown Source)
    at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
    at org.apache.xerces.impl.xs.XMLSchemaValidator.emptyElement(Unknown Source)
    at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
    at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:76) [spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadDocument(XmlBeanDefinitionReader.java:429) [spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:391) [spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    ... 22 more

I'm doing something wrong in my configuration?

Thanks in advance Massimo

Artem Bilan
  • 113,505
  • 11
  • 91
  • 118
Massimo Da Ros
  • 393
  • 3
  • 11

2 Answers2

1

Yes, you do.

Take a look, please, to the XSD definition:

<xsd:sequence>
    <xsd:element name="request-mapping" type="requestMappingType" minOccurs="0">
    <xsd:element name="cross-origin" type="crossOriginType" minOccurs="0">
    <xsd:element name="header" type="headerType" minOccurs="0" maxccurs="unbounded">
</xsd:sequence>

So, as you see we have there is a pscific order with which we should follow only.

From other side it is strange that your IDE doesn't say you where you aren't right...

Artem Bilan
  • 113,505
  • 11
  • 91
  • 118
  • Thanks Artem , the error of my IDE was "cvc-complex-type.2.4.a: Invalid content was found starting with element 'int-http:cross-origin'. One of '{"http://www.springframework.org/schema/integration/http":header}' is expected.". No indications about the order of nested elements (perhaps because header is the last on the xsd definition). I modified the configuration writing cross-origin element before header and now works – Massimo Da Ros Sep 14 '15 at 07:26
0

The correct configuration is with cross-origin element before header element:

<int-http:inbound-gateway id="facade-rest-inbound-gateway" 
   request-channel="orchestrator-request-channel"
   reply-channel="orchestrator-response-channel"
   supported-methods="GET"
   path="/facade/orders/{customerId}"
   payload-expression="#pathVariables.customerId">

   <int-http:cross-origin origin="*" allowed-headers="*" />

   <int-http:header name="customerId" expression="#pathVariables.customerId"/>
   <int-http:header name="async"      expression="#requestParams.async"/>    

</int-http:inbound-gateway>
Massimo Da Ros
  • 393
  • 3
  • 11