Использование JAXB для создания объектов-ссылок в соответствии с атрибутом


Рассмотрим следующий xml:

<Config>
    <Paths>
        <Path reference="WS_License"/>
    </Paths>

    <Steps>
        <Step id="WS_License" title="License Agreement" />
    </Steps>
</Config>

Следующие классы JAXB:

public class Path {

    private String _reference;

    public String getReference() {
        return _reference;
    }

    @XmlAttribute
    public void setReference( String reference ) {
        _reference = reference;
    }

}

И

public class Step {

    private String _id;
    private String _title;

    public String getId() {
        return _id;
    }

    @XmlAttribute
    public void setId( String id ) {
        _id = id;
    }

    public String getTitle() {
        return _title;
    }

    @XmlAttribute
    public void setTitle( String title ) {
        _title = title;
    }

}

Вместо того, чтобы хранить ссылку в объекте Path в виде строки, я хотел бы сохранить ее в качестве объекта Step. Связующим звеном между этими объектами являются атрибуты reference и id. Является ли атрибут @XMLJavaTypeAdapter правильным? Может ли кто-нибудь быть настолько добр, чтобы привести пример правильного использования?

Спасибо!

Редактировать:

Я бы тоже хотел это сделать. та же техника с элементом.

Рассмотрим следующий xml:

<Config>
    <Step id="WS_License" title="License Agreement">
        <DetailPanelReference reference="DP_License" />
    </Step>

    <DetailPanels>
        <DetalPanel id="DP_License" title="License Agreement" />
    </DetailPanels>
</Config>

Следующие классы JAXB:

@XmlAccessorType(XmlAccessType.FIELD)
public class Step {

    @XmlID
    @XmlAttribute(name="id")
    private String _id;

    @XmlAttribute(name="title")
    private String _title;

    @XmlIDREF
    @XmlElement(name="DetailPanelReference", type=DetailPanel.class)
    private DetailPanel[] _detailPanels; //Doesn't seem to work

}

@XmlAccessorType(XmlAccessType.FIELD)
public class DetailPanel {

    @XmlID
    @XmlAttribute(name="id")
    private String _id;

    @XmlAttribute(name="title")
    private String _title;

}

Свойство _detailPanels в Step-объекте пустое, и ссылка, похоже, не работает. Есть ли возможность создать ссылку без создания нового объекта JAXB, содержащего только ссылку на DetailPanel?

Еще раз спасибо:)!

1 3

1 ответ:

Можно использовать @XmlID для отображения свойства в качестве ключа и @XmlIDREF для отображения ссылки на ключ для данного случая использования.

Шаг

@XmlAccessorType(XmlAccessType.FIELD)
public class Step {

    @XmlID
    @XmlAttribute
    private String _id;

}

Путь

@XmlAccessorType(XmlAccessType.FIELD)
public class Path {

    @XmlIDREF
    @XmlAttribute
    private Step _reference;

}

Для Получения Дополнительной Информации


Обновить

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

Примечание: я EclipseLink JAXB (MOXy) ведущий и член группы JAXB (JSR-222) экспертная группа.

Если вы используете MOXy в качестве поставщика JAXB (JSR-222), то вы можете использовать аннотацию @XmlPath для вашего варианта использования.

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlAccessorType(XmlAccessType.FIELD)
public class Step {

    @XmlID
    @XmlAttribute
    private String id;

    @XmlPath("DetailPanelReference/@reference")
    @XmlIDREF
    // private List<DetailPanel> _detailPanels; // WORKS
    private DetailPanel[] _detailPanels; // See bug:  http://bugs.eclipse.org/399293

}

Для Большего Информация