дочерний элемент jaxb unmarshall @XmlIDREF

#java #xml #jaxb #idref

#java #xml #jaxb #idref

Вопрос:

У меня есть класс

 @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;
....
  

Также класс агента для поля 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;
  

И разархивирует 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>
  

Когда я пытаюсь разархивировать

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

результат нулевой (но все остальные поля не @XmlIDREF отключены нормально)

Как я могу получить результат ef0b03de-c95b-11e3-9183-002590a28eca?

Я просто создал тестовый класс. Почему вывод равен 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;
    }

}
  

Комментарии:

1. Недостаточно информации. Нам нужно просмотреть код XML и Java для «uuid исходного агента», на который ссылается ссылка, особенно @XmlID, который должен быть там.

2. Я добавляю тестовый класс в конец вопроса. Можете ли вы помочь, зачем печатать null?

3. Не могу вам помочь, по-прежнему нет допустимого образца XML, показывающего два полных элемента: CustomerOrder и Agent.

4. Агент не является элементом node, то есть атрибутом CustomerOrder

5. Это допустимый XML-строку testXML = «<?xml version=»1.0″ encoding=»UTF-8″ standalone=»yes»?><customerOrder sourceAgentUuid=»»sdfsdf»/» />»;

Ответ №1:

@XmlIDREF плюс его аналог @XmlID — это «XMLized указатели», которые отображаются в виде строк в тексте XML. JAXB сопоставляет такие пары значений и преобразует соответствующие ссылки в хорошие ссылки на объекты.

Итак, после разархивирования вы не увидите строки из XML-файла;

 Object sourceAgentUuid
  

(в вашем случае) будет либо содержать ссылку на этот объект «source agent» (если существует такой XML-элемент с его значением @XmlID, равным этому значению), либо null в противном случае.

Комментарии:

1. Я хочу, чтобы после разблокации поля объект sourceAgentUuid был инициализирован как объект моего класса агента с инициализированным полем Uuid из xml.

2. Где находится элемент XML для объекта Agent? Пожалуйста, опубликуйте полные и синтаксически правильные элементы XML. То, что там сейчас, — это мусор.

3. Я добавляю тестовый класс в конец вопроса. Можете ли вы помочь, зачем печатать null?