Spring with Castor - исключение нулевого указателя при инициализации контекста приложения - PullRequest
2 голосов
/ 14 марта 2010

Я пытаюсь зарегистрировать свои файлы сопоставления касторов с помощью 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 ]

3 голосов
/ 14 марта 2010

Сначала посмотрите на код - строка 118 XMLContextFactoryBean является последней здесь. Это предполагает, что каким-то образом mappingResource имеет значение null. Это говорит о том, что getClass (). GetClassLoader (). GetResource (mappingLocation) возвращает ноль, поэтому, возможно, он не может найти ваш файл.

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

Теперь, если вы хотите, чтобы загрузчик class нашел файл, вам нужно поместить файл в то же место, где он будет искать classes . Поместить ваш DistributionSamplerMappings.xml в тот же каталог, что и applicationContext, недостаточно. Попробуйте WEB-INF/classes, в зависимости от того, какая папка классов содержит корень ваших скомпилированных классов. Если вы используете Eclipse, вы можете сделать это, поместив файл в вашу исходную папку - он выглядит немного неопрятно, так как вы бы предпочли иметь информацию о конфигурации в другом месте, но по крайней мере это будет работать.

0 голосов
/ 09 апреля 2010

Это исключение также может возникать, если сопоставленный класс не имеет общедоступного конструктора по умолчанию.

...