beanIO с аннотациями — запись списка объектов в файл json

Мне нужно написать список объектов в файл json с помощью beanIO. всякий раз, когда я пытался, я получаю только первый объект, записываемый в файл, как показано ниже.

{"employeeDetails":[{"recordType":"I","empId":"100","empName":"Name1"}]}

фактический результат должен быть следующим:

{"employeeDetails":[{"recordType":"I","empId":"100","empName":"Name1"},{"recordType":"I","empId":"101","empName":"Name2"}]}

используя pojo, как показано ниже:

@Record
public class Employee{

@Field(minOccurs=0)
private String recordType;
@Field(minOccurs=0)
private String empId;
@Field(minOccurs=0)
private String empName;

// getters and setters
}

@Record
public class Department{

@Segment(minOccurs=0, collection=List.class)
private List<Employee> employeeDetails;

//getters and setters
}

это то, что делает мой класс impl,

StreamFactory streamFactory=StreamFactory.newInstance(); 
streamFactory.loadResource(beanIoPath + beanIoMappingFileName); 
Writer outJson = new BufferedWriter(new FileWriter(new File(absPath+fileName))); 
BeanWriter jsonBeanWriter = streamFactory.createWriter(mapper, outJson); 
Department dpt = //fetch from db; 
jsonBeanWriter.write(dpt);

Пожалуйста, предложите, что нужно добавить больше, как добиться записи списка объектов в файл json с помощью BeanIO.

Спасибо..


person Pranav    schedule 31.07.2018    source источник
comment
пожалуйста, покажите нам, что вы пробовали до сих пор. Гораздо легче помочь вам, когда мы видим, что вы сделали и в чем проблема. Как выглядит объект Employee, как вы заполняете объекты и как вы использовали BeanWriter для получения текущего результата?   -  person nicoschl    schedule 31.07.2018
comment
Кроме того, как выглядит объект/класс, содержащий список объектов сотрудников?   -  person nicoschl    schedule 31.07.2018
comment
обновил вопрос. пф.   -  person Pranav    schedule 01.08.2018
comment
Спасибо за обновление, я вижу, что вы также используете файл сопоставления, пожалуйста, добавьте его.   -  person nicoschl    schedule 01.08.2018


Ответы (1)


Проблема в конфигурации класса Department. Значение по умолчанию для атрибута maxOccurs в Segment равно Integer.MIN_VALUE, поэтому вам нужно сделать его «неограниченным», если вы собираетесь использовать файл сопоставления, но вы можете установить значение -1 при использовании аннотаций. Из исходного кода аннотации @Segment:

/**
 * The maximum occurrences.
 * @return the maximum occurrences, or -1 if unbounded
 */
int maxOccurs() default Integer.MIN_VALUE;

Тогда ваш класс Department должен выглядеть так:

@Record
public class Department {

  @Segment(minOccurs = 0, maxOccurs = -1, collection = List.class)
  private List<Employee> employeeDetails;

//getters and setters
}

При использовании аннотаций и необходимости вывода полей в определенном порядке обратите внимание на этот часть документации по аннотациям:

При использовании аннотаций настоятельно рекомендуется явно задавать позицию (используя at) для всех полей и сегментов. BeanIO не гарантирует порядок, в котором аннотированные компоненты добавляются в макет.

person nicoschl    schedule 01.08.2018