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パラメーターに格納されます。の実際のタイプは、 JSON を (非) マーシャリングしようとしている階層genericTypeの複雑さに依存します。はリソース メソッドの署名から (リーダー用に) 派生Tree<T>していることに注意してください。genericTypeたとえば、次のようなメソッドの場合:

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

これにgenericTypeは、予想されるジェネリック型情報が含まれます。しかし、次のようなメソッドの場合:

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

のパラメータ タイプは にTreeなりますObject

注:自分で Java オブジェクトを JSON に (非) マーシャリングする代わりに、Jersey で利用可能な JSON モジュールを使用して、JSON<->Object の JAXB アプローチを試すことができます (ここでは、@XmlTransientアノテーションを使用してparent(非) マーシャリングを省略できます)。Jersey 2.3+ には、エンティティ フィルタリングの概念もあり、JSON に (非) マーシャリングされると見なされるフィールドを選択できます。

于 2013-11-05T12:17:10.347 に答える