JAXB 2(Oracle / Metro 版本 2.2.7,我也怀疑其他版本)似乎不能容忍枚举元素中值周围的空格。
最小的例子如下。xmllint和Xerces都根据模式验证实例。令人费解的想法是,JAXB 验证不会抱怨,而是在尝试访问该值时返回null 。如何配置它以正确返回值?
更新:我已经尝试关联 anXmlAdapter
来修剪字符串,如此处所建议的,但结果是一样的。
更新二:这是Metro JAXB Jira 的车票。
a.xsd
<xs:schema targetNamespace="foo://a"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="foo://a">
<xs:element name="type" type="Type"/>
<xs:simpleType name="Type">
<xs:restriction base="xs:token">
<xs:enumeration value="Archive"/>
<xs:enumeration value="Organisation"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
一个.xml
<a:type xmlns:a="foo://a" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="foo://a A.xsd"
>Organisation </a:type>
(注意“组织”后的空格)
解组码
public static void main(String args[]) throws Exception {
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
JAXBContext payloadContext = JAXBContext.newInstance("a");
Unmarshaller unmarshaller = payloadContext.createUnmarshaller();
unmarshaller.setSchema(schemaFactory.newSchema(new Source[]{new StreamSource(new FileInputStream(new File("A.xsd")))}));
JAXBElement<?> oUnmarshalled = (JAXBElement<?>) unmarshaller.unmarshal(new File("a.xml"));
Object o = oUnmarshalled.getValue(); // returns NULL
}