Java 在SpringFramework 3.1中将bean注入HttpMessageConverter

Java 在SpringFramework 3.1中将bean注入HttpMessageConverter,java,spring,spring-mvc,Java,Spring,Spring Mvc,我正在尝试将bean注入在配置类中注册的自定义HttpMessageConverter: package my.package.config; import ... @Configuration @ComponentScan( basePackages = "my.package" ) public class CompleteConfiguration extends WebMvcConfigurationSupport { @Override protected voi

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

}

我猜这意味着Spring创建了一个新实例,然后用它代替我配置的bean。

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


也许这只是一个bug。

在XML配置中,bean顺序可能很重要,我不确定这是否适用于基于对象的配置,但我预计底层机制是相同的。您是否尝试过将serviceDAO定义移到消息转换器上方?请参见编辑,响应时间稍长。我不明白。您当前问题中的
CompleteConfiguration
很好,应该使用
ServiceDao()
中的
ServiceDao
bean创建一个
MyMessageConverter
。这是正确的,但Spring不使用我的
MyMessageConverter
实例来转换HTTP消息。Spring创建一个新实例,使用这个新实例(现在未配置)转换HTTP消息。这就是为什么Spring在
MyMessageConverter
没有提供零参数构造函数时抛出异常的原因。
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;
    }
}
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>()