我有一个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>
现在突然,unmarshaller停止工作。以下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>
但是现在该类不再出现了,并且xml被jaxb解组为JAXBElement
Qname
full-account-v2
和declaredType
FullAccountV2Type
。
ErResponse和Payload在其他地方定义为:
<xs:complexType name="payloadType">
<xs:sequence>
<xs:any processContents="lax" minOccurs="0" />
</xs:sequence>
</xs:complexType>
我尝试将单独的xml文件中的类型定义为元素声明,但结果相同。
这么简单的重构怎么能让我经历8个小时的挣扎?我做错了什么?
注意,这似乎是this problem
的倒数答案 0 :(得分:0)
更改为
if
现在,JAXB模式编译器将如前所述通过<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>
名称生成工件。
让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
生成架构xsd
,这也是显而易见的。例如 - 对于下面显示的类定义
schemagen
@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
具有相同的值,默认为类名。