在编组对象树时,我正在使用@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();
}
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";
}
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>
我认为问题在于泛型类型。目标是跳过封送的泛型类型,并且只封送T
,以及处理T
的注释(如果有的话)。
答案 0 :(得分: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;
}
<强> A 强>
package example;
public class A<T> {
public T t;
}
<强> AAdapter 强>
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;
}
}
<强>乙强>
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>