Wednesday, November 21, 2012

JCS and Spring: Unable to validate using XSD...

Working on a servlet project that uses spring and I wanted to add caching using Apache JCS, but as soon as I added the maven dependency I started getting this exception:
12/11/22 09:20:44 INFO support.FileSystemXmlApplicationContext: Refreshing org.springframework.context.support.FileSystemXmlApplicationContext@15136019: startup date [Thu Nov 22 09:20:44 EST 2012]; root of context hierarchy
12/11/22 09:20:44 INFO xml.XmlBeanDefinitionReader: Loading XML bean definitions from file [bean.xml]
Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Parser configuration exception parsing XML from file [bean.xml]; nested exception is javax.xml.parsers.ParserConfigurationException: Unable to validate using XSD: Your JAXP provider [org.apache.xerces.jaxp.DocumentBuilderFactoryImpl@419829a9] does not support XML Schema. Are you running on Java 1.4 with Apache Crimson? Upgrade to Apache Xerces (or Java 1.5) for full XSD support.
 at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:404)
 at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
 at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
 at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
 at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)
 at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)
 at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)
 at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:243)
 at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127)
 at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93)
 at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:131)
 at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:522)
 at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:436)
 at org.springframework.context.support.FileSystemXmlApplicationContext.(FileSystemXmlApplicationContext.java:140)
 at org.springframework.context.support.FileSystemXmlApplicationContext.(FileSystemXmlApplicationContext.java:84)
 at Tester.main(HBaseXmlStreamTester.java:87)
Caused by: javax.xml.parsers.ParserConfigurationException: Unable to validate using XSD: Your JAXP provider [org.apache.xerces.jaxp.DocumentBuilderFactoryImpl@419829a9] does not support XML Schema. Are you running on Java 1.4 with Apache Crimson? Upgrade to Apache Xerces (or Java 1.5) for full XSD support.
 at org.springframework.beans.factory.xml.DefaultDocumentLoader.createDocumentBuilderFactory(DefaultDocumentLoader.java:102)
 at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:70)
 at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:388)
 ... 19 more
Caused by: java.lang.IllegalArgumentException: No attributes are implemented
 at org.apache.xerces.jaxp.DocumentBuilderFactoryImpl.setAttribute(DocumentBuilderFactoryImpl.java:98)
 at org.springframework.beans.factory.xml.DefaultDocumentLoader.createDocumentBuilderFactory(DefaultDocumentLoader.java:99)
 ... 21 more

The pom.xml dependencies:

        .
        .
        .
 
  
      jcs
      jcs
      1.3
  
  
      org.springframework
      spring-core
      3.1.1.RELEASE
  
  
      org.springframework
      spring-web
      ${spring.version}
  
  
      org.springframework
      spring-beans
      ${spring.version}
  
  
      org.springframework
      spring-context
      ${spring.version}
  
  
      org.springframework
      spring-aop
      ${spring.version}
  
  
      org.springframework
      spring-context-support
      ${spring.version}
  
  
      org.springframework
      spring-tx
      ${spring.version}
  
  
      org.springframework
      spring-orm
      ${spring.version}
  
  
      org.springframework
      spring-jdbc
      ${spring.version}
  
  
      org.springframework
      spring-test
      ${spring.version}
  
  
      org.springframework
      spring-webmvc
      ${spring.version}
  
  
      org.springframework
      spring-oxm
      ${spring.version}
  
  
      org.springframework
      spring-instrument
      ${spring.version}
  
 
        .
        .
        .
In the source for javax.xml.parsers.DocumentBuilderFactory.newInstance() it lets you specify the DocumentBuilderFactory implementation with a VM define, like this (using the implementation from the source):
        #> java -Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl Tester
Now this work fine, but I don't want to have to set up a define in the servlet container so I kept looking. I replaced the JCS dependency:
        
            jcs
            jcs
            1.3
        
with:
        
            jcs
            jcs
            1.3
            
                
                    xerces
                    xerces
                
                
                    xml-apis
                    xml-apis
                
            
        
 
        
            xerces
            xercesImpl
            2.10.0
        
        
            xml-apis
            xml-apis
            1.4.01
        
And it now works without having to set a VM define.

No comments:

Post a Comment