我正在使用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:对象必须不为null

最佳答案

我认为您所需要的只是为您的项目设置基础软件包。例如。

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。

07-24 13:51