Использование 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 ответ:
Можно использовать
@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 }
Для Большего Информация