首页 > 解决方案 > 如何使用 Classifier 和 ClassifierCompositeItemWriter?

问题描述

在实现 ClassifierCompositeItemwriter 时遇到问题...

我正在阅读一个基本的 CSV 文件,我想把它们写成一个数据库。根据数据(名称+名称1)将其写入简单的ItemWriter或使用compositeItemwriter(写入两个不同的表)......

这是我的:ClassifierCompositeItemwriter请参阅 > 下面的错误消息

public ClassifierCompositeItemWriter<MyObject> classifierCompositeItemWriter() {
ClassifierCompositeItemWriter<MyObject> writer = new ClassifierCompositeItemWriter<MyObject>();
writer.setClassifier(new MySpecialClassifier());
return writer;
}

我尝试使用分类器接口实现分类器

import org.springframework.batch.item.ItemWriter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.classify.Classifier;

@SuppressWarnings("serial")
public class MySpecialClassifier implements Classifier<MyObject, ItemWriter<MyObject>> {

@Autowired
ItemWriter<MyObject> writer1;

@Autowired
ItemWriter<MyObject> writer2;

@Override
public ItemWriter<MyObject> classify(MyObject obj) {

    if (!obj.getName().isEmpty() && !obj.getName1().isEmpty()) {
        return writer1;
    } else {
        return writer2;
    }
}
}

Eclipse 不断告诉我:ClassifierCompositeItemWriter 类型中的 setClassifier(Classifier>) 不适用于参数 (MySpecialClassifier)

标签: springclassificationspring-batchitemwriter

解决方案


你的分类器应该是这样的:

public class MySpecialClassifier implements Classifier<MyObject, ItemWriter<? super MyObject>> {

    @Autowired
    ItemWriter<MyObject> writer1;

    @Autowired
    ItemWriter<MyObject> writer2;

    @Override
    public ItemWriter<MyObject> classify(MyObject obj) {

        if (!obj.getName().isEmpty() && !obj.getName1().isEmpty()) {
            return writer1;
        } else {
            return writer2;
        }
    }

}

唯一的区别是implements Classifier<MyObject, ItemWriter<? super MyObject>>代替implements Classifier<MyObject, ItemWriter<MyObject>>.

这是因为项目编写者不仅可以编写MyObject项目,还可以编写 的超类的项目MyObject


推荐阅读