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();

}

public class B {

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

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

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>

我认为问题在于泛型类型。目标是跳过对泛型类型进行封送处理,并且只处理 marshalT以及 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;

}

适配器

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>
于 2011-06-16T17:06:24.283 回答