简体   繁体   English

jaxb解组子级@XmlIDREF

[英]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 也是sourceAgentUuid字段的代理类

@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片段

<?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) 结果为null(但所有其他非@XmlIDREF字段均已编组​​好)

How I can get ef0b03de-c95b-11e3-9183-002590a28eca result ? 如何获得ef0b03de-c95b-11e3-9183-002590a28eca结果?

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. @XmlIDREF及其对应的@XmlID是“ XML指针”,在XML文本中显示为字符串。 JAXB matches such value pairs and resolves matching references into nice object references. JAXB匹配这些值对,并将匹配的引用解析为漂亮的对象引用。

So, after unmarshalling, you won't see the strings from the XML file; 因此,在解组后,您将看不到XML文件中的字符串。 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. (在您的情况下)将包含对该“源代理”对象的引用(如果存在这样一个XML元素,其@XmlID设置为该值),否则将为null。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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