我想一個bean注入到一個自定義的HttpMessageConverter
其在配置類註冊:注入豆成Spring框架的一個HttpMessageConverter 3.1
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
。
我試圖
- 註釋
MyMessageConverter#setServiceDao(ServiceDao s)
與@Autowired
。 - implements
BeanFactoryAware
inMyMessageConverter
。
這兩種方法都不起作用。用於轉換HTTP消息的對象MyMessageConverter
始終以MyMessageConverter#serviceDao
中存儲的null
引用結束。
Google和Spring Framework 3.1文檔都沒有提供關於該問題的信息。
@Bob Flannigon:這絕對不是問題。 CompleteConfiguration#myMessageConverter()
返回一個正確配置的消息轉換器。然而,當我從MyMessageConverter
刪除零參數的構造,春天拋出以下異常:
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>()
我想這意味着春天創建一個新的實例,然後將其用,而不是我配置的bean。
在XML配置中,bean的順序可能很重要,我不確定這是否適用於基於對象的配置,但我預計底層機制是相同的。您是否嘗試過將消息轉換器上方的serviceDAO定義移動? –
看到編輯,響應時間有點長。 – frececroka
我不明白。你的'CompleteConfiguration'就像你當前的問題一樣,沒問題,應該使用'serviceDao()'''ServiceDao''創建一個'MyMessageConverter'。 –