java 在Spring中为GraphQL @SchemaMapping访问祖父母(源的源)

qij5mzcb  于 2023-05-05  发布在  Java
关注(0)|答案(1)|浏览(178)

我不知道如何加载引用的资源,该资源由一个深度嵌套的属性与嵌套数据结构中更高层的属性相结合来标识。
给定这些类(getter和setter等)。省略,但你得到的想法):

class Resource {
    int tenantId;
    List<SubResource> subResources;
}

class SubResource {
    String name;
    int userId;
}

class Tenant {
    int id;
    String name;
}

class User {
    int id;
    String name;
}

这个GraphQL schema:

type Resource {
    tenantName: String
    subResources: [SubResource]
}

type SubResource {
   userName
}

我可以使用如下方法解析ResourceController中的Resource.tenantName属性:

@SchemaMapping
public CompletableFuture<String> tenantName(Resource resource, DataLoader<Integer, Tenant> loader) {
    return loader.load(resource.getTenantId()).thenApply(User::getName);
}

但是SubResource.userName ...当我需要tenantId和userId来查找userName时,我该如何执行此操作?这是我到目前为止所做的:

@SchemaMapping
public CompletableFuture<String> userName(SubResource subResource, DataLoader<TenantAndUserId, User> loader) {
    // Look up tenant id - but how?
    int tenantId = ???;
    // TenantAndUserId just holds tenantId and userId properties
    var key = new TenantAndUserId(tenantId, subResource.getUserId()); 
    return loader.load(key).thenApply(User::getName);
}
3pmvbmvn

3pmvbmvn1#

我终于发现了如何使用localContext将tenantId传递给userName方法,所以以防其他人有同样的问题,我添加了以下内容:

@SchemaMapping
DataFetcherResult<List<SubResource>> subResources(Resource resource) {
      return DataFetcherResult.<List<SubResource>>newResult()
            .data(resource.getSubResources())
            .localContext(GraphQLContext.newContext()
                  .of("tenantId", resource.getTenantId())
                  .build())
            .build();
}

然后userName方法可以像这样注入tenantId:

@SchemaMapping
public CompletableFuture<String> userName(SubResource subResource, @LocalContextValue("tenantId") UUID tenantId, DataLoader<TenantAndUserId, User> loader) {
    // TenantAndUserId just holds tenantId and userId properties
    var key = new TenantAndUserId(tenantId, subResource.getUserId()); 
    return loader.load(key).thenApply(User::getName);
}

相关问题