Регистрация пользовательских скаляров в graphql- java - PullRequest
0 голосов
/ 21 апреля 2020

Я следовал документации здесь https://www.graphql-java.com/documentation/v14/scalars/, но обнаружил следующую ошибку: SchemaProblem {errors = [Тип поля 'Date' отсутствует при разрешении типа 'Book' [@ 5: 1]] }

schema.graphqls

type Query {
    bookById(id: ID!): Book
}

type Book {
    id: ID
    name: String
    date: Date
}

Использование graphql- java 14.0

    private static GraphQLScalarType DATE_SCALAR = GraphQLScalarType.newScalar().name("Date").coercing(new Coercing<LocalDate, LocalDate>() {
        @Override
        public LocalDate serialize(Object input) {
            return input == null ? null : LocalDate.parse(input.toString());
        }

        @Override
        public LocalDate parseValue(Object input) {
            return input == null ? null : LocalDate.parse(input.toString());
        }

        @Override
        public LocalDate parseLiteral(Object input) {
            if (input instanceof StringValue) {
                try {
                    return LocalDate.parse(((StringValue) input).getValue());
                } catch (DateTimeParseException e) {
                    throw new CoercingParseLiteralException(e);
                }
            }

            throw new CoercingParseLiteralException();
        }
    }).build();

    public static GraphQL graphQL() {
        SchemaParser schemaParser = new SchemaParser();

        TypeDefinitionRegistry typeRegistry;

        try (InputStream is = MainApplication.class.getClassLoader().getResourceAsStream("schema.graphqls");
                Reader reader = new InputStreamReader(is, "utf-8")) {
            typeRegistry = schemaParser.parse(reader);

        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }

        SchemaGenerator schemaGenerator = new SchemaGenerator();
        GraphQLSchema schema = schemaGenerator.makeExecutableSchema(typeRegistry, runtimeWiring());

        return GraphQL.newGraphQL(schema).build();
    }

    private static RuntimeWiring runtimeWiring() {
        Builder builder = RuntimeWiring.newRuntimeWiring();
        builder.scalar(DATE_SCALAR);

        builder.type("Query", typeWiring -> {
            typeWiring.dataFetcher("bookById", environment -> Map.of("name", "GraphQL"));
            return typeWiring;
        });
        return builder.build();
    }

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        GraphQL graphQL = graphQL();

        ExecutionInput.Builder executionInputBuilder = ExecutionInput.newExecutionInput().query("{ bookById(id: 1) { name } }");
        executionInputBuilder.dataLoaderRegistry(new DataLoaderRegistry());
        ExecutionInput executionInput = executionInputBuilder.build();

        Map<String, Object> result = CompletableFuture.completedFuture(executionInput).thenCompose(graphQL::executeAsync).thenApply(ExecutionResult::toSpecification).get();
        System.out.println(result);
    }

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Скалярная дата

Дата

пропущена в schema.graphqls.

После добавления этого пользовательский скаляр работает.

0 голосов
/ 21 апреля 2020

Вы можете попробовать плагины com.graphql- java -generator maven или gradle. Они генерируют POJO и служебные классы из схемы GraphQL, чтобы позволить вам выполнить запрос GraphQL из вашего java кода:

https://github.com/graphql-java-generator/graphql-maven-plugin-project

https://github.com/graphql-java-generator/graphql-gradle-plugin-project

С этим плагином гораздо проще создать сервер GraphQL в java. Это облегчает использование библиотеки graphql- java, генерируя весь шаблонный код.

Итак, с ее помощью легко создать сервер GraphQL.

Если вы не Я не хочу использовать плагин и хочу иметь образец правильного кода для регистрации собственного скаляра, извлечения проекта, его сборки и просмотра сгенерированного кода для примера сервера-сервера

Etienne

...