Доступ к защищенному полю родительского объекта через дочерний объект через схему запроса

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

Validation error of type FieldUndefined: Field 'responseCode' in type 'GetAllGroupResponse' is undefined @ 'getAllPagable/responseCode'

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

UPDATE

На основе поднятых 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;
        };
    }

и теперь я получаю сообщение об ошибке, которое говорит следующее

object type 'GetAllGroupResponse' does not implement interface 'BaseResponse' because field 'responseCode' is missing

Поэтому я решил добавить метод получения getResponseCode вручную, и он успешно работает. Когда я вызываю конечную точку /graphql, она выдает исключение

Object required to be not null", "trace": "graphql.AssertException: Object required to be not null

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
784
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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, такие как получить класс.

@alexdavies Ты делаешь много ненужных странных вещей, тебе ничего из этого не нужно. Просто попробуй то, что я тебе сказал. И вы не упомянули, что используете SPQR Spring Starter, это важная информация.

kaqqao 01.07.2019 12:15

Я сделал, как просили, и я получаю следующую ошибку object type 'GetAllGroupResponse' does not implement interface 'BaseResponse' because field 'hash' is missing object type 'GetAllGroupResponse' does not implement interface 'BaseResponse' because field 'responseCode' is missing object type 'GetAllGroupResponse' does not implement interface 'BaseResponse' because field 'responseDescription' is missing

DaviesTobi alex 01.07.2019 12:27

Я глубоко извиняюсь. Я использовал более старую версию вашей библиотеки версии 0.03, я перешел на версию 0.05, и теперь она работает.

DaviesTobi alex 02.07.2019 18:07

Другие вопросы по теме