Xml Java/Jersey/JAXB/MOXy-序列化给定基类对象的派生成员

Xml Java/Jersey/JAXB/MOXy-序列化给定基类对象的派生成员,xml,serialization,jaxb,jersey,moxy,Xml,Serialization,Jaxb,Jersey,Moxy,我有一个RESTfulJersey web服务,它以XML形式返回对象。返回对象的一个成员是几种可能的类型之一(都是从公共基类派生的),直到运行时才知道。我无法使此成员显示在输出XML中,如下所示 我已将问题简化为一些示例类: @XmlRootElement public abstract class Animal { public String type; public Animal() { type = "?"; } public Ani

我有一个RESTfulJersey web服务,它以XML形式返回对象。返回对象的一个成员是几种可能的类型之一(都是从公共基类派生的),直到运行时才知道。我无法使此成员显示在输出XML中,如下所示

我已将问题简化为一些示例类:

@XmlRootElement
public abstract class Animal {

    public String type;

    public Animal() {
        type = "?";
    }

    public Animal(String type) {
        this.type = type;
    }
}

@XmlRootElement
public class Mammal extends Animal {

    public String name;

    public Mammal() {
        name = "?";
    }

    public Mammal(String type, String name) {
        super(type);
        this.name = name;
    }
}

@XmlRootElement
public class Zoo {
    private Animal creature;

    @XmlElementRef
    public Animal getCreature() {
        return creature;
    }

    public void setCreature(Animal creature) {
        this.creature = creature;
    }

    public Zoo() {
        creature = new Mammal("Mouse", "Mickey");
    }
}

@Path("/test")
public class TestResource {

    @GET
    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
    public Zoo get() {
        Zoo z = new Zoo();
        return z;
    }
}
当我呼叫服务时,我得到以下响应:

<zoo/>
现在,即使来自服务的XML是错误的(只是空标记),我在控制台中看到了正确的输出:

<?xml version="1.0" encoding="UTF-8"?>
<zoo>
   <mammal>
      <type>Mouse</type>
      <name>Mickey</name>
   </mammal>
</zoo>

老鼠
米奇

现在,为了获得该输出,我必须确保Mayman.class被传递给JAXBContext.newInstance(),否则我在输出中得到了相同的空标记,所以我猜问题在于web服务正在进行的XML序列化不知道派生的Mayman类,因此无法正确序列化对象。这是正确的诊断吗?我怎么修理它

问题在于Jersey将从返回类型
Zoo
创建的默认
JAXBContext
将不知道
哺乳动物类。它将引入
Animal
,但不会引入它的任何子类(因为不存在这样做的API)。这就是为什么当您创建一个
JAXBContext
时,为了日志记录的目的,它知道
哺乳动物
,一切都正常工作

解决方案#1-利用
@xmlsee

@xmlseealal
注释告诉JAXB impl,当您处理这个类时,也会处理这些其他类。通常,这用于引用映射的子类

@XmlRootElement
@XMLSEEALSE({emdamal.class})
公共抽象类动物{
公共字符串类型;
公共动物(){
type=“?”;
}
公共动物(字符串类型){
this.type=type;
}
}
解决方案#2-利用JAX-RS
ContextResolver

我提到这个问题是由于Jersey创建的默认
JAXBContext
不会意识到
哺乳动物
类。您可以使用
ContextResolver
返回
JAXBContext
,即。下面是创建
ContextResolver
示例的链接:

<?xml version="1.0" encoding="UTF-8"?>
<zoo>
   <mammal>
      <type>Mouse</type>
      <name>Mickey</name>
   </mammal>
</zoo>