Details
-
Type:
New Feature
-
Status:
Closed
-
Priority:
Minor
-
Resolution: Fixed
-
Affects Version/s: 1.4.1
-
Fix Version/s: 1.4.4
-
Component/s: Modules: Spring
-
Labels:None
-
Environment:
Mule 1.4.1
Spring 2 XML Schema based configuration files
-
User impact:Medium
-
Similar Issues:None
Description
When using a Spring 2 XML Schema based configuration file (spring2-context.xml) with the SpringConfigurationBuilder like this:
SpringConfigurationBuilder builder = new SpringConfigurationBuilder();
builder.configure("mule-spring-conf.xml", "spring2-context.xml");
It fails with the following exception: org.xml.sax.SAXParseException: Document root element "beans", must match DOCTYPE root "null".
It looks like it is because the MuleBeanDefinitionReader class enforces DTD validation even if the validation used is XML Schema based:
http://svn.codehaus.org/mule/tags/mule-1.4.1/modules/spring/src/main/java/org/mule/extras/spring/config/MuleBeanDefinitionReader.java
The trunk seems to have this limitation also:
http://svn.codehaus.org/mule/trunk/mule/modules/spring/src/main/java/org/mule/extras/spring/config/MuleBeanDefinitionReader.java
Any workaround would be greatly appreciated in the meantime ![]()
Regards,
Cédric
PS: The full stack trace:
Exception in thread "main" org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 11 in XML document from resource loaded through InputStream is invalid; nested exception is org.xml.sax.SAXParseException: Document root element "beans", must match DOCTYPE root "null".
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:359)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:280)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:142)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:158)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:184)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:112)
at org.mule.extras.spring.config.MuleApplicationContext.loadBeanDefinitions(MuleApplicationContext.java:65)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:101)
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:395)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:330)
at org.mule.extras.spring.config.MuleApplicationContext.<init>(MuleApplicationContext.java:46)
at org.mule.extras.spring.config.MuleApplicationContext.<init>(MuleApplicationContext.java:38)
at org.mule.extras.spring.config.SpringConfigurationBuilder.configure(SpringConfigurationBuilder.java:99)
at org.mule.extras.spring.config.SpringConfigurationBuilder.configure(SpringConfigurationBuilder.java:68)
at com.vecteurplus.synergies.esb.SynergiesEsb.<init>(SynergiesEsb.java:31)
at com.vecteurplus.synergies.esb.SynergiesEsb.main(SynergiesEsb.java:21)
Caused by: org.xml.sax.SAXParseException: Document root element "beans", must match DOCTYPE root "null".
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.dtd.XMLDTDValidator.rootElementSpecified(Unknown Source)
at org.apache.xerces.impl.dtd.XMLDTDValidator.handleStartElement(Unknown Source)
at org.apache.xerces.impl.dtd.XMLDTDValidator.startElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentScannerImpl$ContentDispatcher.scanRootElementHook(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:78)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:351)
... 16 more
I remember we had to specify either DTD or XSD, otherwise it didn't work. Perhaps refactoring the code to parameterize this setting and adding a Spring2ConfigurationBuilder (with a spring2 alias) is the least intrusive solution.
For Mule 2 that's not an issue, however.