簡體   English   中英

傑克遜JSON和延遲加載的集合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM