5

いくつかの結果と結果の総数のクライアントリストに戻る必要があります。エンティティが異なるいくつかの場所でそれを行う必要があるため、次の2つの属性を持つジェネリッククラスが必要です。

@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たが、うまくいきませんでした。コレクションのメンターだと思います。

4

3 に答える 3

6

これと自分で戦った後、私は答えがかなり単純であることを発見しました。サービスで、それに応じて入力された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)マーシャリング/アンマーシャリングを処理します。しかし、私はこれを試したことがないので、それは単なる理論です。

于 2013-02-01T12:08:55.280 に答える
1

私はまったく同じ問題を抱えていました。この問題は、Javaの型消去が原因で発生します。

私の最初のアプローチは、エンティティタイプごとに結果クラスを生成することでした。

public class Entity1Result extends QueryResult<Entity1> { ... }

public class Entity2Result extends QueryResult<Entity2> { ... }

、またはQueryResult<>などの組み込みタイプの場合にのみ、サービスでジェネリックを返しました。QueryResult<String>QueryResult<Integer>

しかし、私にはたくさんの実体があったので、これは面倒でした。したがって、他のアプローチはJSONのみを使用することであり、結果クラスを非汎用に変更し、Object結果フィールドを使用しました。

public class QueryResult {
   private Object result;
}

正常に動作し、Jerseyは私が提供するすべてのものをJSONにシリアル化できます(注:それが重要かどうかはわかりませんが、QueryResultすべてのエンティティには@Xml...注釈が付いています。これは、独自のエンティティタイプを持つリストでも機能します。

コレクションに問題がある場合は、この質問も表示されます

于 2012-06-06T07:19:21.007 に答える
1

@XmlSeeAlsoアノテーションを使用して解決しました:

@XmlSeeAlso(TestEntity.class)
@XmlRootElement
public class QueryResult<T> implements Serializable {
    ...
}

別の可能性はを使用すること@XmlElementRefsです。

于 2012-06-06T08:25:47.263 に答える