[英]Jackson JSON and lazy loaded collections
我有一類懶加載一個集合。 現在,我有兩個不同的查詢,一個查詢在不收集數據的情況下加載數據,另一個在查詢整個數據。 當執行不加載集合的查詢時,出現以下錯誤:
JsonMappingException: failed to lazily initialize a collection of role: Player.goals
我試圖通過使用@JsonInclude(JsonInclude.Include.NON_EMPTY)
批注來修復此問題,但這沒有幫助。
如何基於同一個類產生兩個不同的JSON結果?
更新:更新了結構並添加了JSONView,但錯誤沒有改變。
模型
@Entity
public class User implements Serializable {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "owner")
private Collection<Team> teams = new ArrayList<Team>();
}
@Entity
public class Team implements Serializable {
...
@OneToMany(cascade = CascadeType.ALL, mappedBy = "team", targetEntity = Player.class, fetch = FetchType.EAGER)
@JsonView(UserViews.User.class)
private Collection<Player> players = new ArrayList<Player>();
...
}
@Entity
public class Player implements Serializable {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "player", targetEntity = Goal.class, fetch = FetchType.LAZY)
@JsonView(UserViews.UserWithGoals.class)
private Collection<Goal> goals= new ArrayList<Goal>();
...
}
查詢
@Query("SELECT u FROM User u WHERE u.id = :id")
Team findById(@Param("id") Long id);
彈簧控制器
@RequestMapping(headers = "Accept=application/json")
@JsonView(UserViews.User.class)
public @ResponseBody Team getTeam(Authentication authentication) {
User user = userService.findById(1);
return team;
}
通過這種配置訪問,控制器不應加載Player類的Goals
,但這正是JSONMappingException中提到的部分。 知道有什么問題嗎?
也許您可以看看Jackson JsonViews: http ://wiki.fasterxml.com/JacksonJsonViews。
您將必須在實體中定義兩個不同的視圖:
@Entity
public class Team implements Serializable {
...
@OneToMany(cascade = CascadeType.ALL, mappedBy = "team", targetEntity = Player.class, fetch = FetchType.LAZY)
@JsonView(FullView.class)
private Collection<Player> players = new ArrayList<Player>();
...
}
並在調用方方法中激活視圖(通常是JAX-RS實現-請參見http://wiki.fasterxml.com/JacksonJsonViews#Views_with_JAX-RS )
這樣做,播放器列表在第一種情況下將被忽略,並且僅在列表被填充時才以JSON序列化。
語法不正確,對不起,但您明白了
為了防止延遲,您可以在Spring中配置xml或java中的OpenEntityManagerInVew過濾器(不記得確切的語法):
<filter>
<filter-name>openEntityManagerInViewFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openEntityManagerInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
希望能幫助到你
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.