9

由于我的域类中的关联不明确,新添加LinkCollectingAssociationHandler的内容会抛出一个。MappingException

链接数组如下所示:

[<http://localhost:8080/rooms/2/roomGroups>;rel="roomGroups", <http://localhost:8080/rooms/2/userGroup>;rel="userGroup", <http://localhost:8080/rooms/2/room>;rel="room", <http://localhost:8080/rooms/2/originatingConferences>;rel="originatingConferences", <http://localhost:8080/rooms/2/user>;rel="user"]

当它抛出异常时,它正试图添加另一个“房间”关系。

问题是它似乎正在添加指向我已明确标记的关系的链接@RestResource(exported = false)

这是我认为导致此问题的关系示例:

@JsonIgnore
@RestResource(exported = false)
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.room", cascade = {CascadeType.REMOVE})
private Set<RoomsByUserAccessView> usersThatCanDisplay = new HashSet<>(); 

该类型有一个由 a和 aRoomsByUserAccessView组成的嵌入 id 。RoomUser

我还注释了嵌入的 id 属性:

@JsonIgnore
@RestResource(exported = false)
private RoomsByUserAccessViewId pk = new RoomsByUserAccessViewId();

及其属性如下:

@JsonIgnore
@RestResource(exported = false)
private Room room;

@JsonIgnore
@RestResource(exported = false)
private User userWithAccess;

public RoomsByUserAccessViewId() {
    //
}

在序列化为 JSON 时,如何让它正确地忽略这些关系?

我的代码在 DATAREST-262 之前工作(https://github.com/spring-projects/spring-data-rest/commit/1d53e84cae3d09b09c4b5a9a4caf438701527550

当我尝试访问 rooms/ 端点时返回的完整错误消息如下:

{ timestamp: "2014-03-17T13:38:05.481-0500" error: "Internal Server Error" status: 500 exception: "org.springframework.http.converter.HttpMessageNotWritableException" message: "Could not write JSON: Detected multiple association links with same relation type! Disambiguate association @com.fasterxml.jackson.annotation.JsonIgnore(value=true) @javax.persistence.ManyToOne(fetch=EAGER, cascade=[], optional=true, targetEntity=void) @org.springframework.data.rest.core.annotation.RestResource(description=@org.springframework.data.rest.core.annotation.Description(value=), path=, exported=false, rel=) private com.renovo.schedulerapi.domain.Room com.renovo.schedulerapi.domain.RoomsByUserAccessViewId.room using @RestResource! (through reference chain: org.springframework.hateoas.PagedResources["content"]->java.util.UnmodifiableCollection[0]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Detected multiple association links with same relation type! Disambiguate association @com.fasterxml.jackson.annotation.JsonIgnore(value=true) @javax.persistence.ManyToOne(fetch=EAGER, cascade=[], optional=true, targetEntity=void) @org.springframework.data.rest.core.annotation.RestResource(description=@org.springframework.data.rest.core.annotation.Description(value=), path=, exported=false, rel=) private com.renovo.schedulerapi.domain.Room com.renovo.schedulerapi.domain.RoomsByUserAccessViewId.room using @RestResource! (through reference chain: org.springframework.hateoas.PagedResources["content"]->java.util.UnmodifiableCollection[0])" }

4

2 回答 2

5

我有一个非常相似的问题。在两个实体之间添加双向关系时

我遇到了一个异常“”无法编写 JSON:检测到多个具有相同的关联链接

关系类型!”,在尝试我在这里找到的一些解决方案时

@JsonIgnore, @JsonIdentity, @RestResource,我也尝试做奥利弗提供的 )

(关系用@JsonManagedReference和正确定义@JsonBackReference

没有任何帮助。

最后我设法理解弹簧数据休息正在尝试

确定相关实体是否可链接(在尝试构建

被请求的实体)

( LinkCollectingAssociationHandler : doWithAssociation -> isLinkableAssociation)

, 为此,他正在寻找一个处理

相关实体。在为相关实体添加存储库之后..就像一个魅力..

(我想在添加一个 repo 之后,一个映射 RepositoryAwareResourceInformation 正在

为这个实体创建(这是我在调试时看到的)。

于 2014-10-20T14:56:32.450 回答
0

我遇到了这个问题,并按照 Ron 的建议解决了它,但我想我会稍微解释一下。前几次阅读罗恩的答案时,我并没有完全理解……

@NodeEntity
public class Player extends Entity

@NodeEntity
public class PlayerTrade extends Entity

@NodeEntity
public class Trade extends Entity

我有 Player 和 Trade 的存储库,但没有 PlayerTrade 的存储库:

@RepositoryRestResource
public interface PlayerRepository  extends GraphRepository<Player> {

@RepositoryRestResource
public interface TradeRepository extends GraphRepository<Trade> {

一旦我添加了最后一个 repo,它就起作用了。

@RepositoryRestResource
public interface PlayerTradeRepository extends GraphRepository<PlayerTrade> 

我尝试将 @RestResource 与 rel 或排除一起使用,但无法拨入。这是否意味着我们的 JSON 图中的每个实体都必须有一个存储库?

于 2015-01-06T06:36:53.050 回答