вложенные @XmlJavaTypeAdapter аннотации игнорируются, когда вложенные объекты являются общими при использовании eclispelink - PullRequest
2 голосов
/ 15 июня 2011

При маршалинге дерева объектов я использую @XmlJavaTypeAdapter. Некоторые адаптеры возвращают объекты классов, которые сами имеют аннотацию @XmlJavaTypeAdapter. Это работало нормально, когда я использовал реализацию JAXB, упакованную с Websphere 7, но когда я использую 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);
    }

}

Root

@XmlRootElement
public class Root {

   @XmlJavaTypeAdapter(AAdapter.class)
   public A 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();
  }
}

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>

Я думаю, что проблема связана с общими типами. Цель состоит в том, чтобы пропустить универсальный тип от маршалинга и только маршала T, а также обработать аннотации T, если таковые имеются.

1 Ответ

0 голосов
/ 16 июня 2011

Примечание: Я EclipseLink JAXB (MOXy) Лид.

Мне удалось воссоздать эту проблему и подтвердить, что это ошибка (https://bugs.eclipse.org/350626).

Root

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;
    }

}

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>
...