3

@XmlElementRef で注釈が付けられた参照オブジェクトで @XmlValue 注釈を使用することは可能ですか? 目標は、次の XML 出力を生成することです。

    <foo>
       <bar>Blah</bar>
    </foo>

次の例では、JAXBContext の初期化で NPE がスローされています。

フークラス

     @XmlRootElement(name = "foo")
     public class Foo
     {
         @XmlElementRef
         private Bar bar;
     }

バークラス

     @XmlRootElement(name = "bar")
     public class Bar extends BarBase // BarBase is annotated with @XmlTransient
     {
         @XmlValue
         private String value;
     }

実装に基づいて目的の出力を達成する方法はありますか? 私はアダプターを調べてきましたが、実装に成功していません。前もって感謝します!

4

3 に答える 3

3

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

JAXBRIの問題が確認されました

JAXBRIで発生している問題を確認できました。次のスタックトレースを取得します。

Exception in thread "main" java.lang.NullPointerException
    at com.sun.xml.internal.bind.v2.runtime.property.PropertyFactory.create(PropertyFactory.java:113)
    at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.<init>(ClassBeanInfoImpl.java:166)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getOrCreate(JAXBContextImpl.java:494)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:311)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:126)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1148)
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:130)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:248)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:235)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:445)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:637)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)
    at forum14490548.Demo.main(Demo.java:10)

これはJAXBRIのバグであり、次のリンクでチケットを開くことをお勧めします。

オプション#1-JAXBRIで代替マッピングを使用する

次のマッピングは、JAXB RIで機能するようです(@XmlElementの代わりにを使用します) @XmlElementRef

import javax.xml.bind.annotation.*;

@XmlRootElement(name = "foo")
public class Foo
{
    @XmlElement
    private Bar bar;
}

オプション#2-代替JAXB(JSR-222)プロバイダーを使用する

マッピングは正しいです。EclipseLink MOXyなどの別のJAXB(JSR-222)プロバイダーを使用する場合、この例外は発生しません。以下は、JAXBプロバイダーとしてMOXyを使用する方法を説明するリンクです。

于 2013-01-24T00:42:34.857 に答える