在Spring Framework 3.1中将bean注入HttpMessageConverter

时间:2013-05-29 12:55:44

标签: java spring spring-mvc

我正在尝试将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

我试过

  • 使用MyMessageConverter#setServiceDao( ServiceDao s )注释@Autowired
  • BeanFactoryAware中实施MyMessageConverter

这两种方法都不起作用。用于转换HTTP消息的MyMessageConverter对象始终最终存储在null中的MyMessageConverter#serviceDao引用。

谷歌和Spring Framework 3.1文档都没有提供有关该问题的信息。

@Bob Flannigon:这绝对不是问题。 CompleteConfiguration#myMessageConverter()返回一个正确的cofigured消息转换器。但是,当我从MyMessageConverter中删除zero-args构造函数时,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。

1 个答案:

答案 0 :(得分:0)

从Spring Framework 3.1.0升级到Spring Framework 3.2.3后,行为消失了。

也许这只是一个错误。