【问题标题】:Autowire Generic Bean自动装配通用 Bean
【发布时间】:2020-10-29 14:59:47
【问题描述】:

如何自动装配通用 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
    }
}

我在 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();

} 

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

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

    您应该将其设置为public BeanValidatingItemProcessor&lt;HomeCareDetailDTO&gt; itemBeanValidator()

    【讨论】:

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

    可能的解决方案虽然不漂亮。也许工厂方法会更干净。

    @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;
            }
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多