如何解决Java SE 与 EclipseLink 实现中的 JAXB 布尔值解释差异
我们的应用程序的功能最近在库更新后被破坏了。进一步调查显示,更新前使用了 weblogic (eclipselink-2.6.5.jar
) 提供的 JAXB 实现,更新后使用了 Java SE 8 实现。
以下最小的复制示例展示了它:
import java.io.IOException;
import java.io.StringReader;
import java.util.Collections;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.eclipse.persistence.jaxb.JAXBContextFactory;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
@XmlRootElement(name = "TestData")
class TestData
{
@XmlElement(name = "bool")
boolean bool;
}
public class Main
{
public static void main(String ... args) throws JAXBException,ParserConfigurationException,SAXException,IOException
{
String xml = "<TestData> <bool>True</bool> </TestData>";
Document document = DocumentBuilderFactory.newInstance()
.newDocumentBuilder()
.parse(new InputSource(new StringReader(xml)));
JAXBContext jaxbContext;
// JAXB - java se implementation
// jaxbContext = JAXBContext.newInstance(TestData.class);
// JAXB - eclipselink 2.6.5 implementation
jaxbContext = JAXBContextFactory.createContext(new Class<?>[] {TestData.class},Collections.emptyMap());
TestData data = (TestData) jaxbContext.createBinder().unmarshal(document);
System.out.println(data.bool);
}
}
上面的例子返回true
,但是当我们尝试使用JAXBContext.newInstance
而不是JAXBContextFactory.createContext
时,我们会得到false
。
我在 JAXB 规范中只发现以下与主题有某种关系的地方:
7.9.2.2。词法和值空间
[XSD PART 2] 为模式数据类型指定了值空间和词法空间。给定值可以有多个词法表示。 单个值的多个词法表示的示例是:
- 对于布尔值,值
true
有两个词法表示“true”和“1”。 - 对于整数,值 1 有两个词法表示“1.0”和“1”。
XSD PART 2 还为所有 XML 模式原子数据类型指定了规范表示。
所以,我的问题是这是 JAXB 的 EclipseLink 实现中的一个错误,如 XML is case sensitive?
附言根据{{3}}:
3.2.2.1 词法表示
定义为·boolean·的数据类型的实例可以具有以下合法文字{true,false,1,0}。
3.2.2.2 规范表示
布尔值的规范表示是一组文字 {true,false}。
因此,布尔值 True
从这个角度来看是无效的,最终在客户端解决了问题。但了解专家对此主题的看法很有趣。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。