Разбиение на страницы пакетно загружаемых вложенных полей в Spring GraphQLJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Разбиение на страницы пакетно загружаемых вложенных полей в Spring GraphQL

Сообщение Anonymous »

У меня есть следующая структура схемы (хотя имена объектов изменены):

Код: Выделить всё

type Artist {
name: String!
fans(first: Int, after: String, last: Int, before: String): FanConnection!
}

type ArtistConnection {
edges: [ArtistEdge!]!
pageInfo: PageInfo!
}

type ArtistEdge {
cursor: String!
node: Artist!
}

type FanConnection {
edges: [FanEdge!]!
pageInfo: PageInfo!
}

type FanEdge {
cursor: String!
node: Fan!
}

type Fan {
name: String!
}

type PageInfo {
hasPreviousPage: Boolean!
hasNextPage: Boolean!
startCursor: String
endCursor: String
}

type Query {
artists(first: Int, after: String, last: Int, before: String): ArtistConnection!
}
Моя цель — пакетное разрешение объектов «Фан» при составлении списка артистов и их поклонников. Для этого я использовал окно Spring Data в качестве возвращаемого значения от сборщиков данных (методов контроллера), которое автоматически сопоставляется с соединением GraphQL с помощью Spring GraphQL. Я ссылаюсь на аргумент ScrollSubrange, автоматически предоставленный Spring GraphQl, на методы моего контроллера, поэтому я не могу использовать аннотацию @BatchMapping; это означает, что мне нужно зарегистрировать загрузчики пакетных данных вручную, и, учитывая, что все эти загрузчики пакетных данных имеют значения «Window.class», я должен затем зарегистрироваться, используя forName, а не forTypePair - что в конечном итоге означает, что я не могу решить проблемы типа Java, когда загрузчик данных ожидает Mono>, но мой загрузчик данных возвращает Mono>.
Как правильно обрабатывать пакетную загрузку объектов Fan для всех объектов Artist в результате этого запроса:

Код: Выделить всё

query {
artists {
name
fans(first: 10) {
name
}
}
}
Кажется, я нигде не могу найти конкретные примеры пакетного сопоставления + разбиения на страницы или документацию.
Вот что у меня было на данный момент:
Регистрация загрузчика данных:

Код: Выделить всё

    FanController(final FanService fanService, final BatchLoaderRegistry batchLoaderRegistry) {
this.fanService = fanService;

batchLoaderRegistry
.forName("artistFansDataLoader")
.registerMappedBatchLoader((final Set artists, final BatchLoaderEnvironment environment) -> {
final GraphQLContext graphQLContext = Optional.ofNullable(environment.getContext())
.map(GraphQLContext.class::cast)
.orElseThrow(() -> new InternalError("Failed to get GraphQL Context"));

final Identity identity = Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication())
.map(Authentication::getPrincipal)
.map(Identity.class::cast)
.orElseThrow(() -> new InternalError("Failed to get authentication principal"));

final ScrollSubrange scrollSubrange = graphQLContext.get("scrollSubrange");

return (Mono) this.fansByArtists(artists, identity, scrollSubrange);
});
}
метод выборки данных/контроллера:

Код: Выделить всё

    @SchemaMapping(typeName = "Artist", field = "fans")
public CompletableFuture artistFans(
final GraphQLContext context,
final ScrollSubrange scrollSubrange,
@Qualifier("artistFansDataLoader") final DataLoader loader,
final Artist artist
) {
return loader.load(artist);
}
и, наконец, загрузчик данных:

Код: Выделить всё

private Mono fansByArtists(
final Set artists,
final Identity identity,
final ScrollSubrange scrollSubrange
) {
final Map result = artists.parallelStream()
.collect(Collectors.toMap(
Function.identity(),
artist -> this.fanService.list(
new ListFansRequest(
identity.accountId(),
Collections.singleton(artist.id()),
scrollSubrange
)
)
));

return Mono.just(result);
}
Это ошибка типа, которую я вижу для оператора return при регистрации пакетного загрузчика данных:

Непреобразуемые типы; невозможно привести 'Mono' к 'Mono'


Подробнее здесь: https://stackoverflow.com/questions/798 ... ng-graphql
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»