Spring Data REST с CosmosDB - могу ли я исключить детей из ответа? - PullRequest
1 голос
/ 17 апреля 2020

Я использую Spring Data REST с CosmosDB, поэтому я использую аннотации типа @Document вместо @Entity. У меня есть документ верхнего уровня с именем Fighter, каждый из которых имеет List<Attack>, который содержит 200-300 Attack объектов.

Когда я вызываю конечную точку /fighters, он возвращает мне все Fighter объекты, как и ожидалось. Но он дает мне весь граф объектов, т. Е. Все Attack объекты встроены в Fighter в ответе. Это означает, что размер ответа составляет несколько мегабайт.

Это заставило меня подумать, что должна быть какая-то аннотация, чтобы позволить мне возвращать "поверхностный" ответ - то есть только сами объекты Fighter без детская коллекция. Однако, если он существует, я изо всех сил пытаюсь его найти.

Очевидно, что когда я запрашиваю точного Истребителя с /fighters/{id}, я бы хотел вернуть весь объект обратно, включая все Attack объекты.

Есть ли способ сделать это?

Это мой документ Fighter:

import com.microsoft.azure.spring.data.cosmosdb.core.mapping.Document;
import com.microsoft.azure.spring.data.cosmosdb.core.mapping.PartitionKey;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.Id;

import java.util.List;

@Getter
@Setter
@Document(collection = "fighters")
public class Fighter {
    @Id
    private String id;

    @PartitionKey
    private String game;
    private String name;

    private List<AttackDoc> attacks;
}

Поле attacks - это поле, которое я не хочу заполнять полностью заполняется, когда я делаю запрос /fighters GET. Attack - это просто POJO с целой загрузкой полей.

Мой репозиторий выглядит так, пока ничего:

package rc.framedata.libraofsouls;

import com.microsoft.azure.spring.data.cosmosdb.repository.CosmosRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import org.springframework.data.rest.core.annotation.RestResource;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
@RepositoryRestResource(collectionResourceRel = "fighter", path = "fighter")
public interface FighterRepository extends CosmosRepository<FighterDoc, String> {

    @RestResource(path = "name", rel = "name")
    List<FighterDoc> findByName(@Param("name") String name);
}

Я знаю, что мог бы что-то сделать вручную, например, сделать Остановите конечную точку и удалите attacks перед возвращением, но это кажется немного расточительным.

Спасибо большое!

1 Ответ

0 голосов
/ 19 апреля 2020

Не уверен с использованием Cosmos Repository, но если вы используете шаблон mon go с запросом критериев, вы можете просто получить нужные поля, добавив эти поля, как включенные в запрос. Например,

Query query = new Query ();
query = query.addCriteria()..... // Your query
query.includes("game").includes("name");

В ответе будут указаны только поля игры и названия, что приведет к уменьшению размера ответа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...