简体   繁体   中英

jaxb unmarshall child @XmlIDREF

I have class

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "customerOrder", propOrder = {
    "demandsUuid",
    "invoicesOutUuid",
    "paymentsUuid",
    "customerOrderPosition",
    "purchaseOrdersUuid"
}) 
public  class CustomerOrder extends LegendEntity {
    @XmlAttribute(name = "sourceAgentUuid")
    @XmlIDREF
    @XmlSchemaType(name = "IDREF")
    @XmlJavaTypeAdapter(XmlAdapterTest.class)
    protected Object sourceAgentUuid;
....

Also Agent class for sourceAgentUuid field

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "agent", propOrder = {
    "attribute",
    "requisite",
    "contact",
    "contactPerson",
    "agentNewsItem",
    "tags"
})
@XmlSeeAlso({
    Company.class
})
public class Agent
    extends LegendEntity
{

    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    @XmlID
    @XmlSchemaType(name = "ID")
    protected String uuid;

And unmarshalling xml snipetpets

<?xml version="1.0" encoding="UTF-8"?>
<customerOrder deliveryPlannedMoment="2014-04-23T16:10:00+04:00" reservedSum="0.0" stateUuid="44b3fca5-a2b3-11e3-31b2-002590a28eca" targetAgentUuid="9a3c7d6b-4245-11e3-24c6-7054d21a8d1e" 
sourceAgentUuid="ef0b03de-c95b-11e3-9183-002590a28eca" sourceStoreUuid="b05ed064-8743-11e3-0c1a-002590a28eca" 
applicable="true" moment="2014-04-21T17:50:00+04:00" payerVat="true" rate="1.0" vatIncluded="true" created="2014-04-21T17:50:44.142+04:00" createdBy="it@erms" name="440" updated="2014-04-22T12:19:56.472+04:00" updatedBy="it@erms" readMode="SELF" changeMode="NONE">
                <accountUuid>5f65cc9e-3708-11e3-bf9a-7054d21a8d1e</accountUuid>
                <accountId>5f65cc9e-3708-11e3-bf9a-7054d21a8d1e</accountId>
                <uuid>ef1267b8-c95b-11e3-aeb4-002590a28eca</uuid>
                <groupUuid>9a3ad96b-4245-11e3-010e-7054d21a8d1e</groupUuid>
                <groupId>9a3ad96b-4245-11e3-010e-7054d21a8d1e</groupId>
                <code>440</code>
                <externalcode>440</externalcode>

When I try to unmarshall

JAXBElement poe =  (JAXBElement)u.unmarshal( new FileInputStream( "org_order.xml" ) );
CustomerOrder co=(CustomerOrder)poe.getValue();
System.out.println(co.getSourceAgentUuid());

result null (but all other not @XmlIDREF field unmarshalled ok)

How I can get ef0b03de-c95b-11e3-9183-002590a28eca result ?

I had create test class for simply. Why output is null?

import java.io.ByteArrayInputStream;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
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.XmlID;
import javax.xml.bind.annotation.XmlIDREF;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

public class TestMarshall {

    public static void main(String[] args) {
        try {
            // marshal();
            unmarshal();
        } catch (Exception e) {

            e.printStackTrace();
        }
    }
    public static void marshal() throws Exception {
        CustomerOrder co = new CustomerOrder();
        Agent a = new Agent();
        a.setUuid("sdfsdf");
        co.setSourceAgentUuid(a);
        JAXBContext jc = JAXBContext.newInstance(CustomerOrder.class,
                Agent.class);
        Marshaller m = jc.createMarshaller();
        m.marshal(co, System.out);
    }
    public static void unmarshal() throws Exception {
        JAXBContext jc = JAXBContext.newInstance(CustomerOrder.class,
                Agent.class);
        Unmarshaller u = jc.createUnmarshaller();
        String testXML = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><customerOrder sourceAgentUuid=\"sdfsdf\"/>";
        CustomerOrder poe = (CustomerOrder) u
                .unmarshal(new ByteArrayInputStream(testXML.getBytes()));
        CustomerOrder co = poe;
        System.out.println("sourceAgentUuid= " + co.getSourceAgentUuid());
    }
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "agent")
class Agent {
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    @XmlID
    @XmlSchemaType(name = "ID")
    protected String uuid;

    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
@XmlType(name = "customerOrder")
class CustomerOrder {

    @XmlAttribute(name = "sourceAgentUuid")
    @XmlIDREF
    @XmlSchemaType(name = "IDREF")
    protected Object sourceAgentUuid;

    public Object getSourceAgentUuid() {
        return sourceAgentUuid;
    }
    public void setSourceAgentUuid(Object sourceAgentUuid) {
        this.sourceAgentUuid = sourceAgentUuid;
    }

}

An @XmlIDREF plus its counterpart @XmlID are "XMLized pointers" that appear as strings in the XML text. JAXB matches such value pairs and resolves matching references into nice object references.

So, after unmarshalling, you won't see the strings from the XML file; the

Object sourceAgentUuid

(in your case) will either contain a reference to that "source agent" object (if there is such an XML element with its @XmlID set to that value) or null otherwise.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM