基于Spring Java的配置加载资源(来自类路径)

时间:2014-10-09 15:07:17

标签: java spring autowired applicationcontext

从Spring XML配置样式迁移到基于Spring Java的配置(使用@Configuration)我遇到了从类路径加载资源的问题。

在XML中我确实有一个声明为:

的bean
<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
  <property name="schema" value="classpath:/xsd/schema.xsd" />
  <property name="contextPath" value="com.company.app.jaxb" />
</bean>

在Java类中配置此bean如下所示:

@Configuration
public class AppConfig {

    @Autowired
    private ApplicationContext applicationContext;

    @Bean
    public Marshaller marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setSchema(applicationContext.getResource("classpath:/xsd/schema.xsd"));
        marshaller.setContextPath("com.company.app.jaxb");
        return marshaller;
    }

这会在加载ApplicationContext期间实际抛出NullpointerException,因为@Autowired字段不是(还是?)自动连接......

问:加载资源的正确解决方案是什么(从类路径和/或一般情况下)? Spring文档中提到了使用ApplicationContexthttp://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#context-introduction

问:为什么自动连接字段仍为空?

2 个答案:

答案 0 :(得分:0)

对于

marshaller.setSchema(applicationContext.getResource("classpath:/xsd/schema.xsd"));

你可以改为使用

marshaller.setSchema(new ClassPathResource("/xsd/schema.xsd"));

但我无法重现您注入的ApplicationContext字段为null

答案 1 :(得分:0)

ApplicationContext自动装入@Configuration AppConfig类可以正常工作,并且实际上是自动装配的。直接在@Bean方法中使用它似乎会产生循环自动装配情况。还有StackOverflowError: - (

解决方案是使用@PostConstruct ...

应用'post construct pattern'

代码中的解决方案:

@Configuration
public class AppConfig {

    @Autowired
    private ApplicationContext applicationContext;

    @Bean
    public Marshaller marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setContextPath("com.company.app.jaxb");
        return marshaller;
    }

    @PostConstruct
    public void initMarshaller() {
        marshaller().setSchema(applicationContext.getResource("classpath:/xsd/schema.xsd"));
    }