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.

Любой, пожалуйста, предложите, где ошибка. Я посмотрел на несколько похожих вопросов, которые уже задавались, но ни один из них не помог. Я полагаю, что есть некоторая проблема в коде маршаллинга, но он не в состоянии понять Спасибо.!

0 ответов

Другие вопросы по тегам