Я использую 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: объект должен быть не нулевым