18

ブール値をマーシャリングおよびアンマーシャリングするためにJAXBXMLadapterを使用しています。アプリケーションのXMLファイルには、C#アプリケーションからもアクセスできます。このXMLファイルを検証する必要があり、これはXSDを使用して行われます。C#アプリケーションは、ブールノードに「True」値を書き込みます。ただし、XSDでは「true / false」または「1/0」しか許可されないため、同じことが検証されます。そのため、XSDでブール値の文字列を保持しました。その文字列はXMLAdapterによって検証され、マーシャリングとアンマーシャリングが行われます。XMLアダプタは次のとおりです。

public class BooleanAdapter extends XmlAdapter<String, Boolean> {

    @Override
    public Boolean unmarshal(String v) throws Exception {

        if(v.equalsIgnoreCase("true") || v.equals("1")) {
            return true;
        } else if(v.equalsIgnoreCase("false") || v.equals("0")) {
            return false;
        } else {
            throw new Exception("Boolean Value from XML File is Wrong.");
        }
    }

    @Override
    public String marshal(Boolean v) throws Exception {
        return v.toString();        
    }
}

上記のコードは通常の状態で機能しますが、無効なデータ(例:"abcd"または"")がxmlファイルから読み取られると、 "throw new Exception();" は伝播されず、Unmarshalプロセスは次のノードの読み取りに進みます。例外がスローされたらすぐにアプリケーションを停止したい。私の例外は食べ尽くされているようです。どんな助けでも大歓迎です。

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

29

のJavaDocからXMLAdapter#unmarshal(ValueType)

スロー: java.lang.Exception-変換中にエラーが発生した場合。呼び出し元は、ValidationEventHandlerを介してユーザーにエラーを報告する責任があります。

したがって、はい-例外は食べValidationEventHandlerられてから、スタックの一番上にスローされるのではなく、を使用して報告されます。

ValidationEventHandler例外をグループ化する(おそらくカスタムの)ものをすでに使用しているかどうかを確認するか、次DefaultValidationEventHandlerのように使用します。

unmarshaller.setEventHandler(new DefaultValidationEventHandler());

最初のエラーでアンマーシャリングエラーが発生します。

于 2012-06-20T07:13:18.697 に答える