Java Autowire通用Bean

Java Autowire通用Bean,java,spring,spring-boot,Java,Spring,Spring Boot,如何自动连接通用bean?范例 @Configuration @RequiredArgsConstructor public class BatchConfig { final MessageSource messageSource; @Bean public <T> BeanValidatingItemProcessor<T> itemBeanValidator() { LocalValidatorFactoryBean va

如何自动连接通用bean?范例

@Configuration
@RequiredArgsConstructor
public class BatchConfig {

    final MessageSource messageSource;

    @Bean
    public <T> BeanValidatingItemProcessor<T> itemBeanValidator() {
        LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
        validator.setValidationMessageSource(messageSource);
        validator.afterPropertiesSet();

        BeanValidatingItemProcessor<T> beanValidatingItemProcessor = new BeanValidatingItemProcessor<>(validator);
        beanValidatingItemProcessor.setFilter(false);

        return beanValidatingItemProcessor;
    }

    @Bean
    protected Step homeCareDetailStep(BeanValidatingItemProcessor<HomeCareDetailDTO> itemBeanValidator){
        //do something
    }

    @Bean
    protected Step homeCareProviderStep(BeanValidatingItemProcessor<HomeCareProviderDTO> itemBeanValidator){
        //do something
    }
}
@配置
@所需参数构造函数
公共类BatchConfig{
最终消息源消息源;
@豆子
公共BeanValidatingItemProcessor itemBeanValidator(){
LocalValidatorFactoryBean validator=新的LocalValidatorFactoryBean();
validator.setValidationMessageSource(messageSource);
验证器。AfterPropertieSet();
BeanValidatingItemProcessor BeanValidatingItemProcessor=新的BeanValidatingItemProcessor(验证器);
beanValidatingItemProcessor.setFilter(false);
返回beanValidatingItemProcessor;
}
@豆子
受保护的步骤homeCareDetailStep(BeanValidatingItemProcessor itemBeanValidator){
//做点什么
}
@豆子
受保护的步骤homeCareProviderStep(BeanValidatingItemProcessor itemBeanValidator){
//做点什么
}
}
我在IDE中遇到以下错误“无法自动连线。未找到BeanValidatingItemProcessor类型的bean”

我的问题的另一个潜在解决方案可能是使用服务,但不确定我可能会面临哪些缺点

@Service
@RequiredArgsConstructor
public class ItemBeanValidatorImpl<T> implements ItemBeanValidator<T> {

    final MessageSource messageSource;

    public <T> BeanValidatingItemProcessor<T> itemBeanValidator() {
        LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
        validator.setValidationMessageSource(messageSource);
        validator.afterPropertiesSet();

        BeanValidatingItemProcessor<T> beanValidatingItemProcessor = new BeanValidatingItemProcessor<>(validator);
        beanValidatingItemProcessor.setFilter(false);

        return beanValidatingItemProcessor;
    }

}

public interface ItemBeanValidator<T> {

    <T> BeanValidatingItemProcessor<T> itemBeanValidator();

} 
@服务
@所需参数构造函数
公共类ItemBeanValidatorImpl实现ItemBeanValidator{
最终消息源消息源;
公共BeanValidatingItemProcessor itemBeanValidator(){
LocalValidatorFactoryBean validator=新的LocalValidatorFactoryBean();
validator.setValidationMessageSource(messageSource);
验证器。AfterPropertieSet();
BeanValidatingItemProcessor BeanValidatingItemProcessor=新的BeanValidatingItemProcessor(验证器);
beanValidatingItemProcessor.setFilter(false);
返回beanValidatingItemProcessor;
}
}
公共接口项BeanValidator{
BeanValidatingItemProcessor itemBeanValidator();
} 

问题是您的bean创建了
T
类型的
BeanValidatingItemProcessor
。在这种情况下,T是什么


您应该将其设置为公共BeanValidatingItemProcessor itemBeanValidator()

可能的解决方案,尽管它并不漂亮。也许工厂方法会更干净

@Configuration
@RequiredArgsConstructor
public class BatchValidatorConfig {

    final MessageSource messageSource;

    @Bean
    public BeanValidatingItemProcessor<HomeCareDetailDTO> homeCareDetailValidator() {
        return new ItemBeanValidator<HomeCareDetailDTO>(messageSource).validate();
    }

    @Bean
    public BeanValidatingItemProcessor<HomeCareProviderDTO> homeCareProviderValidator() {
        return new ItemBeanValidator<HomeCareProviderDTO>(messageSource).validate();
    }

    @Bean
    public BeanValidatingItemProcessor<HomeCareSumDTO> homeCareSumValidator() {
        return new ItemBeanValidator<HomeCareSumDTO>(messageSource).validate();
    }

    @Bean
    public BeanValidatingItemProcessor<HomeCareCorporateDTO> homeCareCorporateValidator() {
        return new ItemBeanValidator<HomeCareCorporateDTO>(messageSource).validate();
    }

    @AllArgsConstructor
    private class ItemBeanValidator<T> {

        MessageSource messageSource;

        public BeanValidatingItemProcessor<T> validate() {
            LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
            validator.setValidationMessageSource(messageSource);
            validator.afterPropertiesSet();

            BeanValidatingItemProcessor<T> beanValidatingItemProcessor = new BeanValidatingItemProcessor<>(validator);
            beanValidatingItemProcessor.setFilter(false);
            return beanValidatingItemProcessor;
        }

    }

}
@配置
@所需参数构造函数
公共类BatchValidatorConfig{
最终消息源消息源;
@豆子
公共BeanValidatingItemProcessor homeCareDetailValidator(){
返回新的ItemBeanValidator(messageSource).validate();
}
@豆子
公共BeanValidatingItemProcessor homeCareProviderValidator(){
返回新的ItemBeanValidator(messageSource).validate();
}
@豆子
公共BeanValidatingItemProcessor homeCareSumValidator(){
返回新的ItemBeanValidator(messageSource).validate();
}
@豆子
公共BeanValidatingItemProcessor homeCareCorporateValidator(){
返回新的ItemBeanValidator(messageSource).validate();
}
@AllArgsConstructor
私有类ItemBeanValidator{
消息源消息源;
公共BeanValidatingItemProcessor验证(){
LocalValidatorFactoryBean validator=新的LocalValidatorFactoryBean();
validator.setValidationMessageSource(messageSource);
验证器。AfterPropertieSet();
BeanValidatingItemProcessor BeanValidatingItemProcessor=新的BeanValidatingItemProcessor(验证器);
beanValidatingItemProcessor.setFilter(false);
返回beanValidatingItemProcessor;
}
}
}

问题是我可能有30个不同的bean需要验证,希望在将bean注入另一个bean时将类型传递给BeanValidatingItemProcessor。另一个问题是BeanValidatingItemProcessor需要MessageSource服务。如果MessageSource也是一个bean,那么将其传递就像将处理器传递给步骤一样。至于30种不同的豆子,别以为有办法解决。如果您需要30种类型的bean,那么您需要30种beans,但是我如何才能创建一个通用的BeanValidatingItemProcessor,而不必创建30个不同的BeanValidatingItemProcessor方法,每次都指定它们的类型呢。例如,public BeanValidatingItemProcessor和public BeanValidatingItemProcessor等您不能。基本上一个bean就是一个实例——如何创建30个不同的泛型实例而不生成30个?同样的问题。您可以尝试创建一个工厂,然后为工厂创建一个bean,该bean将获取类并创建实例请查看我更新的问题,并告诉我通用服务方法是否可行。