2010-03-14 64 views
2

我试图用spring注册我的castor映射文件,而且我似乎得到一个空指针异常。Spring with Castor - 空指针初始化时出现异常Application Context

在我的应用程序方面,我有:

<bean id="xmlContext" class="org.castor.spring.xml.XMLContextFactoryBean"> 
    <property name="mappingLocations"> 
     <list> 
      <value>DistributionSamplerMappings.xml</value> 
     </list> 
    </property> 
    <property name="castorProperties"> 
      <props> 
       <prop key="org.exolab.castor.xml.strictelements">false</prop> 
      </props> 
     </property> 
</bean> 

<bean id="marshaller" 
     class="org.castor.spring.xml.CastorMarshallerFactoryBean"> 
    <property name="xmlContext"><ref local="xmlContext"/></property> 
</bean> 

<bean id="unmarshaller" 
     class="org.castor.spring.xml.CastorUnmarshallerFactoryBean"> 
     <property name="xmlContext"> <ref local="xmlContext"/></property> 
     <property name="ignoreExtraElements"><value>true</value></property> 
     <property name="ignoreExtraAttributes"><value>true</value></property> 
    </bean> 

凡DistributionSamplerMappings.xml住在同一目录作为应用程序上下文。

我试过使用spring-xml jar 1.2.1和1.5.3。但他们似乎都没有帮助。

的异常被抛出的回复是:

SEVERE: Context initialization failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xmlContext' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1338) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) 
at java.security.AccessController.doPrivileged(Native Method) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:423) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380) 
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255) 
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199) 
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45) 
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3830) 
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4337) 
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
at org.apache.catalina.core.StandardHost.start(StandardHost.java:719) 
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) 
at org.apache.catalina.core.StandardService.start(StandardService.java:516) 
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) 
at org.apache.catalina.startup.Catalina.start(Catalina.java:566) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) 
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) 
Caused by: java.lang.NullPointerException 
at org.castor.spring.xml.XMLContextFactoryBean.afterPropertiesSet(XMLContextFactoryBean.java:118) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1369) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1335) 
... 30 more 

我使用Spring 2.5.6和1.3.1蓖麻。

环顾四周我发现我不是唯一一个遇到过这个问题的人,但我似乎无法找到解决方案。

任何帮助将不胜感激。

回答

3

首先,看看XMLContextFactoryBean的代码行118是最后一个。它表明mappingResource以某种方式为空。这表明getClass()。getClassLoader()。getResource(mappingLocation)返回null,所以它可能找不到你的文件。

   mappingLocation = (String) iter.next(); 
       URL mappingResource = getClass().getClassLoader() 
         .getResource(mappingLocation); 
       mapping.loadMapping(new InputSource(mappingResource 
         .openStream())); // NPE occurs on this line. 

现在如果你想在加载程序才能找到一个文件,你需要把该文件中,它会寻找同一个地方。将你的DistributionSamplerMappings.xml放在与applicationContext相同的目录中不够好。请尝试WEB-INF/classes,或者其中包含已编译类的根目录的classes文件夹。如果你使用的是Eclipse,你可以通过将文件放入你的源文件夹来做到这一点 - 它看起来有点不整洁,因为你宁愿在别处配置信息,但至少它会起作用。

+0

我曾尝试过,但我意识到我的错误是我说src/my/classpath/file.xml时,我应该说我的/ classpath/file.xml 谢谢! – Babyangle86 2010-03-14 13:32:00

0

如果映射类没有默认的公共构造函数,也会发生此异常。