Java Jersey中泛型类型的编组

Java Jersey中泛型类型的编组,java,jaxb,jersey,Java,Jaxb,Jersey,我需要返回到少数结果和结果总数的客户列表。我必须在多个具有不同实体的地方执行此操作,因此我希望有一个具有以下两个属性的泛型类: @XmlRootElement public class QueryResult<T> implements Serializable { private int count; private List<T> result; public QueryResult() { } public void se

我需要返回到少数结果和结果总数的客户列表。我必须在多个具有不同实体的地方执行此操作,因此我希望有一个具有以下两个属性的泛型类:

@XmlRootElement
public class QueryResult<T> implements Serializable {
    private int count;
    private List<T> result;

    public QueryResult() {
    }

    public void setCount(int count) {
        this.count = count;
    }

    public void setResult(List<T> result) {
        this.result = result;
    }

    public int getCount() {
        return count;
    }

    public List<T> getResult() {
        return result;
    }
}
但这会导致:
javax.xml.bind.JAXBException:class test.TestEntity,它的任何超类在此上下文中都是未知的。


返回just集合很容易,但我不知道如何返回自己的泛型类型。我曾尝试使用
GenericType
,但没有成功-我认为这是对集合的补充。

我遇到了完全相同的问题。出现此问题的原因是Java的类型擦除

我的第一种方法是为每个实体类型生成一个结果类:

public class Entity1Result extends QueryResult<Entity1> { ... }

public class Entity2Result extends QueryResult<Entity2> { ... }
它工作正常,Jersey能够将我提供的所有内容序列化为JSON(注意:我不知道这是否重要,但是
QueryResult
和我的所有实体仍然有
@Xml…
注释。这也适用于具有自己实体类型的列表


如果您在集合方面有问题,您还可以看到

我使用
@xmlseea解决了它
注释:

@XmlSeeAlso(TestEntity.class)
@XmlRootElement
public class QueryResult<T> implements Serializable {
    ...
}
@xmlsee(TestEntity.class)
@XmlRootElement
公共类QueryResult实现可序列化{
...
}

另一种可能是使用
@xmlementrefs

在我自己与之斗争之后,我发现答案相当简单。 在您的服务中,返回相应键入的GenericeEntity()的生成响应。例如:

@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response findAll(){
    return Response.ok(new GenericEntity<TestEntity>(facade.findAllWithCount()){}).build();
}
@GET
@产生({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
公众回应findAll(){
返回Response.ok(新的泛型实体(facade.findAllWithCount()){}.build();
}
请参阅本文,了解您无法简单返回GenericEntity的原因:

一个更复杂的解决方案可能是直接返回GenericEntity,并创建自己的XmlAdapter()来处理编组/解编。不过,我没有尝试过这一点,所以这只是一个理论。

Ah yes:)但只有当您没有太多实体并且始终希望返回此实体的列表时,这才有效。如果要对不同的结果类型使用
QueryResult
,那么这将变得不切实际。
public class QueryResult {
   private Object result;
}
@XmlSeeAlso(TestEntity.class)
@XmlRootElement
public class QueryResult<T> implements Serializable {
    ...
}
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response findAll(){
    return Response.ok(new GenericEntity<TestEntity>(facade.findAllWithCount()){}).build();
}