【问题标题】:Spring Batch Wildcard ItemWriterSpring Batch 通配符 ItemWriter
【发布时间】:2021-07-15 01:21:40
【问题描述】:

我有一个假问题。 为了解释我的用例,我有不同类型的 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);
     }

writer 类是这样的;

@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&lt;User&gt;' type. ,但是当我执行代码时,天哪,它可以工作,并且可以执行它应该做的事情。当我调试时,它绑定了正确的东西。

好吧,你可能会说,如果它有效,请不要碰它。但是我真的很想知道幕后发生了什么。

此外,如果您发现设计中存在缺陷(例如尝试对所有事物都使用一种通用的东西),我们非常欢迎您提出建议。

提前谢谢你。

PS: 在下面看到这个线程,看起来非常相似 - 如果不是相同的话。但是我想知道这里的泛型是否与此有关。 IntelliJ IDEA shows errors when using Spring's @Autowired annotation

编辑:

【问题讨论】:

  • 什么是IJ抱怨是什么意思?不编译?这是警告吗?等
  • 对不起,Intellij。
  • 我的问题的第二部分?
  • 这看起来像一个警告,抱歉,我仍然无法确定您的项目是否因此在 intellij 中编译
  • 这是一个智能的“东西”,没什么好担心的。这就是他们对这类事物的静态分析的编写方式。当我们从@ExceptionHandlers 返回一个ResponseEntity&lt;?&gt; 时,我在我们的项目中收到了同样的警告... 一般来说,将通配符返回给调用者是一个很大的代码气味,因为现在调用者被他们困住并且需要一直在施放。我真的认为在这种情况下 - 你很好。

标签: java spring intellij-idea spring-batch


【解决方案1】:

但我真的很想知道幕后发生了什么。

对于这个 IntelliJ IDEA 警告,您说得对,这与 IntelliJ IDEA shows errors when using Spring's @Autowired annotation 中讨论的问题相同(也正如 Eugene 在 cmets 中所解释的)

此外,如果您发现设计中存在缺陷(例如尝试对所有事物都使用一种通用的东西),我们非常欢迎您提出建议。

如果当前方法适合您,您可以使用它。但是,我会建议让一件事做一件事并且做好。在您的情况下,这将为每种域类型使用一个项目编写器,并将这些编写器包装在 ClassifierCompositeItemWriter 中。复合编写器使用Classifier 对项目进行分类并相应地调用相应的编写器。

【讨论】:

  • 欣赏答案。我在设计上的缺陷是我有两种类型的作家。一个用于删除,一个用于插入。如果我使用包装类,我会有类似 UserDeleteWriter UserInsertWriter BeerDeleteWriter BeerInsertWriter 的东西,这样的例子还在继续。它变得如此之大。要么我确实在其他地方犯了错误,所以我最终来到了这里,或者这在春天很正常。 (我不这么认为。)
猜你喜欢
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
相关资源
最近更新 更多