2

オブジェクトツリーをマーシャリングするとき、私は@XmlJavaTypeAdapter. 一部のアダプターは、それ自体が@XmlJavaTypeAdapterアノテーションを持つクラスのオブジェクトを返します。これは、websphere 7 にパッケージ化された JAXB 実装を使用したときは正常に機能しましたが、最初のアダプターによって返されたオブジェクトorg.eclipse.persistence.jaxb.JAXBContextFactory@XmlJavaTypeAdapter注釈を使用すると無視されます。これは既知の問題ですか、それとも何か間違っていますか?

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class,C.class);

        System.out.println(jc.getClass());

        Root root = new Root();
        A a = new A();
        root.a = a;

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}

@XmlRootElement
public class Root {

   @XmlJavaTypeAdapter(AAdapter.class)
   public A a;

}

public class A {

   public B b = new B();

}

B

public class B {

  @XmlJavaTypeAdapter(GAdapter.class)
  @XmlElement(name="b")
  public G<C> gc = new G<C>();

  public B(){
    gc.t = new C();
  }
}

public class C {

    public String c = "Foo";

}

G

public class G<T> {

  T t;

}

次に、アダプターA...

public class AAdapter extends XmlAdapter<B, A> {

    @Override
    public A unmarshal(B b) throws Exception {

        A a = new A();
        a.b = b;

        return a;
    }

    @Override
    public B marshal(A a) throws Exception {

        return a.b;
    }

}

そしてジェネリック型のアダプター

public class GAdapter<T> extends XmlAdapter<T, G<T>> {

  @Override
  public G<T> unmarshal(T c) throws Exception {

    return new G<T>();
  }

  @Override
  public T marshal(G<T> g) throws Exception {

    return g.t;
  }

}

クラスでマーシャリングする場合com.sun.xml.bind.v2.runtime.JAXBContextImpl

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<root>

    <a>

    <b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="c">

        <c>Foo</c>

    </b>

    </a>

</root>

でマーシャリングするとorg.eclipse.persistence.jaxb.JAXBContext

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

<root>

   <a>

      <b>forum237.C@23752375</b>

   </a>

</root>

問題はジェネリック型にあると思います。目標は、ジェネリック型がマーシャリングされるのをスキップし、 marshal だけTでなく、 processTの注釈がある場合はそれをスキップすることです。

4

1 に答える 1

0

注: 私はEclipseLink JAXB (MOXy)のリーダーです。

この問題を再現し、それがバグであることを確認できました ( https://bugs.eclipse.org/350626 )。

package example;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement
public class Root {

    @XmlJavaTypeAdapter(AAdapter.class)
    public A<B> a;

}

package example;

public class A<T> {

    public T t;

}

Aアダプター

package example;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class AAdapter<T> extends XmlAdapter<T, A<T>> {

    @Override
    public A<T> unmarshal(T v) throws Exception {
        return new A<T>();
    }

    @Override
    public T marshal(A<T> v) throws Exception {
        return v.t;
    }

}

B

package example;

public class B {

}

デモ

package example;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class, B.class);

        Root root = new Root();
        A<B> a = new A<B>();
        a.t = new B();
        root.a = a;

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}

出力

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <a>example.B@3ecfff</a>
</root>

期待される出力

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b"/>
</root>
于 2011-06-16T17:06:24.283 に答える