通过查询模式通过子对象访问父对象的受保护字段



我正在使用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查询请求

检索响应电极的值

{ getAllPagable(pageNumber : 1, numberOfRecords : 3) { responseCode groups { groupName } } }

但是它在下面丢下了一个错误,告诉我它看不到响应器变量,因为它不是类GetAllGroupResponse

的直接属性

类型fieldundefined的验证错误:field'wendysecode'inty'getallGrouPresponse'是未定义的 @'getallPagable/ponsewsecode'

ps。BaseResponse来自导入到当前项目

的其他软件包/库项目

更新

基于提出的GitHub问题和提供的解决方案。我在下面创建了一个bean

@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'不实现接口'基本响应',因为field'wendesecode'缺少

因此,我决定手动添加getResponseCode Getter方法,并成功运行。当我调用/graphql端点时,它会引发异常

对象不为null", " 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

最新更新