Spring:与现有类相同类型的autowire bean

时间:2016-07-17 19:49:08

标签: spring

在跟踪了一些关于Spring的学习路径和教程之后,我仍然有时会以最优雅的方式做事。

我的项目我需要配置一个RestTemplate对象来处理GregorianCalendar,方法是在Json帖子体中以所需的格式打印日期,并将帖子体的内容记录到日志文件中。

我认为不需要在这里创建一个子类,只需将现有属性设置为自定义值即可完成,为此创建一些其他bean。

此代码没有问题,但如何将其注入我想要使用它的类中?当我使用@Autowired时,我需要指定一个限定符来区分框架RestTemplate类和我自定义的类。 或者我可以使用其id值注入bean,这是这里方法的名称,所以在我的情况下setuRestTemplate? 可能有一个更容易的方法来注入这个bean的名称,但我不知道这是什么优先。

import org.springframework.web.client.RestTemplate;
//more imports

@Configuration
public class SixdegreesAppContext {


@Bean
public RestTemplate setuRestTemplate() {

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.setMessageConverters(getSetuMessageConverters());

    //enable logging of post body
    ClientHttpRequestInterceptor loggingRequestInterceptor = new LoggingRequestInterceptor();
    List<ClientHttpRequestInterceptor> ris = new ArrayList<>();
    ris.add(loggingRequestInterceptor);

    restTemplate.setInterceptors(ris);
    restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory())); //no sure why this is needed

    return restTemplate;
}

@Bean
public List<HttpMessageConverter<?>> getSetuMessageConverters() {
    List<HttpMessageConverter<?>> converters = new ArrayList<>();
    MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
    jackson2HttpMessageConverter.setObjectMapper(getSetuObjectMapper());
    converters.add(jackson2HttpMessageConverter);
    return converters;
}

@Bean
public ObjectMapper getSetuObjectMapper() {
    ObjectMapper jacksonObjectMapper = new ObjectMapper();
    SimpleModule module = new SimpleModule();
    module.addSerializer(XMLGregorianCalendar.class, new XmlGregorianCalendarSerializer());
    jacksonObjectMapper.registerModule(module);
    return jacksonObjectMapper;
}


}  

1 个答案:

答案 0 :(得分:1)

您可以将bean命名为:

public final static String REST_TEMPLATE_BEAN_NAME = "myRestTemplate";
@Bean(name = {REST_TEMPLATE_BEAN_NAME})
public RestTemplate getRestTemplate() {
    //...
    return new CustomizeRestTemplate();
}

然后你可以参考如下:

@Resource(name = REST_TEMPLATE_BEAN_NAME)
RestTemplate restTemplate;

请记住,REST_TEMPLATE_BEAN_NAME是您之前定义的静态字段。这是你想要的吗?