2011-01-04 13 views
2

JAXBマーシャリングを実行するとき、検証エラーを収集していますが、エラーが発生した行番号と列番号も取得します。私はすべてのエラーに対してcolumnNumber = -1とlineNumber = -1を得続けます。私が忘れていることは何ですか?jaxb検証イベントロケータ - 検証エラーの行番号と列番号

コードサンプル:

Marshaller marshaler = jaxbCtx.createMarshaller(); 
marshaler.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
ValidationErrorCollector errorCollector = new ValidationErrorCollector(); 
marshaler.setEventHandler(errorCollector); 
marshaler.setSchema(getSchema()); 
marshaler.setProperty("com.sun.xml.bind.namespacePrefixMapper", new MyNamespacePrefixMapper()); 
JAXBElement<RootObject> jaxbElement = new JAXBElement<RootObject>(ROOT_QNAME, RootObject.class, (RootObject) rootObject); 
marshaler.marshal(jaxbElement, new StringWriter()); 

for (ValidationEvent validationEvent : errorCollector.getValidationEvents()) { 
validationEvent.getLocator().getColumnNumber(); // returns -1 
validationEvent.getLocator().getLineNumber(); // returns -1 
... 

public class ValidationErrorCollector implements ValidationEventHandler { 

    /** List of validation events (with validation errors). */ 
    private List<ValidationEvent> validationEvents = new ArrayList<ValidationEvent>(); 

    @Override 
    public boolean handleEvent(ValidationEvent validationEvent) { 
     // record the validation error 
     validationEvents.add(validationEvent); 
     // let validation continue 
     return true; 
    } 

答えて

1

? これは設計によるものだと思います。行番号と列番号は、アンマーシャリング時に発生するValidationEvent用です。このような場合、XMLファイルの問題の位置がアンマーシャリングされます。

あなたの場合、オブジェクトをマーシャリングしようとしています。したがって、XMLファイルがないため、列または行番号を取得しません。

+0

ありがとうございました。 umarhsallingだけで行番号を取得できるようになりました。 – padis

2

予想される動作です。マーシャリングするとき、エラーの原因はマーシャリングされているオブジェクトから発生します。オブジェクトは、イベントを通じて見つけることもできます。詳細については

は、以下を参照してください。

(どのファイルに)あなたが取得するために期待し、列と行番号
+0

ありがとうございました。つまり、私がマーシャリングを行うと、マーシャリングがオブジェクトから実行され、XMLがまだ完了していないので(ラインナップとカラム番号を得ることができないということです。そして、XMLからオブジェクトにumarshalingする際には、行番号のみを取得することができます。 – padis

+0

XMLがまだ完成していないからです。代わりに、検証イベントは問題が発生した場所を報告し、マーシャリング操作中に無効なデータがオブジェクトから発生します。 –