0

Hi I am trying to add two writers to a spring batch compositeitemwriter. I am getting an error saying:

The method setDelegates(List<ItemWriter<? super MyObject>>) in the type CompositeItemWriter<MyObject> is not applicable for the arguments (List<ItemWriter<MyObject>>)

My code below

public ItemWriter<MyObject> myWriter(){
    ItemWriter<MyObject> myWriter = new myWriter();
    return myWriter;
}

public ItemWriter<MyObject> myOtherWriter(){
    ItemWriter<MyObject> myOtherWriter = new MyOtherWriter();
    return myOtherWriter;
}

public CompositeItemWriter<MyObject> compositeItemWriter(){
    CompositeItemWriter<MyObject> writer = new CompositeItemWriter<MyObject>();
    List<ItemWriter<MyObject>> writerList = new ArrayList<ItemWriter<MyObject>>();
    writerList.add(myWriter());
    writerList.add(myOtherWriter());
    writer.setDelegates(writerList); //<-- ERROR HERE
    return writer;
}

I could not find any strong code examples of compositeitemwriters that did not use xml. I know my error has something to do with generic type parameters, which I have little knowledge of. Could anyone explain why the above code would not work and possibly how to remedy it? Multiple itemwriters in Spring batch This is the closest I could find, but it uses generic types which also give me an error.

Thank you for any help! I am new to spring batch.

Corey Schnedl
  • 165
  • 1
  • 3
  • 12

2 Answers2

0

Try modifying...

List<ItemWriter<MyObject>> writerList = new ArrayList<ItemWriter<MyObject>>();

...with :

List<ItemWriter<? super MyObject>> writerList = new ArrayList<ItemWriter<? super MyObject>>();

CompositeItemWriter#setDelegates takes a list in the form List<ItemWriter<? super T>>.

See spring documentation.

Spooky
  • 1
  • 3
0

Just in case you did not find a proper solution. I would do it like this:

public ItemWriter<MyObject> myWriter() {
    ItemWriter<MyObject> myWriter = new JdbcBatchItemWriter<MyObject>(); //  <-- Example item writer 1
    return myWriter;
}

public ItemWriter<MyObject> myOtherWriter() {
    ItemWriter<MyObject> myOtherWriter = new JdbcBatchItemWriter<MyObject>(); //  <-- Example item writer 2
    return myOtherWriter;
}

public CompositeItemWriter<MyObject> compositeItemWriter() {
    CompositeItemWriter<MyObject> writer = new CompositeItemWriter<MyObject>();
    writer.setDelegates(Arrays.asList(myWriter(),myOtherWriter())); //<-- NO ERROR HERE :)
    return writer;
}

I hope that helps.

noob
  • 774
  • 1
  • 10
  • 23
eckad158
  • 385
  • 6
  • 19