Пользовательский скалярный тип GraphQL Java для карты не принимается схемой - PullRequest
0 голосов
/ 14 мая 2018

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

Я следовал инструкции ( здесь : http://graphql -java.readthedocs.io/en/latest/scalars.html) для создания скалярного типа.

Это мой MapScalar.java

public class MapScalar {
  private static final Logger LOG = LoggerFactory.getLogger(MapScalar.class);

  public static final GraphQLScalarType MAP = new GraphQLScalarType("Map", "A custom map scalar type", new Coercing() {
    @Override
    public Object serialize(Object dataFetcherResult) throws CoercingSerializeException {
      Map map = null;
      try {
        map = Map.class.cast(dataFetcherResult);
      } catch (ClassCastException exception) {
        throw new CoercingSerializeException("Could not convert " + dataFetcherResult + " into a Map", exception);
      }
      return map;
    }

    @Override
    public Object parseValue(Object input) throws CoercingParseValueException {
      LOG.warn("parseValue called");
      return null;
    }

    @Override
    public Object parseLiteral(Object input) throws CoercingParseLiteralException {
      LOG.warn("parseLiteral called");
      return null;
    }
  });
}

Я добавил этот скалярный экземпляр вRunTimeWiring

final RuntimeWiring runtimeWiring = newRuntimeWiring()
        .type(queryTypeFactory.getQueryBaseQueryType()) // just convenience methods I made
        .type(queryTypeFactory.getPageQueryType(viewName)) // ...
        .type(queryTypeFactory.getContentQueryType(viewName)) // ...
        .type(queryTypeFactory.getPictureQueryType()) // ...
        .type(queryTypeFactory.getSettingQueryType()) // just convenience methods I made
        .scalar(MapScalar.MAP) // added new scalar here
        .build();

Я определил это MapDataFetcher

@Component
public class MapDataFetcher implements DataFetcher {

  @Override
  public Object get(DataFetchingEnvironment environment) {
    String fieldName = environment.getField().getName();
    Content source = Content.class.cast(environment.getSource());
    return source.getStruct(fieldName).toNestedMaps(); // returns a Map<String,Object>
  }

}

И схема для этого поля / скаляра определяется следующим образом:

type Content {
    //... other fields
    settings: Map
}

Когдаотладка RunTimeWiring кажется нормальной.Скаляр был добавлен к скалярам по умолчанию:

enter image description here

Тем не менее возникает эта ошибка :

SCHWERWIEGEND: Servlet.service() for servlet [cae] in context with path [/blueprint] threw exception [Request processing failed; nested exception is SchemaProblem{errors=[The field type 'Map' is not present when resolving type 'Content' [@10:1], The field type 'Map' is not present when resolving type 'Setting' [@28:1]]}] with root cause
SchemaProblem{errors=[The field type 'Map' is not present when resolving type 'Content' [@10:1], The field type 'Map' is not present when resolving type 'Setting' [@28:1]]}

Я не могу найти никаких указаний в уроках, чтобы выяснить, что мне не хватает, чтобы заставить его работать.Я понимаю, что здесь есть пропущенный тип.Но создание нового Типа с newRunTimeWiring().type() предназначено для создания Нескалярных типов, не так ли?Или мне все еще нужно создать тип Map там?

1 Ответ

0 голосов
/ 14 мая 2018

Была только одна маленькая вещь, которую никто не упомянул в уроках.Мне пришлось добавить это, чтобы Map фактически распознавался как тип scala

добавить в файл определения схемы:

scalar Map
...