4

次のメソッドがあります。これは、バックグラウンドで Jackson を使用して、エンティティのリストを json に解析します。

@Controller
@RequestMapping("/user/")
public class EditarLugarController {    

@RequestMapping(value = "stores/{id}/branches", method = RequestMethod.GET)
public @ResponseBody List<Branch> renderBranchesPerStore(@PathVariable(value = "id") Integer id) {
    if(branches == null) {
        //get branches based on store's id 
    }
   return branches;
}

このメソッドは、jquery を使用して ajax を介してビューから呼び出されます

var idBranch = '${store.id}';
$.get("http://localhost:8080/myapp/user/stores/" + idBranch+ "/branches",
    function(data) {
        // show json objects in page
}); 

問題は、このメソッドが終了すると、次の例外がスローされることです。

java.lang.IllegalStateException: getOutputStream() has already been called for this response
    at org.apache.catalina.connector.Response.getWriter(Response.java:639)

@PathVariable を削除してみました(デフォルト値を返します)。問題なく動作しますが、そのパラメーターが必要です。この問題の回避策はありますか?

編集:これは要求されたブランチ コードですが、繰り返しますが、問題に関連しているとは思いません。@PathVariable を使用しないと問題なく動作し、ブランチのリストが json に問題なく解析され、ビューに送信されるためです。また、例外を防ぐために、Jacksonに遅延ロードされた属性を解析しないように指示するHibernate用のJacksonプラグインを使用しています

@Entity
@Table(name = "BRANCH")
public class Branch implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@Column(name="BRANCH_ID")
@GeneratedValue(strategy= GenerationType.TABLE)
private Integer id;

@Column(name = "DESCRIPTION")
@Size(max = 500)
private String description;

@Column(name="STREET")
@NotNull
@Size(max = 100)
private String street;

@Column(name="NUMBER")
@NotNull
@Size(max = 6)
private String number

@Column(name="FLOOR")
@Size(max = 3)
private String floor;

@Column(name="APT")
@Size(max = 10)
private String apt

@OneToMany(cascade = CascadeType.ALL, mappedBy="branch")
private List<BranchPhoto> photos;

@JoinColumn(name = "STORE_FK", referencedColumnName = "STORE_ID")
@ManyToOne(optional = false)
private Store store;

public Branch() {}

// getters & setters

}

編集: PathVariable がなくても同じ例外が発生することに気付きました。間違ってテストしたに違いありません。したがって、実際の問題は、jsonの解析中の循環参照です

4

3 に答える 3

4

NimChimpsky が言ったように、Branch クラスのモデルの循環参照で問題が発生しました。dtos を使用してシリアライゼーションを簡単にする以外に、(私のように) DTO を使用したくない人のための別の解決策は、いくつかの注釈を使用して Jackson に属性の処理方法を伝えることです。必要な注釈は次のとおりです。

クラス Store では、属性は次のように分岐します。

@OneToMany(mappedBy = "store", cascade = CascadeType.ALL)
@JsonManagedReference // this annotation prevents the exception
private List<Branch> branches

また、Branch クラスの属性ストアでは、次のようになります。

@JoinColumn(name = "LUGAR_FK", referencedColumnName = "LUGAR_ID")
@ManyToOne(optional = false)
@JsonBackReference // this annotation prevents the exception
private Lugar lugar;
于 2013-06-24T15:30:18.333 に答える
3

Branch には非プリミティブが含まれていますか?

そのシリアル化が原因のようです...具体的には循環参照です。

私は通常、フォーム固有の dto を作成し、シリアル化をシンプルに保ちます。

于 2013-06-24T14:06:36.870 に答える