Доступ к защищенному полю родительского объекта через дочерний объект через схему запроса - PullRequest
0 голосов
/ 28 июня 2019

Я использую 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());

Я хочу получить значение responseCode из моего запроса запроса graphql

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

но выдает ошибку ниже, которая говорит мне, что он не видит переменную responseCode, потому что это не прямое свойство класса GetAllGroupResponse

Ошибка проверки типа FieldUndefined: поле 'responseCode' в типе 'GetAllGroupResponse' не определено @ 'getAllPagable / responseCode'

PS. BaseResponse из другого проекта пакета / библиотеки, который был импортирован в текущий проект

UPDATE

На основе поднятых проблем 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 вручную, и он успешно работает. Когда я вызываю конечную точку /graphql, возникает исключение

Объект должен быть не нулевым ", «trace»: «graphql.AssertException: объект должен быть не нулевым

1 Ответ

1 голос
/ 29 июня 2019

Я думаю, все, что вам нужно, это установить базовые пакеты для вашего проекта. Э.Г.

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 .

...