Spring with Castor - 初始化应用程序上下文时出现Null Pointer异常

时间:2010-03-14 11:19:08

标签: java spring marshalling castor unmarshalling

我正在尝试用spring注册我的脚本映射文件,我似乎得到了一个空指针异常。

在我的应用程序上下文中,我有:

   <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和Castor 1.3.1。

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

首先,看看代码 - XMLContextFactoryBean的第118行是这里的最后一行。它表明以某种方式mappingResource为null。这表明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,你可以通过将文件放在源文件夹中来实现这一点 - 它看起来有些不整洁,因为你宁愿在其他地方有配置信息,但至少它会起作用。

答案 1 :(得分:0)

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