0

Spring MVC + Hibernate を使用してこの webapp を開発しました。

Service 内のすべてのオブジェクトを取得し、それらをコントローラーに直接返します。通常、これらのオブジェクトは遅延初期化されるため、コレクションは空になります。

したがって、オブジェクト User の場合:

User
{
   int idUser;
   City city;
   String name;
   List<User> friends;
}

idUser と名前だけのオブジェクトを返します。City と Friends は初期化されていません。

REST API を提供するためにすべてのサービス メソッドを (変更せずに) 利用したいので、ApiController から ID 1 のユーザーを取得するように要求すると、このユーザーに関するすべての有用な情報を JSON で取得します。

GSON を使用してみましたが、都市オブジェクトを jsonize しようとするとすぐに、遅延初期化されているためクラッシュします。友達コレクションも同様です。

私のAPIでは、ユーザーIDを指定してすべての友達を取得できる別のリクエストURLがあるため、コレクションの場合は大したことではありませんが、単一のオブジェクト(この例の都市など)との関係の場合、私は遅延読み込みの定義により実際に設定されている City の ID を返したいとします。

オブジェクト全体ではなく City の cityId 属性だけを jsonize するように GSON に指示するにはどうすればよいですか?

残りのコレクションを null にすることは良い解決策なので、JSON に変換されませんか? これらの属性を無視するように GSON に明示的に指示する他の方法はありますか?

4

1 に答える 1

0

springMVC では、通常、実際のシリアライゼーションを行っているコントローラーメソッドでgson.toJson(...)、トランザクション内に配置する必要があると思います。@Transactional

フィールドをスキップしたり、Gson を使用してフィールドを選択的にシリアル化したい場合は、https: //stackoverflow.com/a/3341439 で gson 除外戦略を確認できます。フィールド注釈、フィールド名、または参照されているクラス全体に基づいてスキップできます。

Gson gson = new GsonBuilder().setExclusionStrategies(new ExclusionStrategy() {
    public boolean shouldSkipClass(Class<?> clazz) {
        return <class exclusion logic, return true for exclusion else false>;
    }
    public boolean shouldSkipField(FieldAttributes f) {
        return <field exclusion logic>;
    }
 }).create();
于 2013-12-16T02:03:12.577 に答える