XMLAdapter для Marshalling/Unmarshalling списка объектов с использованием JAXB API
У меня есть сценарий, в котором мне нужно сгенерировать XML, как показано ниже -
<EVC_unidetailcontainer>
<EVC_unidetail>
<UREF value="01" />
<UACT value="N" />
<NCI value="02VLN.A2" />
<EVCSP value="HSTQTX0211W" />
<S_VLANdetailcontainer>
<S_VLANdetail>
<S_VLAN value="1520" />
</S_VLANdetail>
</S_VLANdetailcontainer>
<RUID value="28.KGFD.000001..TWCC" />
<EVC_servicedetailcontainer>
<EVC_servicedetail>
<LREF value="1" />
<LOSACT value="N" />
<LOS value="BASIC" />
<BDW value="1G" />
</EVC_servicedetail>
</EVC_servicedetailcontainer>
</EVC_unidetail>
<EVC_unidetail>
<UREF value="02" />
<AUNT value="A" />
<UACT value="N" />
<NCI value="02VLN.A2" />
<S_VLANdetailcontainer>
<S_VLANdetail>
<S_VLAN value="1520" />
</S_VLANdetail>
</S_VLANdetailcontainer>
<EVC_servicedetailcontainer>
<EVC_servicedetail>
<LREF value="1" />
<LOSACT value="N" />
<LOS value="BASIC" />
<BDW value="1G" />
</EVC_servicedetail>
</EVC_servicedetailcontainer>
</EVC_unidetail>
Я использовал XMLAdapter, как показано ниже, для достижения этого формата -
public class EVCUniDetailListAdapter extends XmlAdapter<EVCUniDetail, List<EVCUniDetail>>{
@Override
public EVCUniDetail marshal(List<EVCUniDetail> v) throws Exception {
EVCUniDetail evcUniDetailObj = new EVCUniDetail();
for (EVCUniDetail evcUniDetail : v) {
evcUniDetailObj.setEvcServiceDetailContainer(evcUniDetail.getEvcServiceDetailContainer());
evcUniDetailObj.setEVCSP(evcUniDetail.getEVCSP());
evcUniDetailObj.setNCI(evcUniDetail.getNCI());
evcUniDetailObj.setRUID(evcUniDetail.getRUID());
evcUniDetailObj.setsVLANDetailContainer(evcUniDetail.getsVLANDetailContainer());
evcUniDetailObj.setUACT(evcUniDetail.getUACT());
evcUniDetailObj.setUREF(evcUniDetail.getUREF());
}
return evcUniDetailObj;
}
@Override
public List<EVCUniDetail> unmarshal(EVCUniDetail v) throws Exception {
List<EVCUniDetail> evcUniDetailList = new ArrayList<>();
for (EVCUniDetail evcUniDetail : evcUniDetailList) {
evcUniDetailList.add(evcUniDetail);
}
return evcUniDetailList;
}
}
Приведенный выше код не может создать список, и он возвращает только один объект EVCUniDetail в выводе XML.
evcUniDetailList.add (evcUniDetail1); evcUniDetailList.add (evcUniDetail2);
Я ожидаю два объекта EVCUniDetail в XML, так как я добавил два объекта выше.
Вот вывод ниже я получаю -
<EVC_unidetailcontainer>
<EVC_unidetail>
<UREF value="01"/>
<UACT value="N"/>
<NCI value="02VLN.A2"/>
<EVCSP value="HSTQTX0211W"/>
<S_VLANdetailcontainer>
<S_VLANdetail>
<S_VLAN value="1520"/>
</S_VLANdetail>
</S_VLANdetailcontainer>
<RUID value="28.KGFD.000001..TWCC"/>
<EVC_servicedetailcontainer>
<EVC_servicedetail>
<LREF value="1"/>
<LOSACT value="N"/>
<LOS value="BASIC"/>
<BDW value="1G"/>
</EVC_servicedetail>
</EVC_servicedetailcontainer>
</EVC_unidetail>
Вот код сортировки ниже -
JAXBContext context;
try {
context = JAXBContext.newInstance(new Class[]{asrOrder.getClass()});
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
marshaller.marshal(asrOrder, System.out);
} catch (JAXBException e) {
e.printStackTrace();
}
asrOrder является корневым объектом, который имеет несколько параллельных объектов. EVC_unidetailcontainer - один из них, который содержит список EVC_unidetail.
Любой, пожалуйста, предложите, где ошибка. Я посмотрел на несколько похожих вопросов, которые уже задавались, но ни один из них не помог. Я полагаю, что есть некоторая проблема в коде маршаллинга, но он не в состоянии понять Спасибо.!