Seguí la documentación aquí https://www.graphql-java.com/documentation/ v14 / escalares / pero encontró el siguiente error: SchemaProblem {errors = [El tipo de campo 'Fecha' no está presente al resolver el tipo 'Libro' [@ 5: 1]]}

Schema.graphqls

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

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

Usando 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);
    }
0
maximilianus 21 abr. 2020 a las 12:12

2 respuestas

La mejor respuesta

Puede probar los complementos com.graphql-java-generator maven o gradle. Generan los POJO y las clases de utilidad del esquema GraphQL, para permitirle ejecutar la solicitud GraphQL desde su código java:

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

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

Con este complemento es mucho más fácil crear un servidor graphql en java. Facilita el uso de la biblioteca graphql-java, al generar todo el código repetitivo.

Entonces, con él, es fácil crear un servidor GraphQL.

Si no desea utilizar el complemento y desea obtener una muestra del código adecuado para registrar un escalar personalizado, verifique el proyecto, compílelo y mire el código generado para la muestra del foro-servidor

Etienne

0
etienne-sf 21 abr. 2020 a las 14:58

El

Fecha escalar

Perdido en el schema.graphqls.

Después de agregar eso, el escalar personalizado funciona.

0
maximilianus 24 abr. 2020 a las 07:16