2017-12-18 11 views
0

私はJSONの結果の書き込み私のSpringMVC RestControllerに問題がある作品:私は以下のようにドメインオブジェクトを返すときRestControllerから返されたドメインオブジェクトはAJAXエラーを引き起こします。カスタムモデルオブジェクトが

1)、ActivitiesT、私はクライアント - にAJAX 500内部サーバーエラーを取得します側。

@RequestMapping("/participant/activityForEvent") 
public ActivitiesT getActivityForGuiEventId() throws Exception { 
    ActivitiesT activitiesT = participantService.getActivity(); 
    return activitiesT; 
} 

ActivitiesTドメインオブジェクト、Hiberate-生成:

@Entity 
@Table(name = "activities_t", schema = "public") 
public class ActivitiesT implements java.io.Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    private int id; 
    //... etc... 
} 

2)しかし、私はカスタムPOJOを返すとき、AJAXメソッドが動作します。それはほぼ同じです。

@RequestMapping("/participant/activityForEvent") 
public ActivitiesT getActivityForGuiEventId() throws Exception { 
    ActivitiesT activitiesT = participantService.getActivity(); 
    // Create a custom Activity POJO and return it 
    return new Activity(activitiesT.id, activitiesT.title); 
} 

活動カスタムPOJO:

public class Activity implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    public int id; 
    public String title; 
    //etc. 

エラーメッセージ

HTTP Status 500 - Could not write JSON: could not initialize proxy - no Session; nested exception is com.fasterxml.jackson.databind.JsonMappingException: could not initialize proxy - 

(参照チェーンを通して:com.myapp ")なしセッション

には、いくつかの注意事項:

  • 両方のオブジェクトがSerializableを実装し、それが
  • いいのよ問題はDAOはありませんが、私はDAOは常に両方のために正しいデータを返し、私たちはコントローラーが@RestControllerでアノテートされたDAOピース
  • を無視することができます見ることができ、それので、常にJSONを出力します。私はResponseBodyや古いタグは必要ありません

問題がどこにあるのでしょうか?問題は、これに沸く:

    • 私は@Entity Hibernateは、生成されたPOJOを上RestControllerメソッドからJSONを返すことはできませんしかし、私は私自身のカスタムのPOJOにRestControllerメソッドからJSONを返すことができ
  • +1

    投げられた例外( '500 Internal Server Error')を教えてください。 – lzagkaretos

    +0

    サーバー側で例外がスローされない場合、コントローラーはOKを完了します。クライアントサイドでAJAX JSにアクセスするとFirebugで500の内部サーバーエラーしか表示されません。 –

    +1

    500内部サーバーエラーは、何かがサーバー側で起こっていることを示します。私はこの種の問題を見てきました。大きなオブジェクトのシリアライズでは、「ActivitiesT」はControllerが値を返した後に何らかのExceptionがスローされた単純なオブジェクトまたは複雑なオブジェクト(ちょうど推測)です。 – lzagkaretos

    答えて

    1

    ジャクソンがレスポンスを準備すると、モデルクラスをJSONに再帰的に変換しようとします。たとえば、DepartmentとEmployeeの関係が1対多の関係にある場合、JacksonはDepartment.javaのgetEmployees()メソッドを実行してレスポンスを準備します。getEmployees ()メソッドは、hibernateに従業員レコードを取得するために別のクエリを実行する必要がありますDBはLazyローディングによるものです。しかし、セッションはすでに閉鎖されています。したがって、このエラーが発生します。 これを避けるには、実際のモデルクラスの代わりにDTOを使用してください。RestControllerから返されたドメインオブジェクトは、AJAXエラーを引き起こします。カスタムモデルオブジェクトは機能します。

    +0

    はい、すべてのJSONを返すメソッドで普通のPOJOを使用していますありがとう –

    関連する問題