1

私はJAXBクラスを持っています

@XmlTransient
@XmlLocation Locator location;
public Locator getLocation() { return location; }

しかし、(XML から) 非整列化した後、値は null です。MOXy 2.5.0、JDK 1.7.21 を使用。

何が間違っている可能性がありますか?

4

1 に答える 1

1

EclipseLink JAXB (MOXy)は機能します@XmlLocationが、DOM からアンマーシャリングしている場合Node、位置情報は取得されません。以下に例を挙げて説明します。

ジャバモデル

以下は、この例で使用する Java モデルです。

フー

import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {

    Bar bar;

}

バー

@XmlLocationクラスの注釈を使用しBarて場所を保存します。MOXy は、@XmlLocation独自のバージョンだけでなく、JAXB 参照実装 (内部パッケージに再パッケージ化されたものを含む) からのアノテーションもサポートしています。

// import com.sun.xml.bind.annotation.XmlLocation;
// import com.sun.xml.internal.bind.annotation.XmlLocation;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlLocation;
import org.xml.sax.Locator;

@XmlAccessorType(XmlAccessType.FIELD)
public class Bar {

    @XmlTransient
    @XmlLocation
    Locator location;

}

XML 入力 (input.xml)

<?xml version="1.0" encoding="UTF-8"?>
<foo>
    <bar/>
</foo>

デモコード

以下は、さまざまなタイプの入力をアンマーシャリングして位置を出力するデモ コードです。

import java.io.File;
import javax.xml.bind.*;
import javax.xml.parsers.*;
import javax.xml.stream.*;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import org.w3c.dom.Document;
import org.xml.sax.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();

        File file = new File("src/forum17288002/input.xml");
        Foo foo1 = (Foo) unmarshaller.unmarshal(file);
        outputLocation(file, foo1);

        InputSource inputSource = new InputSource("src/forum17288002/input.xml");
        Foo foo2 = (Foo) unmarshaller.unmarshal(inputSource);
        outputLocation(inputSource, foo2);

        Source source = new StreamSource("src/forum17288002/input.xml");
        XMLInputFactory xif = XMLInputFactory.newFactory();

        XMLStreamReader xmlStreamReader = xif.createXMLStreamReader(source);
        Foo foo3 = (Foo) unmarshaller.unmarshal(xmlStreamReader);
        outputLocation(xmlStreamReader, foo3);;

        XMLEventReader xmlEventReader = xif.createXMLEventReader(source);
        Foo foo4 = (Foo) unmarshaller.unmarshal(xmlEventReader);
        outputLocation(xmlEventReader, foo4);

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document document = db.parse("src/forum17288002/input.xml");
        Foo foo5 = (Foo) unmarshaller.unmarshal(document);
        outputLocation(document, foo5);
    }

    private static void outputLocation(Object input, Foo foo) {
        Locator locator = foo.bar.location;
        System.out.print(locator.getLineNumber());
        System.out.print(" ");
        System.out.print(locator.getColumnNumber());
        System.out.print(" ");
        System.out.println(input.getClass());
    }

}

出力

以下は、デモ コードを実行した結果の出力です。ロケーションにならなかった唯一の入力は、DOM 入力でした。DOMノードはMOXyがアクセスできる位置情報を保持していないため、これは理にかなっています。

3 11 class java.io.File
3 11 class org.xml.sax.InputSource
3 11 class com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl
3 11 class com.sun.xml.internal.stream.XMLEventReaderImpl
0 0 class com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl
于 2013-06-25T10:27:06.087 に答える