自动装配在AbstractHttpMessageConverter中不起作用

时间:2017-10-18 11:26:14

标签: java spring

在我的Spring应用程序中,我使用了行

@Autowired
private transient EntityService entityService;

在某些地方成功获得EntityService。但是我在编写的AbstractHttpMessageConverter中不是这样给出了CSV响应(通常可以正常工作)

public class SearchResultCsvConverter extends AbstractHttpMessageConverter<SearchResult> {

    public SearchResultCsvConverter() {
        super(new MediaType("text", "csv"));
    }

    @Autowired
    private transient EntityService entityService;

注册:

@ComponentScan(...)
@Configuration
@EnableWebMvc
@EnableAsync
@EnableTransactionManagement
@EnableSpringConfigured
@PropertySource("classpath:config/application.properties")
public class ApplicationConfiguration extends WebMvcConfigurerAdapter {

    @Inject
    private Environment environment;

    @Autowired
    private transient EntityService entityService;

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new SearchResultCsvConverter());
    }

SearchResultCsvConverter就是这样工作的,EntityService也存在于ApplicationConfiguration中,但是在SearchResultCsvConverter中它是null。任何暗示我可能会发现错误或任何需要照顾的提示都非常感谢!

我使用Spring 4.3.4。

- 编辑1

我也尝试了@service用于SearchResultCsvConverter - 结果相同。

- 编辑2:解决方案感谢@Radu Pop

public class ApplicationConfiguration extends WebMvcConfigurerAdapter {

    @Inject
    private Environment environment;

    @Autowired
    private transient EntityService entityService;

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
         final SearchResultCsvConverter searchResultCsvConverter = new SearchResultCsvConverter();
         searchResultCsvConverter.setEntityService(entityService);
         converters.add(searchResultCsvConverter);

并在转换器中

private transient EntityService entityService;

public SearchResultCsvConverter() {
    super(new MediaType("text", "csv"));
}

public void setEntityService(EntityService entityService) {
    this.entityService = entityService;
}

对我来说看起来不那么优雅,但效果很好。

1 个答案:

答案 0 :(得分:0)

从我的代码中可以看出,您编写的转换器类在Spring应用程序上下文中不被视为bean。这是因为在您的应用程序配置类中定义的列表本身是一个bean,但是没有这样的元素。

因此,您可以将简单转换器视为bean。您可以通过使用@Configurable方法来实现,但是您需要启用spring AOP的可能性,或者您可以在应用程序配置类中创建一个方法,该方法将返回该类型的bean并在那里执行实例化。此方法将在返回列表的方法中引用,以正确填充转换器与您的自定义bean。