【问题标题】:MessageBodyReader/Writer for Generic class通用类的 MessageBodyReader/Writer
【发布时间】:2013-11-05 20:17:10
【问题描述】:

我有课

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

【问题讨论】:

    标签: java generics jersey


    【解决方案1】:

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

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

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

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

    Tree 的参数类型为Object

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

    【讨论】:

    • 我不希望任何与序列化或持久性相关的注释与我的域对象混合。我对此有点挑剔 - :)
    • 我想我将不得不向我的 domain-jar 添加另一个依赖项,看看是否能解决问题。我将测试 @JsonIgnore 注释。感谢您的提示:)
    • 我在测试@JsonIgnore 注释方面取得了巨大成功。现在我只需要在内置 MessageBodyWriter 完成它的工作后链接到正确的父级:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 2013-03-20
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    相关资源
    最近更新 更多