[您需要为fetchEntities
类型实现resolveEntityType
和Name
,类似于实现here的方式。
我对Apollo Federation和Gateway还是陌生的,并试图将apollo federation-jvm用于演示项目。我已经使用联邦jvm创建了两个联邦服务。这两个服务都通过Apollo网关相互连接。使用官方github页面上的this节点网关示例。
下面是这些服务的架构和解析器:
联合服务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类型架构中扩展Name类型时,请将以下内容添加到video.graphql模式中>]
字段编写解析器。type Name @key(fields: "nameId") @extends { nameId: String! @external getVideoByNameId: [Video] }
我不确定如何为getVideoByNameId
我已经尝试将方法getVideoByNameId(String nameId)]添加到VideoQuery.java(从getVideoByNameId方法返回硬编码的视频对象),但是图形始终返回null。
我还尝试使用下面的代码创建RuntimeWiring,然后在创建GraphQLSchema对象时将其传递,如其github page上的示例所示>
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(); }
似乎没有任何作用。非常感谢您的帮助。
我对Apollo Federation and Gateway还是陌生的,并试图将apollo federation-jvm用于演示项目。我已经使用联邦jvm创建了两个联邦服务。这些服务都是...
[您需要为fetchEntities
类型实现resolveEntityType
和Name
,类似于实现here的方式。
[您需要为fetchEntities
类型实现resolveEntityType
和Name
,类似于实现here的方式。