Проблема с разрешением для типа @extends в GraphQL Apollo Federation-JVM - PullRequest
0 голосов
/ 27 января 2020

Я новичок в 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();
    }

Ничего не кажется работать. Любая помощь высоко ценится.

1 Ответ

0 голосов
/ 27 января 2020

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

...