2

When marshaling an object tree I am making use of the @XmlJavaTypeAdapter. Some adapters return objects of classes which themselves have the @XmlJavaTypeAdapter annotation. This worked fine when I used the JAXB implementation packaged with websphere 7, but when I use org.eclipse.persistence.jaxb.JAXBContextFactory the @XmlJavaTypeAdapter annotations on the objects returned by the first adapter are ignored. Is this a known issue, or am I doing something wrong?

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;

}

Then the adapter for 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;
    }

}

And the adapter for the generic type

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

}

when marshaled with class 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>

when marshaled with org.eclipse.persistence.jaxb.JAXBContext

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

<root>

   <a>

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

   </a>

</root>

I think the issue is with generic types. The goal is to skip the generic type from being marshaled, and only marshal T, as well as process T’s annotations, if any.

fabian
  • 80,457
  • 12
  • 86
  • 114
user800193
  • 21
  • 4

1 Answers1

0

Note: I'm the EclipseLink JAXB (MOXy) lead.

I have been able to recreate this issue and confirm that is a bug (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 {

}

Demo

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

}

Output

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

Expected Output

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b"/>
</root>
bdoughan
  • 147,609
  • 23
  • 300
  • 400