title: Spring and MongoDB: SAXParseException while reading Bean Definitions
body: <p>I am using MongoDB with Spring, and Apache Shiro for session management. Since I encountered the same issue mentioned in <strong><a href="https://stackoverflow.com/questions/10503101/spring-mongodb-and-apache-shiro">this</a></strong> question, I resorted to using MongoTemplate directly instead of extending MongoRepository for implementing Realm class required by Shiro. This realm is simply a DAO that deals with MongoDB for user &amp; role persistence.</p>
  
  <p>At the moment, I have a strange issue with the Bean Definition XML. It throws an SAXParserException, and I cannot comprehend why.</p>
  
  <p>I have provided some information below. Could you kindly help me with this?</p>
  
  <p><strong>web.xml:</strong></p>
  
  <pre><code>&lt;web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
      metadata-complete="false"&gt;
      &lt;display-name&gt;Test Web App&lt;/display-name&gt;
  &lt;/web-app&gt;
  </code></pre>
  
  <p><strong>persistence.xml</strong></p>
  
  <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
  &lt;beans xmlns="http://www.springframework.org/schema/beans" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:p="http://www.springframework.org/schema/p" 
          xmlns:c="http://www.springframework.org/schema/c"
          xmlns:tx="http://www.springframework.org/schema/tx"
          xmlns:context="http://www.springframework.org/schema/context"
          xmlns:mongo="http://www.springframework.org/schema/data/mongo"
          xmlns:util="http://www.springframework.org/schema/util"
          xsi:schemaLocation="
              http://www.springframework.org/schema/beans 
              http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
              http://www.springframework.org/schema/tx 
              http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
              http://www.springframework.org/schema/context
              http://www.springframework.org/schema/context/spring-context-3.1.xsd
              http://www.springframework.org/schema/data/mongo
              http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
              http://www.springframework.org/schema/util 
              http://www.springframework.org/schema/util/spring-util-3.1.xsd"&gt;
  
      &lt;bean id="persistencyProps" class="org.springframework.beans.factory.config.PropertiesFactoryBean"
          p:location="classpath:persistency.properties" /&gt;
  
      &lt;context:property-placeholder properties-ref="persistencyProps" /&gt;
  
      &lt;!-- Activate Spring Data MongoDB repository support --&gt;
      &lt;mongo:repositories base-package="com.test.webapp.repository" /&gt;
  
      &lt;!-- MongoDB host --&gt;
      &lt;mongo:mongo host="${mongo.host.name}" port="${mongo.host.port}"/&gt;
  
      &lt;!-- Template for performing MongoDB operations --&gt;
      &lt;bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate" 
              c:mongo-ref="mongo" c:databaseName="${mongo.db.name}"/&gt;
  
      &lt;bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"&gt;
          &lt;property name="securityManager" ref="securityManager"/&gt;
      &lt;/bean&gt;
  
      &lt;bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"&gt;
          &lt;property name="cacheManager" ref="cacheManager"/&gt;
          &lt;property name="realm" ref="mongoRealm"/&gt;
      &lt;/bean&gt;
  
      &lt;bean id="cacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager"/&gt;
  
      &lt;bean id="mongoRealm" class="com.test.webapp.login.MongoRealm/&gt;
  &lt;/beans&gt;
  </code></pre>
  
  <p><strong>Webapp initialization</strong></p>
  
  <pre><code>public class AppInit implements WebApplicationInitializer {
  
      private static final String DISPATCHER_SERVLET_NAME = "dispatcher";
  
      public void onStartup(ServletContext container) throws ServletException {
          container.setInitParameter("log4jConfigLocation", "log4j.properties");
          container.addListener(new Log4jConfigListener());
  
          AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
          rootContext.register(AppConfig.class);
  
          // Manage the lifecycle of the root application context
          container.addListener(new ContextLoaderListener(rootContext));
  
          // Create the dispatcher servlet's Spring application context
          AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();
          dispatcherContext.register(WebConfig.class);
  
          // Register and map the dispatcher servlet
          ServletRegistration.Dynamic dispatcher = container.addServlet(
                  DISPATCHER_SERVLET_NAME, new DispatcherServlet(dispatcherContext));
          dispatcher.setLoadOnStartup(1);
          dispatcher.addMapping("/");
  
          // Filter for shiro
          javax.servlet.FilterRegistration.Dynamic filterReg = container.addFilter("shiroFilter", DelegatingFilterProxy.class);
          filterReg.setInitParameter("targetFilterLifecycle", "true");
          filterReg.addMappingForServletNames(null, true, DISPATCHER_SERVLET_NAME);
  
      }
  }
  </code></pre>
  
  <p><strong>Configuration class</strong></p>
  
  <pre><code>@Configuration
  @ComponentScan( basePackages = {"com.test.webapp.controller", "com.test.webapp.util", "com.test.webapp.login"})
  @ImportResource("classpath:persistence.xml")
  public class AppConfig{
  
      @Bean(name = "jsonView")
      public MappingJacksonJsonView jsonView() {
          MappingJacksonJsonView mappingJacksonJsonView = new MappingJacksonJsonView();
          mappingJacksonJsonView.setContentType("application/json");
          return mappingJacksonJsonView;
      }
  }
  </code></pre>
  
  <p><strong>Properties file</strong></p>
  
  <pre><code># database properties
  mongo.db.name=appkix_mas
  mongo.host.name=127.0.0.1
  mongo.host.port=27017
  mongo.collection.user=user
  </code></pre>
  
  <p><strong>Exception chain</strong></p>
  
  <pre><code>org.apache.catalina.core.StandardContext listenerStart
  SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
  org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 49 in XML document from class path resource [persistence.xml] is invalid; nested exception is org.xml.sax.SAXParseException: The value of attribute "class" associated with an element type "null" must not contain the '&lt;' character.
      at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:396)
      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.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromImportedResources(ConfigurationClassBeanDefinitionReader.java:303)
      at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:131)
      at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:118)
      at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:294)
      at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:203)
      at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:617)
      at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:446)
      at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385)
      at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284)
      at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
      at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779)
      at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
      at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)
      at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)
      at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)
      at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:962)
      at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1603)
      at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
      at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
      at java.util.concurrent.FutureTask.run(Unknown Source)
      at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
      at java.lang.Thread.run(Unknown Source)
  Caused by: org.xml.sax.SAXParseException: The value of attribute "class" associated with an element type "null" must not contain the '&lt;' character.
      at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
      at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(Unknown Source)
      at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
      at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(Unknown Source)
      at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanAttributeValue(Unknown Source)
      at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanAttribute(Unknown Source)
      at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
      at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
      at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
      at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
      at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
      at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
      at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
      at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
      at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
      at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
      at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:75)
      at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:388)
      ... 29 more
  </code></pre>
  
  <p>Thank you very much for your time.</p>