Я использую 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
Я думаю, все, что вам нужно, это установить базовые пакеты для вашего проекта. Например.
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, такие как получить класс.
Я сделал, как просили, и я получаю следующую ошибку 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
Я глубоко извиняюсь. Я использовал более старую версию вашей библиотеки версии 0.03, я перешел на версию 0.05, и теперь она работает.
@alexdavies Ты делаешь много ненужных странных вещей, тебе ничего из этого не нужно. Просто попробуй то, что я тебе сказал. И вы не упомянули, что используете SPQR Spring Starter, это важная информация.