我遇到了很多 JAXB 序列化错误,这些错误是由于代码在各个地方创建了无效的限定名称这一事实引起的。我正在研究我正在使用的 API 和其他 java XML 选项,奇怪的是实现限定名称的类似乎根本不做任何输入检查。
这确实是有问题的,因为复杂的代码会生成各种 JAXB 对象,并且直到编组时间才发现某些东西出了严重的错误。异常堆栈通常不会告诉您哪个元素/属性是错误的,只是有问题。
这些库一开始就让创建不可序列化的内容变得更加困难,难道不是更有意义吗?
这是一个代码片段:为什么会这样?它不应该抛出一个IllegalArgumentException
吗?在其他定义 QName 的 API 中,行为是相同的。此类的 javadocs 指定如果命名空间为空,您将得到一个IllegalArgumentException
,否则不会。
QName q = new QName("Namespace URI is supposed to be an anyURI, but clearly !!THIS ISN'T!!",
"Local part is supposed to be an NCName, but clearly !!THIS ISN'T!!",
"<><><><>&&& Laughably Invalid Namespace Prefix");
System.out.println(q);
参考: QName 的相关 javadoc,说明 name 是 anyURI 的规范约束,而 localpart 是 NCName。换句话说,根据规范,上面的代码显然是无效的,与序列化无关。