如何使用泛型类型的bean执行Configuration类? (包括示例)

时间:2018-01-18 00:23:43

标签: java spring generics spring-boot spring-config

我想提供一个基本配置类,它将处理创建bean的泛型类型,当你扩展类时,它会被定义,如下所示。但它从不调用<div class="col-sm-6" style="padding-left: 0px; padding-right: 0px;"> @Html.EnumDropDownListFor(m => m.StartTime, new { @class = "form-control selectpicker", @name = "StartTime" }) </div> 方法。

@Bean

2 个答案:

答案 0 :(得分:1)

不确定原因,但它需要MappingJackson2HttpMessageConverter类型的bean。有了它,它就可以了。

@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration( classes = { TestGenericBean.MyClientCreator.class } )
public class TestGenericBean
{
    @Autowired
    private TestClient client;

    public static class ClientConfig<T>
    {
        private Class<T> classCreator;

        public ClientConfig(Class<T> classCreator)
        {
            this.classCreator = classCreator;
        }

        /**** THIS IS REQUIRED - WHY? ****/
        @Bean
        public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter()
        {
            return new MappingJackson2HttpMessageConverter();
        }

        @Bean
        public T createClient(AsyncRestTemplate asyncRestTemplate) throws Exception
        {
            Constructor<T> constructor = classCreator.getConstructor(
                AsyncRestTemplate.class
            );

            return constructor.newInstance( asyncRestTemplate );
        }

        @Bean
        public AsyncRestTemplate asyncRestTemplate()
        {
            return new AsyncRestTemplate();
        }
    }

    @Configuration
    public static class MyClientCreator extends ClientConfig<TestClient>
    {
        public MyClientCreator()
        {
            super( TestClient.class );
        }
    }

    public static class TestClient
    {
        public AsyncRestTemplate asyncRestTemplate;

        public TestClient(AsyncRestTemplate asyncRestTemplate)
        {
            this.asyncRestTemplate = asyncRestTemplate;
        }
    }

    @Test
    public void testBean()
    {
        System.out.print( client.asyncRestTemplate );
    }
}

答案 1 :(得分:0)

我最近没有使用过Spring / Spring引导,但我对注释预处理器有很多经验。 spring boot使用它们的方式不允许任何泛型方法用作@autowire的bean提供程序。这是因为它无法安全地解析java类&lt; T>因此将其映射到该字段。我建议你尝试使用一个包装类,如Getter&lt; T>或列表&lt; T>但不能保证任何通用实现都能正常工作。