簡體   English   中英

Autowire 通用 Bean

[英]Autowire Generic Bean

如何自動裝配通用 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();

} 

問題是您的 bean 創建了類型T BeanValidatingItemProcessor 在這種情況下,T 是什么?

您應該將其設置為public BeanValidatingItemProcessor<HomeCareDetailDTO> 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;
        }

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM