用于Generic类的MessageBodyReader / Writer

时间:2013-11-04 23:49:29

标签: java generics jersey

我有一个班级

public class Tree<T> {
    private T value;
    private Tree<T> parent;
    private List<Tree<T>> children;
    ...
}

然后我想创建一个MessageBodyReader和Writer,以便能够生成和使用代表此类实例的JSON,但没有循环引用。因此,JSON文档将排除父级。

然后我得到一个我将实现的方法,看起来像这样

@Override
public Tree<?> readFrom(Class<Tree<?>> type, Type genericType,
        Annotation[] annotations, MediaType mediaType,
        MultivaluedMap<String, String> httpHeaders, InputStream entityStream)
        throws IOException, WebApplicationException {

我该如何确定?在Class&lt; Tree&lt;?&gt;&gt;中还是在genericType?换句话说:我怎样才能确定Tree类所携带的对象类型?

1 个答案:

答案 0 :(得分:1)

您要查找的信息将存储在genericType参数中。 genericType的实际类型取决于您尝试(联合国)将JSON编入的Tree<T>层次结构的复杂性。请注意,genericType是从资源方法签名派生的(对于读者)。例如,对于以下方法:

@GET
public String get(final Tree<String> tree) { ... }

genericType将包含预期的泛型类型信息。但是对于像这样的方法:

@GET
public String get(final Tree tree) { ... }

Tree的参数类型为Object

注意:您可以使用Jersey中可用的JSON模块而不是(un)将Java对象编组为JSON,并尝试使用JSON&lt; - &gt; Object的JAXB方法(在这里您可以使用@XmlTransient注释从(联合国)编组中省略parent。在Jersey 2.3+中,还有一个entity-filtering的概念,它允许您选择哪些字段应被视为(未)编组到JSON中/从JSON编组。