コードがさまざまな場所で無効な修飾名を作成しているという事実によって引き起こされる、多くの JAXB シリアライゼーション エラーに遭遇しました。私が使用している API やその他の Java XML オプションを調査していますが、奇妙なことの 1 つは、修飾名を実装するクラスが入力チェックをまったく実行していないように見えることです。
複雑なコードはさまざまな JAXB オブジェクトを生成するため、これは非常に問題があり、何かがひどく間違っていることに気付くのはマーシャリングの時までではありません。例外スタックは通常、どの要素/属性が間違っているかを教えてくれません。何かが間違っているだけです。
これらのライブラリが、シリアライズ不可能なコンテンツを最初から作成することをより困難にすることは、より理にかなっているのではないでしょうか?
コード スニペットを次に示します。なぜこれが機能するのでしょうか。スローすべきではありませんIllegalArgumentException
か?QName を定義する他の API でも、動作は同じです。このクラスの javadoc は、名前空間が null の場合は を取得する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 であることを示す仕様制約。つまり、仕様によれば、シリアル化に関係なく、上記のコードは明らかに無効です。