HttpMessageConverter
構成クラスに登録されているカスタムに Bean を注入しようとしています。
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
ます。 - で実装
BeanFactoryAware
しMyMessageConverter
ます。
どちらのアプローチもうまくいきませんでした。HTTP メッセージを変換するために使用されるMyMessageConverter
オブジェクトは、常に にnull
格納された参照を持つことになりMyMessageConverter#serviceDao
ます。
Google も Spring Framework 3.1 のドキュメントも、この問題に関する情報を提供していません。
@ボブ・フラニゴン:これは間違いなく問題ではありません。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 の代わりに使用される新しいインスタンスを作成することを意味すると思います。