0

Hibernate 4.1 と Spring 3.1 を使用しています。

自分自身を含む他のオブジェクトへの参照を持つ次の User クラスを検討してください。私が定義したすべての hibernate マッピングは LAZY であるため、参照オブジェクトを jsp またはコードで使用する場合にのみロードします。

class User {
  private User createdBy;
  private Department department;
  private Project project;
  .....
  .....
}

問題は、リフレクションを使用して深いシリアル化を行う JSON 表現を返したい場合です。以下は私のコントローラーコードです。

@ResponseBody
public User getUser(int id) {
  User user = [fetch user from service];
  return user;
}

私も自己参照を持っているので、無限ループに入ります。

この問題を回避するための解決策は何ですか? 代わりに UserDTO を返す DTO パターンを使用する必要があることはわかっていますが、そのようなメソッドをいくつ作成しますか。たとえば、ある場所では基本的なユーザー属性のみが必要であり、別の場所ではユーザーとその部門が必要であり、別の場所ではユーザーと部門とプロジェクトが必要です。

公開する必要があるそのようなメソッドの数。これを解決する他の方法はありますか?

4

3 に答える 3

1

問題は、循環参照があり、JSON エンコーダーがそれを処理していないことです。そのため、手動で処理する必要があります。

あなたがコメントしたようにDTOを作成すると役立ちます。必要なデコードのレベルごとに 1 つのメソッドを使用してヘルパーを実装できます。

BeanUtilsある Bean から別の Bean に各プロパティをコピーするために使用できます。

別の解決策(もう少し概念的なもの)は次のとおりです。

境界メソッドごとに一種のデコレータを実装し、結果にdozerを適用します。あなたがここで取ることができる例

装飾は多かれ少なかれ次のように発生します。

public interface Controller {
   User getUser(int id);
}

public class RealController {
   public User getUser(int id) {
      return dao.getUser(id);
   }
}

public class DecoratedController {

   private Controller realController;

   public User getUser(int id) {
      // here you will apply dozer or do it manually creating an object with so deep as you wish
      return flatUserStructure(realController.getUser(id));
   }
}
于 2012-07-02T09:11:10.573 に答える
0

問題は2つの部分で構成されていると思います。

JSONカスタムシリアル化:このアプローチを使用して、の複数UserDTOのを定義することを回避できますUser。ただし、JSONシリアライザーをBeanまたは構成可能なサービスオブジェクトとして定義して、さまざまなコントローラーメソッドマッピングで何をシリアル化するかをコマンドできるようにする必要があります。良い例はここにあります。

Springの構成:次のステップは、顧客のJSONシリアライザーを使用するようにSpringを構成することです。したがって、を使用する場合@ResponseBody、SpringはカスタムJSONシリアライザーを使用します。良い例はあちこちで見つけることができます

于 2012-07-02T09:23:32.550 に答える
0

fetch joinを使用して Hibernate アソシエーションのロードを調整できるようにするには、 14.3をお読みください。関連付けと結合

深いシリアライゼーションの問題を回避するには、適切な DTO を作成し、 Jackson Java JSON プロセッサプロジェクトの@JsonIgnoreアノテーションなどを使用して調整します。

于 2012-07-02T09:21:04.990 に答える