Проблема решателя для типа @extends в GraphQL Apollo Federation-JVM
Я новичок в Apollo Federation и Gateway и пытаюсь использовать https://github.com/apollographql/federation-jvm для демонстрационного проекта. Я создал две федеративных службы, используя федерацию jvm. Обе эти службы связаны друг с другом через шлюз Apollo. Используя этот пример шлюза узла с их официальной страницы github.
Ниже представлена схема и преобразователи для этих сервисов:
Федеративная служба 1:
video.graphql
type Video @key(fields: "videoId") {
videoId: String!
description: String
relatedNameId: String
}
type Query {
topVideo: Video
allVideos: [Video]
}
Резольверы для video.graphql
@Service
public class VideoQuery implements GraphQLQueryResolver {
private static final List<Video> videos = Lists.newArrayList(
Video.builder().videoId("vi00000001").description("Video 1").relatedNameId("nm000001").build(),
Video.builder().videoId("vi00000002").description("Video 2").relatedNameId("nm000001").build()
);
public Video topVideo() {
return videos.get(0);
}
public List<Video> allVideos() {
return videos;
}
}
Федеративная служба 2:
name.graphql
type Name @key(fields: "nameId") {
nameId: String!
displayName: String
}
type Query {
getByNameId(nameId: String): Name
getAllNames: [Name]
}
Решатели для name.graphql
@Service
public class NameQuery implements GraphQLQueryResolver {
private static final List<Name> names = Lists.newArrayList(
Name.builder().nameId("nm0000001").displayName("Pam Beesley").build(),
Name.builder().nameId("nm0000002").displayName("Dwight Schrute").build(),
Name.builder().nameId("nm0000003").displayName("Michael Scott").build()
);
public Name getByNameId(final String nameId) {
final Optional<Name> oName = names.stream().filter(name -> name.getNameId().equalsIgnoreCase(nameId))
.findFirst();
return oName.orElse(null);
}
public List<Name> getAllNames(final DataFetchingEnvironment dataFetchingEnvironment) {
return names;
}
}
Я могу без проблем вызвать все API (topVideo, allVideos, getByNameId, getAllNames) в запросе типа обеих служб через шлюз.
Однако, когда я продлить Имя Тип в видео Тип схемы, добавив следующее в схему video.graphql
type Name @key(fields: "nameId") @extends {
nameId: String! @external
getVideoByNameId: [Video]
}
Я не уверен, как написать преобразователь для поля getVideoByNameId.
Я попытался добавить метод getVideoByNameId(String nameId) в VideoQuery.java (возвращающий жестко закодированный объект видео из метода getVideoByNameId), но график всегда возвращает значение null.
Я также попытался создать RuntimeWiring, используя приведенный ниже код, а затем передать его при создании объекта GraphQLSchema, как показано в примере на их странице github.
private static RuntimeWiring getRuntimeWiring(){
return RuntimeWiring.newRuntimeWiring()
.type(newTypeWiring("Name")
.dataFetcher("getVideoByNameId", new StaticDataFetcher(someVideo)))
.type(newTypeWiring("Query")
.dataFetcher("topVideo", new StaticDataFetcher(someVideo)))
.type(newTypeWiring("Query")
.dataFetcher("allVideos", new StaticDataFetcher(someVideo)))
.build();
}
Кажется, ничего не работает. Любая помощь высоко ценится.
1 ответ
Вам нужно будет реализовать fetchEntities
а также resolveEntityType
для тебя Name
введите аналогично тому, как они реализованы здесь.