从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文档中提到了使用ApplicationContext
:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#context-introduction
问:为什么自动连接字段仍为空?
答案 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
...
代码中的解决方案:
@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"));
}