java - Spring with Castor - 初始化应用程序上下文时出现空指针异常

标签 java spring marshalling castor unmarshalling

我正在尝试使用 spring 注册我的 Castor 映射文件,但似乎遇到了空指针异常。

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

   <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。

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

任何帮助将不胜感激。

最佳答案

首先看一下代码——XMLContextFactoryBean的第118行是这里的最后一个。它表明映射资源以某种方式为空。这表明 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,或者其中包含已编译类的根目录的类文件夹。如果您使用的是 Eclipse,则可以通过将文件放入源文件夹中来完成此操作 - 它看起来有点凌乱,因为您宁愿在其他地方拥有配置信息,但至少它可以工作。

关于java - Spring with Castor - 初始化应用程序上下文时出现空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2441950/

相关文章:

java - 为什么 Apache Kafka 消费者不使用 Log4j2 根记录器?

java - 从 Java 中的 InputStream 读取 ESRI shapefile

java - 数据库连接正在关闭

spring - 有哪些可用选项可用于在 Spring 管理的 Web 应用程序内的 Log4J Appender 中检索 Spring 管理的 bean?

java - 如何使用 (Java) Akka HTTP 返回基于 Accept-header 的 XML?

json - JSON 的编码/解码、编码/解码和序列化/反序列化之间的关系和区别?

java - 在 java 中解析此文本的优雅方法是什么?

java - 压缩 hadoop mapreduce 输出的最简单有效的方法

java - 使用 eclipselink.media-type 值 : application/json 设置 Marshaller 属性时出现 PropertyException

Java:构建器模式与逻辑分组对象