我有一个xsd,我从中生成一些java代码:
<xs:element name="full-account-v2" >
<xs:complexType>
<xs:sequence>
<xs:element name="ban" type="xs:string" />
<xs:element name="status" type="xs:int" />
</xs:sequence>
</xs:complexType>
</xs:element>
这一直运行良好,并为我提供了一个名为FullAccountV2的生成类。
我想在其他地方使用相同的复杂类型,所以我想在xsd文件中创建一个命名复杂类型,并这样引用它:
<xs:element name="full-account-v2" type="fullAccountV2Type"/>
复杂类型定义如下:
<xs:complexType name="fullAccountV2Type">
<xs:sequence>
<xs:element name="ban" type="xs:string" />
<xs:element name="status" type="xs:int" />
</xs:sequence>
</xs:complexType>
现在突然间,理发师停止了工作。以下xml被解组为FullAccountV2:
<er-response id="100058" version="2">
<payload>
<full-account-v2>
<ban>BAN_P146058461158163004</ban>
<status>401</status>
</full-account-v2>
</payload>
</er-response>
但现在该类不再出现,jaxb将xml解组为具有Qname
full-account-v2
和declaredType
FullAccountV2Type
的JAXBElement
。
ErResponse和Payload在其他地方定义为:
<xs:complexType name="payloadType">
<xs:sequence>
<xs:any processContents="lax" minOccurs="0" />
</xs:sequence>
</xs:complexType>
我尝试在一个单独的xml文件中为元素声明定义类型,但得到了相同的结果。
这么简单的重构怎么会让我挣扎8个小时呢?我做错了什么?
注意,这似乎是这个问题的反面
更改为
<xs:element name="full-account-v2" type="fullAccountV2" />
<xs:complexType name="fullAccountV2">
<xs:sequence>
<xs:element name="ban" type="xs:string" />
<xs:element name="status" type="xs:int" />
</xs:sequence>
</xs:complexType>
现在,JAXB模式编译器将按照前面的FullAccountV2
名称生成一个工件。
也可以使name
和type
具有相同的值,即FullAccountV2
。以下更改也适用于
<!-- one is element and other is complexType -->
<xs:element name="fullAccountV2" type="fullAccountV2" />
<xs:complexType name="fullAccountV2">
<xs:sequence>
<xs:element name="ban" type="xs:string" />
<xs:element name="status" type="xs:int" />
</xs:sequence>
</xs:complexType>
上面的模式定义也将像前面一样生成工件FullAccountV2
。模式编译器使用我们分配给type
的任何内容来派生工件名称。
如果使用schemagen
生成模式xsd
,则这一点在其他情况下也很明显。例如,对于下面显示的类定义
@XmlRootElement
public class Pojo {
public Pojo p;
}
schemagen
生成低于模式定义的
<xs:element name="pojo" type="pojo"/>
<xs:complexType name="pojo">
<xs:sequence>
<xs:element name="p" type="pojo" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
注意,name
和type
具有相同的值,即默认情况下的类名。