Я новичок в Apollo Federation и Gateway и пытаюсь использовать apollo 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]
}
Резолверы для видео.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]
}
Резолверы для имени .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), но график всегда возвращает ноль.
Я также попытался создать 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();
}
Ничего не кажется работать. Любая помощь высоко ценится.