【发布时间】:2013-05-29 12:55:43
【问题描述】:
我正在尝试将 bean 注入到在配置类中注册的自定义 HttpMessageConverter:
package my.package.config;
import ...
@Configuration
@ComponentScan( basePackages = "my.package" )
public class CompleteConfiguration extends WebMvcConfigurationSupport {
@Override
protected void configureMessageConverters( List<HttpMessageConverter<?>> converters ) {
converters.add( this.myMessageConverter() );
this.addDefaultHttpMessageConverters( converters );
}
@Bean
public MyMessageConverter myMessageConverter() {
MyMessageConverter mc = new MyMessageConverter();
mc.setServiceDao( this.serviceDao() );
return mc;
}
@Bean
public ServiceDao serviceDao() {
return ...;
}
}
自定义的HttpMessageConverter定义如下:
package my.package.converter;
public class MyMessageConverter implements HttpMessageConverter<Person> {
private ServiceDao serviceDao;
...
implementation which uses ServiceDao
...
public void setServiceDao( ServiceDao s ) {
this.serviceDao = s;
}
public ServiceDao getServiceDao() {
return this.serviceDao;
}
}
这没有按预期工作,因为 Spring 在内部创建了一个 MyMessageConverter 的新实例,而不是为这个新实例设置 ServiceDao。
我试过
- 用
@Autowired注释MyMessageConverter#setServiceDao( ServiceDao s )。 - 在
MyMessageConverter中实现BeanFactoryAware。
这两种方法都不起作用。用于转换 HTTP 消息的 MyMessageConverter 对象总是在 MyMessageConverter#serviceDao 中存储一个 null 引用。
Google 和 Spring Framework 3.1 文档都没有提供有关该问题的信息。
@Bob Flannigon:这绝对不是问题。 CompleteConfiguration#myMessageConverter() 返回一个正确配置的消息转换器。但是,当我从 MyMessageConverter 中删除零参数构造函数时,Spring 会抛出以下异常:
org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [my.package.converter.MyMessageConverter]: No default constructor found; nested exception is java.lang.NoSuchMethodException: my.package.converter.MyMessageConverter.<init>()
我猜这意味着 Spring 创建了一个新实例,然后使用该实例代替我配置的 bean。
【问题讨论】:
-
在 XML 配置中,bean 顺序可能很重要,我不确定这是否适用于基于对象的配置,但我预计底层机制是相同的。您是否尝试过简单地将 serviceDAO 定义移到消息转换器上方?
-
查看编辑,回复有点长。
-
我不明白。您当前问题中的
CompleteConfiguration很好,应该使用来自serviceDao()的ServiceDaobean 创建一个MyMessageConverter。 -
这是真的,但 Spring 不使用我的
MyMessageConverter实例来转换 HTTP 消息。 Spring 创建一个新实例,使用这个新的(现在未配置的)实例来转换 HTTP 消息。这就是如果MyMessageConverter没有提供零参数构造函数,Spring 会抛出异常的原因。
标签: java spring spring-mvc