首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GraphQL中@extends的Resolver问题

GraphQL中@extends的Resolver问题
EN

Stack Overflow用户
提问于 2020-01-27 07:25:21
回答 1查看 1.6K关注 0票数 1

我是非常新的阿波罗联邦和网关,并试图使用阿波罗联邦-jvm的演示项目。我使用联合jvm创建了两个联邦服务。这两项服务通过阿波罗网关相互连接。使用官方github页面中的节点网关示例。

下面是这些服务的架构和解析器:

联邦服务1:

video.graphql

代码语言:javascript
复制
type Video @key(fields: "videoId") {
    videoId: String!
    description: String
    relatedNameId: String
}

type Query {
    topVideo: Video
    allVideos: [Video]
}

用于video.graphql的解析器

代码语言:javascript
复制
@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

代码语言:javascript
复制
type Name @key(fields: "nameId") {
    nameId: String!
    displayName: String
}

type Query {
    getByNameId(nameId: String): Name
    getAllNames: [Name]
}

用于name.graphql的解析器

代码语言:javascript
复制
@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;
    }

}

我能够通过网关topVideo调用两个服务类型查询中的所有API( allVideos、getByNameId、getAllNames),而不存在任何问题。

但是,当我在视频类型模式中扩展名称类型时,通过向video.graphql模式添加以下内容

代码语言:javascript
复制
type Name @key(fields: "nameId") @extends {
    nameId: String! @external
    getVideoByNameId: [Video]
}

我不知道如何为getVideoByNameId字段编写解析器。

我尝试过将方法 getVideoByNameId (String nameId)添加到VideoQuery.java (从getVideoByNameId方法返回硬编码视频对象),但图形总是返回null。

我还尝试使用下面的代码创建RuntimeWiring,然后在创建GraphQLSchema对象时传递它,如其github页面上的一个示例所示

代码语言:javascript
复制
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();
    }

似乎什么都起不到作用。任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-27 08:41:18

您需要为您的fetchEntities类型实现NameresolveEntityType,类似于它们实现这里的方式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59926668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档