java - Spring Batch 通配符 ItemWriter
问题描述
我有一个假问题。为了解释我的用例,我有不同类型的 DAO;比如说用户、啤酒……等等。我想为所有这些人使用一个通用的 ItemWriter。我创建了一个CommonComponentConfiguration
我定义的地方;
@Bean
@Qualifier(WRITER_INSERT_TO_DATABASE_BEAN)
public ItemWriter<?> insertDbItemWriter(@Qualifier(DATA_SOURCE) DataSource dataSource,
@Qualifier("insertSql") String insertSql) {
return new MyItemWriter<>(dataSource, insertSql);
}
作家课是这样的;
@Slf4j
public class MyItemWriter<T> extends JdbcBatchItemWriter<T> {
public MyItemWriter(DataSource dataSource, String sql) {
this.setDataSource(dataSource);
this.setSql(sql);
this.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
this.setAssertUpdates(false);
}
@Override
public void write(List<? extends T> items) {
try {
super.write(items);
} catch (Exception e) {
log.error("Could not write the items " + items);
log.error(e.getMessage());
}
}
}
到目前为止一切正常。事情变得复杂的是,我为每个存储库定义了存储库特定项的单独配置类。例如为用户插入数据库的步骤。
@Bean
@Qualifier(STEP_INSERT_TO_DB_BEAN)
public Step insertToDbStep(@Qualifier(READER_LOADED_INPUT_DATA_BEAN) ListItemReader<User> sourceItemReader, UserInsertProcessor userInsertProcessor, @Qualifier(WRITER_INSERT_TO_DATABASE_BEAN)
ItemWriter<User> dbItemWriter) {
return stepBuilderFactory.get("processInsertStep").<User, User>chunk(100)
.reader(sourceItemReader)
.processor(userInsertProcessor)
.writer(dbItemWriter)
.build();
}
当我在 IJ 中编写这段代码时,我在抱怨Could not autowire. Qualified bean must be of 'ItemWriter<User>' type.
,但是当我执行代码时,天啊,它可以工作,并且会做它应该做的事情。当我调试时,它绑定了正确的东西。
好吧,你可能会说,如果它有效,请不要碰它。但是我真的很想知道窗帘后面发生了什么。
此外,如果您发现设计中存在缺陷(例如尝试对所有事物使用一种通用的东西),您的建议将受到欢迎。
先感谢您。
PS:在下面看到这个线程,看起来非常相似 - 如果不是相同的话 - 案例。但是我想知道这里的泛型是否与此有关。 IntelliJ IDEA 在使用 Spring 的 @Autowired 注解时显示错误
解决方案
但是我真的很想知道窗帘后面发生了什么。
对于这个 IntelliJ IDEA 警告,您是对的,这是IntelliJ IDEA 中讨论的相同问题,在使用 Spring 的 @Autowired 注释时显示错误(也正如 Eugene 在评论中所解释的那样)
此外,如果您发现设计中存在缺陷(例如尝试对所有事物使用一种通用的东西),您的建议将受到欢迎。
如果当前方法适合您,您可以使用它。但是,我会建议让一件事做一件事并做好。在您的情况下,这将为每种域类型使用项目编写器,并将这些编写器包装在ClassifierCompositeItemWriter中。复合编写器使用 aClassifier
对项目进行分类并相应地调用相应的编写器。
推荐阅读
- c# - 会话值未保留或在 dotnetcore webapi 中不起作用
- java - 三元运算符有问题
- android - 推动从“内部测试”轨道发布到生产
- python - for循环中numpy数组的计算结果错误
- bash - 从 Bash 检查 postgres 查询的结果
- yii - EchMultiselect(TypeError: m.easing[this.easing] 不是函数)
- angularjs - AngularJS 异步执行函数
- javascript - 可以从父窗口访问响应代码吗?
- elasticsearch - ElasticSearch - 如何编辑文档数组中的字段
- node.js - 在 node js 中安装 gulp 时出错