我需要返回一些结果和总数的客户列表。我必须在几个地方使用不同的实体来做,所以我想拥有一个具有以下两个属性的通用类:

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

和服务:
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public QueryResult<TestEntity> findAll(
    QueryResult<TestEntity> findAll = facade.findAllWithCount();
    return findAll;
}

实体并不重要:
@XmlRootElement
public class TestEntity implements Serializable {
    ...
}

但这会导致:javax.xml.bind.JAXBException: class test.TestEntity nor any of its super class is known to this context.
只返回集合很容易,但是我不知道如何返回自己的泛型类型。我尝试使用GenericType,但没有成功-我认为这是 Collection 的要诀。

最佳答案

我自己与之抗争之后,我发现答案相当简单。
在您的服务中,返回相应类型的GenericEntity(http://docs.oracle.com/javaee/6/api/javax/ws/rs/core/GenericEntity.html)的构建响应。例如:

@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response findAll(){
    return Response.ok(new GenericEntity<TestEntity>(facade.findAllWithCount()){}).build();
}

关于为什么不能简单地返回GenericEntity的信息,请参见这篇文章:Jersey GenericEntity Not Working

一个更复杂的解决方案是直接返回GenericEntity并创建自己的XmlAdapter(http://jaxb.java.net/nonav/2.2.4/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html)以处理编码/解码。不过,我还没有尝试过,所以这只是一个理论。

10-06 06:59