[英]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.