Jaxb маршаллер анг дженерики (2) - PullRequest
3 голосов
/ 26 августа 2010

есть типы:

class A{}

@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
@XmlType(propOrder = {"obj"})
@XmlRootElement(name = "response")
public class B<T extends A> extends A{
  private T obj;

  @XmlElement(required = true)
  public T getObj() {
    return obj;
  }
}

Когда я пытаюсь упорядочить это, я получаю сообщение об ошибке:

org.springframework.oxm.MarshallingFailureException: JAXB marshalling exception; nested exception is javax.xml.bind.MarshalException
 - with linked exception:
[com.sun.istack.internal.SAXException2: unable to marshal type "com.my.B" as an element because it is missing an @XmlRootElement annotation]

Работает ли jaxbMarshaller с generic? Есть идеи?

спасибо

1 Ответ

1 голос
/ 26 августа 2010

Как создается ваш JAXBContext? Вам нужно убедиться, что он знает о B.class. Возможно, вам придется использовать аннотацию @XmlSeeAlso.

Учитывая следующее:

public class A {

}

и

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
@XmlType(propOrder = {"obj"})
@XmlRootElement(name = "response")
public class B<T extends A> extends A {

  private T obj;

  @XmlElement(required = true)  
  public T getObj() {  
    return obj;  
  }

  public void setObj(T obj) {
      this.obj = obj;
  }

}

Когда я бегу:

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(B.class);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        B b = new B();
        b.setObj(new A());
        marshaller.marshal(b, System.out);

    }

}

Я получаю:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
    <obj/>
</response>

И когда я бегу:

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(B.class);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        B b = new B();
        b.setObj(new B());
        marshaller.marshal(b, System.out);

    }

}

Я получаю:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
    <obj xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b"/>
</response>
...