2

入力 xml を非整列化する単一の Long 変数を持つクラスがあります。unmarshal (単体テストを添付) を実行すると、ValidationEventHandler で次のエラーがスローされます。

[severity=ERROR,message=For input string: "",locator=node=null,object=null,url=null,line=1,col=96,offset=-1]]
LinkedException: java.lang.NumberFormatException: For input string: ""

クラスと単体テストは次のようになります -

@XmlRootElement
    public class Annotation {

    private Long creatorNo;

    public Long getCreatorNo() {
        return creatorNo;
    }

    public void setCreatorNo(Long creator) {
        creatorNo = creator;
    }
}

単体テスト -

public class AnnotationTest {

    @Test
    public void testUnmarshall() throws Exception {
        final String inputXML = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><annotation><creatorNo></creatorNo></annotation>";
        final JAXBContext jaxbContext = JAXBContext.newInstance(Annotation.class);
        final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        unmarshaller.setEventHandler(new UnmarshallerValidationEventHandler());
        final Annotation annotationObject = (Annotation)unmarshaller.unmarshal(new StringReader(inputXML));
    }
}

どうやら、Jaxb は空の要素が Long 型に渡されるのを好まなかったようです。ただし、「Annotation」クラスで「creatorNo」のタイプを Long ではなく Integer に変更すると、例外はスローされず、Jaxb は「creatorNo」を 0 に設定してクラスを作成するだけです。 ?

私が求めている実際の動作は、Jaxb に「creatorNo」をオプションとして扱い、空の XML 要素に対しては NULL に設定することです。これは可能ですか?

ありがとう

4

1 に答える 1

0

注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB 2 (JSR-222)エキスパート グループのメンバーです。

空の要素を a に変換する際に発生するLong問題は JAXB RI の問題であり、MOXy などの他の実装がこのユース ケースを正しく処理するため、JAXB の問題ではありません。次の場所で、JA​​XB RI に対するバグを記録できます。

回避策

  1. この問題のない JAXB (JSR-222) の別の実装を使用してください。このオプションは、標準 API へのコーディングの大きな利点です。
  2. デフォルトを使用すると、ValidationEventHandlerこの変換例外は無視され、ドキュメントは期待どおりに非整列化されます。
  3. aと自分XmlAdapterの間で変換するには、an を使用します。JAXB を利用して、これを簡単にすることができます。StringLongDatatypeConverter
  4. の実装を変更してUnmarshallerValidationEventHandler、変換エラーをより許容できるようにします。

UnmarshallerValidationEventHandler

import javax.xml.bind.ValidationEvent;
import javax.xml.bind.ValidationEventHandler;

public class UnmarshallerValidationEventHandler implements ValidationEventHandler {

    @Override
    public boolean handleEvent(ValidationEvent event) {
        return event.getSeverity() < ValidationEvent.FATAL_ERROR;
    }

}
于 2012-05-04T13:34:29.567 に答える