gpt4 book ai didi

java - 如何在 REST Spring 中正确处理具有相互对象引用的请求主体?

转载 作者:行者123 更新时间:2023-12-01 18:32:13 25 4
gpt4 key购买 nike

我的实体引用了自身,例如:

  • Client 有许多Properties
  • 特性有许多客户

Client id 返回 Properties 列表会导致 StackOverflowError,因为它会在 Client 内部嵌套 Properties 等等。

如何以最正确/优雅的方式处理嵌套?

服务

    public Set<Home> getHouses(Long userId) {
return Utils.iterableToCollection(((HomeRepository) (getRepository())).findAll(), HashSet::new);
}

Controller

    @GetMapping("/all")
@ResponseBody
public GenericResponse getHouses(@RequestParam("id") Long userId) {
Set<Home> houses = homeService.getHouses(userId);
return new GenericResponse(
"houses fetched successfully",
houses,
HttpStatus.OK
);
}

首页

public class Home extends AbstractEntity<Long> {

@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "homeAddress_id")
private Address address;

@ManyToMany(mappedBy = "properties", fetch = FetchType.EAGER)
private Set<Client> clients = new HashSet<>();

@Lob
private byte[] apartmentPicture;
}

客户端

public class Client extends User {

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "CLIENT_HOME",
joinColumns = @JoinColumn(name = "client_id"),
inverseJoinColumns = @JoinColumn(name = "home_id")
)
private Set<Home> properties = new HashSet<>();
}

最佳答案

如果您使用 Jackson 2.6+,则可以对不想序列化的属性使用 @JsonProperty(access = Access.WRITE_ONLY)。因此,如果您想在获取房屋时包含客户端,请将其放在 Client 类中的 properties 字段中,该类会在序列化期间忽略该字段。不过,我建议您将数据库层与表示层解耦,并将每个实体映射到 DTO,从长远来看,这对您有很大帮助。

您可以阅读有关 JsonProperty 注释的更多信息 here .

关于java - 如何在 REST Spring 中正确处理具有相互对象引用的请求主体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60140334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com