1

我有一堂课

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<Tree<?>> 中还是在 genericType 中?或者换一种说法:如何确定 Tree 类承载的是什么类型的对象?

4

1 回答 1

1

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

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

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

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

的参数类型TreeObject.

注意:您可以使用 Jersey 中可用的 JSON 模块并尝试 JSON<->Object 的 JAXB 方法,而不是自己将 Java 对象(un)编组为 JSON(在这里您可以使用@XmlTransient注释parent从(un)marshalling 中省略)。在 Jersey 2.3+ 中还有一个实体过滤的概念,它允许您选择哪些字段应该被认为是(未)编组到/来自 JSON。

于 2013-11-05T12:17:10.347 回答