我正在使用graphql-spqr,因此不必创建schema.graphql
文件。
我有一个基类,我的大多数其他类都从该基类继承。例如
@GraphQLInterface(name = "BaseResponse", implementationAutoDiscovery = true)
@ToString
@Data
public class BaseResponse {
@JsonInclude(Include.NON_NULL)
protected String responseCode;
@JsonInclude(Include.NON_NULL)
protected String responseDescription;
protected String hash;
}
其他类继承自上述基类,如下所示:
@ToString(callSuper = true)
@Data
@AllArgsConstructor
public class GetAllGroupResponse extends BaseResponse {
private List<Group> groups;
}
当我像下面那样设置GetAllGroupResponse
的父值时
getAllGroupResponse.setResponseCode(ResponseCodeEnum.SH_97.getRespCode());
getAllGroupResponse.setResponseDescription(ResponseCodeEnum.SH_97.getRespDescription());
我希望从我的graphql查询请求中检索responseCode的值
{
getAllPagable(pageNumber : 1, numberOfRecords : 3) { responseCode groups { groupName } }
}
但是它下面抛出一个错误,告诉我它看不到responseCode变量,因为它不是类GetAllGroupResponse
的直接属性
FieldUndefined类型的验证错误:类型'GetAllGroupResponse'中的字段'responseCode'未定义@'getAllPagable / responseCode'
PS。 BaseResponse
来自导入到当前项目中的其他程序包/库项目
更新
基于GitHub提出的问题和提供的解决方案。我创建了一个如下的豆子
@Bean
public ExtensionProvider<GeneratorConfiguration, ResolverBuilder> resolverBuilderExtensionProvider() {
String[] packages = {"com.sheeft.microservices.library", "com.sheeft.mircoservice.groups"};
return (config, current) -> {
List<ResolverBuilder> resolverBuilders = new ArrayList<>();
//add a custom subtype of PublicResolverBuilder that only exposes a method if it's called "greeting"
resolverBuilders.add(new PublicResolverBuilder() {
@Override
public PublicResolverBuilder withBasePackages(String... basePackages) {
return super.withBasePackages(packages); //To change body of generated methods, choose Tools | Templates.
}
});
//add the default builder
resolverBuilders.add(new AnnotatedResolverBuilder().withBasePackages(packages));
return resolverBuilders;
};
}
现在我得到一个错误,指出以下内容
对象类型“ GetAllGroupResponse”没有实现接口“ BaseResponse”,因为缺少字段“ responseCode”
因此,我决定手动添加getResponseCode
getter方法,该方法成功运行。当我呼叫/graphql
端点时,它将引发异常
对象必须不为空”, “ trace”:“ graphql.AssertException:对象必须不为空
答案 0 :(得分:1)
我认为您所需要的只是为您的项目设置基础软件包。例如
generator.withBasePackages("your.root.package", "library.root.package")
或者,如果您使用的是SPQR Spring Starter,请添加
graphql.spqr.base-packages=your.root.package,library.root.package
到您的application.properties
文件中,以达到相同的效果。
当您具有跨多个软件包(甚至是库,例如您的情况)的类的层次结构时,需要此,以便让SPQR知道应公开哪些软件包,因为否则可能会意外地暴露一些框架代码甚至核心Java内容像 getClass 。