2

我正在尝试使用 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。

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

任何帮助将非常感激。

4

2 回答 2

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.

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

于 2010-03-14T11:42:27.920 回答
0

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

于 2010-04-09T11:14:19.110 回答