Как правильно обрабатывать тело запроса с взаимными ссылками oject в REST Spring? - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть объекты, которые имеют ссылки на себя, например:

  • Client имеет много Properties
  • Property имеет много Clients

Возвращение списка Properties по Client id вызывает StackOverflowError, потому что оно продолжает вкладывать Properties внутри Client и т. Д.

Как я могу справиться с вложением в большинстве правильный / элегантный способ?

Сервис

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

Контроллер

    @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<>();
}

1 Ответ

0 голосов
/ 09 февраля 2020

Если вы используете Jackson 2.6+, вы можете использовать @JsonProperty(access = Access.WRITE_ONLY) для свойства, которое не хотите сериализовать. Поэтому, если вы хотите включить клиентов при получении ваших домов, поместите его в поле properties в вашем классе Client, которое будет просто игнорировать это поле во время сериализации. Тем не менее, я бы посоветовал вам отделить слой вашей базы данных от слоя представления и отобразить каждую сущность в DTO, что вам очень поможет в долгосрочной перспективе.

Вы можете прочитать больше об аннотации JsonProperty здесь .

...