Java JAXB unmarshaling нулевое значение от XML - PullRequest
0 голосов
/ 08 января 2020

У меня были некоторые проблемы при попытке извлечь значения из XML в Java. Мой пример ввода XML файла:

<?xml version="1.0" encoding="UTF-8" ?>
 <TRB_TRX xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<HEADER ReqNotf="N" TransactionCode="L9_BLACKLIST_SET" PublisherApplID="CL" PublisherApplThreadID="1" EntityId="58241962" RoutingId="2626289" EntityType="ACCOUNT" IssueDate="2019-06-18T23:59:59" EffectiveDate="2019-06-18T23:59:59"/>
    <DATA>
        <BlacklistCodeSet>
            <TransactionHeaderInfoExt>
                <ApplicationId>CL</ApplicationId>
                <RequestDate>2019-06-18T23:59:59</RequestDate>
            </TransactionHeaderInfoExt>
            <ClEntityIdInfoExt>
                <EntityId>58241962</EntityId>
                <EntityType>ACCOUNT</EntityType>
            </ClEntityIdInfoExt>
            <GeneralCollectionEntityInfoExt>
                <BlacklistCode>D</BlacklistCode>
            </GeneralCollectionEntityInfoExt>
        </BlacklistCodeSet>
    </DATA>
</TRB_TRX>

Мой Java класс для файла XML:

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="BlacklistCodeSet")
public class BlackListCode {
    String entityId;
String blackListCode;

public String getEntityId() {
    return entityId;
}

public void setEntityId(String entityId) {
    this.entityId = entityId;
}

public String getBlackListCode() {
    return blackListCode;
}

public void setBlackListCode(String blackListCode) {
    this.blackListCode = blackListCode;
}

@Override
public String toString() {
    return "BlackListCode{" +
            "entityId='" + entityId + '\'' +
            ", blackListCode='" + blackListCode + '\'' +
            '}';
}
}

Мой код для извлечения значений:

XMLInputFactory xif = XMLInputFactory.newFactory();

                FileReader reader = new FileReader("src/main/resources/xml/blacklistcode.xml");
                XMLStreamReader xsr = xif.createXMLStreamReader(reader);

                try {
                    JAXBContext jc = JAXBContext.newInstance(BlackListCode.class);
                    Unmarshaller unmarshaller = jc.createUnmarshaller();

                    while (xsr.hasNext()) {
                        while (xsr.hasNext() && (!xsr.isStartElement() || !xsr.getLocalName().equals("BlacklistCodeSet"))) {
                            xsr.next();
                        }
                        if (xsr.hasNext()) {
                            BlackListCode blacklistcode = (BlackListCode) unmarshaller.unmarshal(xsr);
                            log.debug("BLACKLIST CODE IS " + blacklistcode);
                            log.debug("ACCOUNT NO IS " + blacklistcode.getEntityId());
                        }
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }

Я пытался l oop узел, пока он не совпадет с "BlacklistCodeSet" перед извлечением значения. Однако распечатанные значения являются нулевыми, и сообщение об ошибке не выдается.

Есть идеи? Спасибо!

1 Ответ

1 голос
/ 08 января 2020

Для того, чтобы JAXB мог проанализировать этот класс в этот момент, XML из <BlacklistCodeSet> должно быть:

<BlacklistCodeSet>
    <blackListCode>D</blackListCode>
    <entityId>58241962</entityId>
</BlacklistCodeSet>

Вы можете убедиться в этом сами, если создадите экземпляр BlackListCode и используйте JAXB для маршалла до XML. Это лучший способ «отладки» JAXB.

BlackListCode blackListCode = new BlackListCode();
blackListCode.setEntityId("58241962");
blackListCode.setBlackListCode("D");

JAXBContext jaxbContext = JAXBContext.newInstance(BlackListCode.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(blackListCode, System.out);

Как видите, XML, необходимый JAXB, сильно отличается от фактического XML, которое вы даете JAXB. Элементы даже не имеют правильного имени, начиная с строчных букв, поэтому вам нужно указать @XmlElement аннотации, чтобы правильно их назвать, и вам нужны дополнительные объекты, чтобы получить более сложные XML.

@XmlRootElement(name = "BlacklistCodeSet")
class BlackListCode {
    private ClEntityIdInfoExt clEntityIdInfoExt;
    private GeneralCollectionEntityInfoExt generalCollectionEntityInfoExt;

    @XmlElement(name = "ClEntityIdInfoExt")
    public ClEntityIdInfoExt getClEntityIdInfoExt() {
        return this.clEntityIdInfoExt;
    }

    public void setClEntityIdInfoExt(ClEntityIdInfoExt clEntityIdInfoExt) {
        this.clEntityIdInfoExt = clEntityIdInfoExt;
    }

    @XmlElement(name = "GeneralCollectionEntityInfoExt")
    public GeneralCollectionEntityInfoExt getGeneralCollectionEntityInfoExt() {
        return this.generalCollectionEntityInfoExt;
    }

    public void setGeneralCollectionEntityInfoExt(GeneralCollectionEntityInfoExt generalCollectionEntityInfoExt) {
        this.generalCollectionEntityInfoExt = generalCollectionEntityInfoExt;
    }

    @Override
    public String toString() {
        return "BlackListCode{entityId='" + this.clEntityIdInfoExt.getEntityId() + '\'' +
                           ", BlacklistCode='" + this.generalCollectionEntityInfoExt.getBlacklistCode() + '\'' + '}';
    }
}
class ClEntityIdInfoExt {
    private String entityId;

    public ClEntityIdInfoExt() {
    }

    public ClEntityIdInfoExt(String entityId) {
        this.entityId = entityId;
    }

    @XmlElement(name = "EntityId")
    public String getEntityId() {
        return this.entityId;
    }

    public void setEntityId(String entityId) {
        this.entityId = entityId;
    }
}
class GeneralCollectionEntityInfoExt {
    private String BlacklistCode;

    public GeneralCollectionEntityInfoExt() {
    }

    public GeneralCollectionEntityInfoExt(String blacklistCode) {
        this.BlacklistCode = blacklistCode;
    }

    @XmlElement(name = "BlacklistCode")
    public String getBlacklistCode() {
        return this.BlacklistCode;
    }

    public void setBlacklistCode(String blacklistCode) {
        this.BlacklistCode = blacklistCode;
    }
}

Тест

BlackListCode blackListCode = new BlackListCode();
blackListCode.setClEntityIdInfoExt(new ClEntityIdInfoExt("58241962"));
blackListCode.setGeneralCollectionEntityInfoExt(new GeneralCollectionEntityInfoExt("D"));

JAXBContext jaxbContext = JAXBContext.newInstance(BlackListCode.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(blackListCode, System.out);

Выход

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<BlacklistCodeSet>
    <ClEntityIdInfoExt>
        <EntityId>58241962</EntityId>
    </ClEntityIdInfoExt>
    <GeneralCollectionEntityInfoExt>
        <BlacklistCode>D</BlacklistCode>
    </GeneralCollectionEntityInfoExt>
</BlacklistCodeSet>

Теперь, когда сгенерированный XML соответствует ожидается, XML, JAXB может правильно демаршаллировать XML в объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...