1

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ます。
  • で実装BeanFactoryAwareMyMessageConverterます。

どちらのアプローチもうまくいきませんでした。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 の代わりに使用される新しいインスタンスを作成することを意味すると思います。

4

1 に答える 1