У меня возникают проблемы при аннотировании классов моделей для поддержки желаемого unmarshalling XML - PullRequest
1 голос
/ 11 января 2012

Я заинтересован в использовании OXM-фреймворка для поддержки демаршаллинга следующего XML, который будет передаваться как полезная нагрузка HTTP POST запроса на вызов API RESTful.

Я впервые пытаюсь использовать OXM-фреймворк, и у меня возникают проблемы с правильным аннотированием классов моделей. Я использую Spring 3.0 и JAXB2 Marshaller, но мне безразлична конкретная реализация маршаллера.

Вопросы:

1) Как лучше всего аннотировать мои классы моделей, чтобы они отражали желаемую структуру XML? У меня есть пример того, как я комментировал мои классы ниже, и это приводит к Class has two properties with the same name "XXX" для моих XmlElements, когда я пытаюсь создать Marshaller.

2) Какую стратегию я могу использовать для поддержки своих аннотаций и классов? Я определял SpatialExtent как интерфейс, а затем класс, который реализует GeoBoundingBox XmlElement, реализовал этот интерфейс. Это работает для Java, но не для JAXB.

3) Есть ли места, где желаемый XML может быть улучшен для упрощения маршалинга / демаршаллинга?

Любая помощь приветствуется! --Stephan

Справка:

Вот пример XML, который я хотел бы использовать:

<?xml version="1.0" encoding="UTF-8"?>
<AnalysisSettings>
    <service id="urn:nasa:giovanni:latlonplot"/>
    <spatialExtent>
        <GeoBoundingBox>
            <south>20.0</south>
            <north>90.0</north>
            <west>0.0</west>
            <east>180.0</east>
        </GeoBoundingBox>
    </spatialExtent>
    <temporalExtent>
        <TimePeriod>
            <startTime>2008-01-01T00:00:00Z</startTime>
            <endTime>2008-01-31T00:00:00Z</endTime>
        </TimePeriod>
    </temporalExtent>
    <variables>
        <Variable>
            <dataset id="urn:nasa:modis:MYD08_D3.005"/>
            <parameter id="urn:nasa:modis:Optical_Depth_Land_And_Ocean_Mean"/>
        </Variable>
        <Variable>
            <dataset id="urn:nasa:modis:M0D08_D3.005"/>
            <parameter id="urn:nasa:modis:Optical_Depth_Land_And_Ocean_Mean"/>
        </Variable>
    </variables>
</AnalysisSettings>

GeoBoundingBox и TimePeriod не единственные возможные типы для пространственных и временных экстентов, но мне еще не приходилось определять какие-либо другие типы.

Я использую аннотации пакетов Spring.

Пример того, как я комментировал свои классы моделей:

@XmlRootElement
@XmlType(name="AnalysisSettings")
public class AnalysisSettings {

    @XmlElement(name="service")
    private Service service;

    @XmlElement(name="spatialExtent")
    private SpatialExtent spatialExtent;

    @XmlElement(name="temporalExtent")
    private TemporalExtent temporalExtent ;

    @XmlElement(name="variables")
    private Variable[] variables;

    // standard getter and setter methods...
}

Все аннотации XmlElements относятся к методам класса, которые ссылаются на объекты модели, а все аннотации XmlAttribute - к методам класса, которые ссылаются на типы данных (например, private String id).

У меня ранний XSD:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="AnalysisSettings" type="AnalysisSettingsType" />
  <xsd:complexType name="AnalysisSettingsType">
    <xsd:sequence>
      <xsd:element name="service" type="serviceType" />
      <xsd:element name="spatialExtent" type="spatialExtentType" />
      <xsd:element name="temporalExtent" type="temporalExtentType" />
      <xsd:element name="variables" type="variablesType" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="variablesType">
    <xsd:sequence>
      <xsd:element maxOccurs="unbounded" name="Variable" type="variableType" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="variableType">
    <xsd:sequence>
      <xsd:element name="dataset" type="datasetType" />
      <xsd:element name="parameter" type="parameterType" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="parameterType">
    <xsd:attribute name="id" type="xsd:anyURI" />
  </xsd:complexType>
  <xsd:complexType name="datasetType">
    <xsd:attribute name="id" type="xsd:anyURI" />
  </xsd:complexType>
  <xsd:complexType name="temporalExtentType">
    <xsd:sequence>
      <xsd:element name="TimePeriod" type="TimePeriodType" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="TimePeriodType">
    <xsd:sequence>
      <xsd:element name="startTime" type="xsd:dateTime" />
      <xsd:element name="endTime" type="xsd:dateTime" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="spatialExtentType">
    <xsd:sequence>
      <xsd:element name="GeoBoundingBox" type="GeoBoundingBoxType" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="GeoBoundingBoxType">
    <xsd:sequence>
      <xsd:element name="south" type="xsd:decimal" />
      <xsd:element name="north" type="xsd:decimal" />
      <xsd:element name="west" type="xsd:decimal" />
      <xsd:element name="east" type="xsd:decimal" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="serviceType">
    <xsd:attribute name="id" type="xsd:anyURI" />
  </xsd:complexType>
</xsd:schema>
...