Невозможно установить переменную объекта Pojo с внешним значением во время JaxB MoXY Unmarshalling - PullRequest
0 голосов
/ 23 мая 2019

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

Сценарий : мне нужно установить значение переменной, определенное в моемJava Model (POJO) Класс со значением, поступающим извне (не является частью входного XML).Это значение будет использовано в пост-расчете.

входной XML: это огромное значение.Я могу разобрать его правильно.

Класс POJO:


import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlValue;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement(name="root")
@XmlAccessorType(XmlAccessType.FIELD)
public class MainModelClass {


    @XmlPath("abc/def/Result/text()")
    @XmlElement(name="Result")
    private String result;


    @XmlPath("/abc/def/Score/text()")
    @XmlElement(name="Score")
    private String score;

///This is where I want to populate the external value ///
    @XmlElement
    @XmlJavaTypeAdapter(PCNDateAdaptar.class)
    private PCNDate pcnDateObject;

    public PCNDate getPcnDateObject() {
        return pcnDateObject;
    }

    public void setPcnDateObject(PCNDate pcnDateObject) {
        this.pcnDateObject = pcnDateObject;
    }

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }

    public String getScore() {
        return score;
    }

    public void setScore(String score) {
        this.score = score;
    }

// Block for overridden toString() //

}

Класс Adaptar:

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class PCNDateAdaptar extends XmlAdapter<Integer, PCNDate> {

    private PCNDate pcnDateObject;

    public void setPcnDateObject(PCNDate pcnDateob) {
        this.pcnDateObject = pcnDateob;
    }

    @Override
    public PCNDate unmarshal(Integer v) throws Exception {

        if(v == null)
            return this.pcnDateObject;
        else
            return this.pcnDateObject;
    }

    @Override
    public Integer marshal(PCNDate v) throws Exception {
        if(v == null)
            return null;
        else
            return null;
    }

}

PCNDate.class:

public class PCNDate {

    private Integer processControlDate;

    public Integer getProcessControlDate() {
        return processControlDate;
    }
    public void setProcessControlDate(Integer pcn) {
        this.processControlDate = pcn;
    }
}

Метод Unmarshaller:

    public static <T> T getXMLSnippetObject(String xmlString, Class<T> modelClass, XmlAdapter<?, ?> xmlAdapterObject) throws XMLStreamException, JAXBException {

        JAXBContext context = JAXBContext.newInstance(modelClass);
        Unmarshaller unmarshaller = context.createUnmarshaller();

        unmarshaller.setAdapter(xmlAdapterObject);
        InputStream xmlInputStream = IOUtils.toInputStream(xmlString);
        XMLInputFactory2 xmlInputFactory = (XMLInputFactory2)XMLInputFactory.newInstance();
        xmlInputFactory.setProperty("javax.xml.stream.isCoalescing", true);
        xmlInputFactory.setProperty("javax.xml.stream.isNamespaceAware", true);
        xmlInputFactory.setProperty("javax.xml.stream.isReplacingEntityReferences", true);
        xmlInputFactory.setProperty(XMLInputFactory2.P_AUTO_CLOSE_INPUT, true);
        //xmlInputFactory.setProperty(XMLInputFactory2.P_DTD_OVERRIDE, false);
        xmlInputFactory.setProperty(XMLInputFactory2.P_REPORT_PROLOG_WHITESPACE, false);
        xmlInputFactory.setProperty(XMLInputFactory2.P_PRESERVE_LOCATION,false);
        xmlInputFactory.setProperty(XMLInputFactory2.P_INTERN_NS_URIS, true);
        XMLStreamReader2 xmlStreamReader = (XMLStreamReader2) xmlInputFactory.createXMLStreamReader(xmlInputStream);

T objectInstance = (T) JAXBIntrospector.getValue(unmarshaller.unmarshal(xmlStreamReader, modelClass));

        return objectInstance;

    }

Основной класс вызова:

public class XMLparsing {

    public static void main(String[] args) throws XMLStreamException, JAXBException, IOException {

String xmlString = // Xml String //
MainModelClass modelObj = null;
        Integer pcnDate = 20171010;

   // PCNDate & PCNDateAdapter are both no-arg-constructor classes for JAXB purpose 
        PCNDate pcnObj = new PCNDate();
        pcnDateObj.setProcessControlDate(pcnDate);

        PCNDateAdaptar pcndateAdaptar = new PCNDateAdaptar();
        pcndateAdaptar.setPcnDateObject(pcnObj);

modelObj = XmlUtilsStAX.getXMLSnippetObject(xmlString, MainModelClass.class, pcndateAdaptar);

}

Результат: вся строка XML обрабатывается правильно.Только pcnDateObject объекта MainModelClass имеет значение null, результат и оценка имеют значения.Я хочу, чтобы pcnDateObject имел 20171010.

Не знаю, чего мне не хватает, пожалуйста, помогите.

...