И определите MyScalarStrategy:

анируем использовать Graphql в качестве внутреннего сервера в нашем приложении. Мы выбираем Graphql-Java для разработки нашего POC. Мы столкнулись с ситуацией, когда создавали собственный скалярный тип для обработки типа объекта java.util.Map.

мы не нашли никакой документации относительно создания пользовательского скалярного типа. В примере кода, как показано ниже

RuntimeWiring buildRuntimeWiring() {
    return RuntimeWiring.newRuntimeWiring()
            .scalar(CustomScalar)

как была реализована реализация объекта CustomScalar. нужна помощь.

Ответы на вопрос(2)

В первом подходе кода (SPQR v0.9.6) добавление@GraphQLScalar достаточно. Или, в качестве альтернативы, добавьте скалярное определение в GraphQLSchemaGenerator:

new GraphQLSchemaGenerator()
.withScalarMappingStrategy(new MyScalarStrategy())

И определите MyScalarStrategy:

class MyScalarStrategy extends DefaultScalarStrategy {

@Override
public boolean supports(AnnotatedType type) {
  return super.supports(type) || GenericTypeReflector.isSuperType(MyScalarStrategy.class, type.getType());
}
}
Решение Вопроса

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

Для динамического скалярного объекта, посмотрите наобъектная скалярная реализация graphql-spqr и сделать что-то подобное:

public static GraphQLScalarType graphQLObjectScalar(String name) {
        return new GraphQLScalarType(name, "Built-in object scalar", new Coercing() {

            @Override
            public Object serialize(Object input) {
                return input;
            }

            @Override
            public Object parseValue(Object input) {
                return input;
            }

            @Override
            public Object parseLiteral(Object input) {
                return parseFieldValue((Value) input);
            }

            //recursively parse the input into a Map
            private Object parseFieldValue(Value value) {
                if (value instanceof StringValue) {
                    return ((StringValue) value).getValue();
                }
                if (value instanceof IntValue) {
                    return ((IntValue) value).getValue();
                }
                if (value instanceof FloatValue) {
                    return ((FloatValue) value).getValue();
                }
                if (value instanceof BooleanValue) {
                    return ((BooleanValue) value).isValue();
                }
                if (value instanceof EnumValue) {
                    return ((EnumValue) value).getName();
                }
                if (value instanceof NullValue) {
                    return null;
                }
                if (value instanceof ArrayValue) {
                    return ((ArrayValue) value).getValues().stream()
                            .map(this::parseFieldValue)
                            .collect(Collectors.toList());
                }
                if (value instanceof ObjectValue) {
                    return ((ObjectValue) value).getObjectFields().stream()
                            .collect(Collectors.toMap(ObjectField::getName, field -> parseFieldValue(field.getValue())));
                }
                //Should never happen, as it would mean the variable was not replaced by the parser
                throw new IllegalArgumentException("Unsupported scalar value type: " + value.getClass().getName());
            }
        });
    }
 kaqqao07 дек. 2017 г., 13:51
@ Simple-Solution Если вы используете схему сначала непосредственно с graphql-java, вы можете использовать собственный скаляр черезRuntimeWiring.newRuntimeWiring().scalar(Scalars.graphQLObjectScalar("typeN‌​ame")), Имейте в виду, во 2-м и 3-м примереScalars являетсяio.leangen.graphql.util.Scalars неgraphql.Scalars, Или просто скопируйте код SPQR в свой собственный класс.
 kaqqao07 дек. 2017 г., 13:45
@ Simple-Solution Бывает автоматически? Значит ли это, что вы используете GraphQL-SPQR? Если это так, аннотируйте тип в месте использования с помощью@GraphQLScalar (например, аннотировал аргумент метода) или используйте другойScalarMappingStrategy (например.gen.withScalarMappingStrategy(new MapScalarStrategy())). Без SPQR нет автоматического сопоставления. Вы устанавливаете тип каждого поля, напримерnewFieldDefinition().type(Scalars.GraphQLString)так что вы можете использоватьnewFieldDefinition().type(Scalars.graphQLObjectScalar("typeName")) вместо. Вы получитеMap как и для любого объекта ввода, но с динамической структурой.
 Simple-Solution07 дек. 2017 г., 12:40
Не уверен, что я понимаю, что вы имеете в виду. Но те; Строка и целое число встроены, и все это происходит автоматически. Так что выше скаляр для объекта, и мне нужно создать один для карты, верно? Есть ли у вас пример. Также, что является значительным изname аргумент? Это имя типа, который мы определили в схеме?
 kaqqao07 дек. 2017 г., 11:14
@ Simple-Solution Как вы используете любой встроенный скаляр, например, String или Integer? Там нет разницы.
 Simple-Solution07 дек. 2017 г., 10:37
как использовать выше скалер в моем коде? У меня есть приложение Spring-boot, и вам поможет пример.

Ваш ответ на вопрос