Java 我在注释模型类以支持所需的XML解组时遇到问题
我感兴趣的是使用OXM框架来支持以下XML的解组,这些XML将作为请求的HTTP POST负载传递给RESTful API调用 这是我第一次尝试使用OXM框架,但在正确注释模型类时遇到了问题。我使用的是Spring3.0和JAXB2封送器,但我对特定的封送器实现漠不关心 问题: 1) 注释模型类以反映所需的XML结构的最佳策略是什么?下面我举了一个例子,说明了我是如何注释我的类的,当我尝试创建封送拆收器时,Java 我在注释模型类以支持所需的XML解组时遇到问题,java,xml,spring,oxm,Java,Xml,Spring,Oxm,我感兴趣的是使用OXM框架来支持以下XML的解组,这些XML将作为请求的HTTP POST负载传递给RESTful API调用 这是我第一次尝试使用OXM框架,但在正确注释模型类时遇到了问题。我使用的是Spring3.0和JAXB2封送器,但我对特定的封送器实现漠不关心 问题: 1) 注释模型类以反映所需的XML结构的最佳策略是什么?下面我举了一个例子,说明了我是如何注释我的类的,当我尝试创建封送拆收器时,类有两个同名的属性“XXX” 2) 我可以采取什么策略来支持注释和类?我将SpatialX
类有两个同名的属性“XXX”
2) 我可以采取什么策略来支持注释和类?我将SpatialXtent定义为一个接口,然后实现GeoBoundingBox XmlElement的类实现了这个接口。这适用于Java,但不适用于JAXB
3) 是否有任何地方可以改进所需的XML以简化编组/解编组
感谢您的帮助!
--斯蒂芬
背景:
下面是我想使用的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>
所有XmlElements注释都在引用模型对象的类方法上,所有XmlAttribute注释都在引用数据类型的类方法上(例如,私有字符串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>
IIRC列表上的元素名称是针对每个列表项的;也许添加一个内部类来表示集合,并使用一个XmlRootElement来保存它们?好的,我添加了一个静态内部类变量,它有一个私有成员Variables[/code>变量,用@XmlElement(name=“Variable”)
注释。现在,我只需要弄清楚如何处理spatialExtent/temporalExtent,我关于Classe的错误有两个同名的属性“XXX”
。静态内部类是否应该有@XmlType
注释?
<?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>