【问题标题】:Injecting beans into a HttpMessageConverter in Spring Framework 3.1在 Spring Framework 3.1 中将 bean 注入到 HttpMessageConverter
【发布时间】:2013-05-29 12:55:43
【问题描述】:

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

我试过

  • @Autowired注释MyMessageConverter#setServiceDao( ServiceDao s )
  • MyMessageConverter 中实现BeanFactoryAware

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

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

@Bob Flannigon:这绝对不是问题。 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。

【问题讨论】:

  • 在 XML 配置中,bean 顺序可能很重要,我不确定这是否适用于基于对象的配置,但我预计底层机制是相同的。您是否尝试过简单地将 serviceDAO 定义移到消息转换器上方?
  • 查看编辑,回复有点长。
  • 我不明白。您当前问题中的CompleteConfiguration 很好,应该使用来自serviceDao()ServiceDao bean 创建一个MyMessageConverter
  • 这是真的,但 Spring 不使用我的 MyMessageConverter 实例来转换 HTTP 消息。 Spring 创建一个新实例,使用这个新的(现在未配置的)实例来转换 HTTP 消息。这就是如果MyMessageConverter 没有提供零参数构造函数,Spring 会抛出异常的原因。

标签: java spring spring-mvc


【解决方案1】:

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

也许这只是一个错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 2011-05-29
    • 1970-01-01
    相关资源
    最近更新 更多