オブジェクトツリーをマーシャリングするとき、私は@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
の注釈がある場合はそれをスキップすることです。