Это ошибка , поскольку недопустимое имя никогда не должно генерироваться.Я исправлю это немедленно в следующем выпуске GraphQL SPQR (текущая версия на момент написания статьи 0.9.9).
Что касается того, как в итоге получится Map_String_String[]Scalar
, это скорее вовлекает ..Карты исключительно сложны, так как в GraphQL нет ничего похожего на карту.Варианты в основном состоят в том, чтобы рассматривать карту как список типизированных пар ключ-значение или просто как неизвестную динамическую структуру (так называемая JSON скаляр ).SPQR включает оба подхода, но по умолчанию обрабатывает карты как сложные (JSON) скаляры.Чтобы сохранить некоторое представление о том, что находится внутри, он сгенерирует скаляр с разными именами для каждого базового типа Java.При этом он должен генерировать уникальное имя для каждого.В вашем случае он находит Map<String, String[]>
, который генерирует недопустимое имя, которое вы видите - Map_String_String[]Scalar
.
Вы можете легко обойти эту проблему, зарегистрировав пользовательский TypeMapper
, который поймает этот случай, иливсе сложные скаляры в этом отношении, и дайте им одно и то же имя вместо уникального.
Например
public class CustomObjectScalarMapper extends ObjectScalarMapper {
private static final String OBJECT_SCALAR_NAME = "ObjectScalar";
@Override
protected String getTypeName(AnnotatedType type, BuildContext buildContext) {
return OBJECT_SCALAR_NAME;
}
@Override
protected String getInputTypeName(AnnotatedType type, BuildContext buildContext) {
return OBJECT_SCALAR_NAME;
}
}
И замените существующий ObjectScalarMapper
на:
generator.withTypeMappers((conf, current) -> current.replace(ObjectScalarMapper.class, new CustomObjectScalarMapper()))
При этом все сложные скаляры будут называться ObjectScalar
, и проблема не возникнет.
Если вы хотите быть более детализированным, переопределите также метод supports
.
Небольшое замечание, ваша конфигурация генератора без необходимости устанавливает кучу вещей на значения по умолчанию.
GraphQLSchema schema = new GraphQLSchemaGenerator()
.withBasePackages("entities")
.withResolverBuilders(new AnnotatedResolverBuilder())
.withOperationsFromSingleton(examService)
.withValueMapperFactory(new JacksonValueMapperFactory())
.generate();
эквивалентно
GraphQLSchema schema = new GraphQLSchemaGenerator()
.withBasePackages("entities")
.withOperationsFromSingleton(examService)
.generate();