Пользовательский скаляр graphQL LocalDateTime

Я использую graphql-spring-boot-starter для создания GraphQL API. AFAIK не существует скаляра LocalDateTime по умолчанию, поэтому я хотел бы создать свой собственный. Я пытался сделать это так:

 @Bean
public GraphQLScalarType dateTimeType() {
    return new GraphQLScalarType("LocalDateTime", "DataTime scalar", new Coercing() {
        @Override
        public String serialize(Object input) {
            LocalDateTime date = (LocalDateTime) input;
            return   date.toString();
        }

        @Override
        public LocalDateTime parseValue(Object input) {
            return LocalDateTime.parse((String) input);
        }

        @Override
        public LocalDateTime parseLiteral(Object input) {
            return LocalDateTime.parse((String) input);
        }
    });

}

У меня исключение:

java.lang.IllegalArgumentException: невозможно создать экземпляр java.time.LocalDateTime (не существует создателей, таких как конструкция по умолчанию): невозможно десериализовать из значения объекта (нет создателя на основе делегатов или свойств)

Не могли бы вы рассказать мне, как я могу справиться с dateTime в моем проекте?


person A.Sidor    schedule 20.04.2020    source источник
comment
При чем здесь Elasticsearch?   -  person Joe Sorocin    schedule 20.04.2020


Ответы (2)


Я думаю, что после предоставления SchemaParserOptions настроенной конфигурации mapper он работает:

    @Bean
public SchemaParserOptions schemaParserOptions(){
   return SchemaParserOptions.newOptions().objectMapperConfigurer((mapper, context) -> {
        mapper.registerModule(new JavaTimeModule());
    }).build();
}

GraphQL использует свой собственный objectmapper, поэтому вы должны зарегистрировать на нем JavaTimeModule.

Подробнее об этом, например, здесь: github.com/graphql-java-kickstart/graphql-spring-boot/issues/32

Кредиты @ Флориану Шехнеру @ Доктору Осте

person roop kumar r    schedule 09.08.2020
comment
Вот моя ошибка аналогичного типа: stackoverflow.com/questions/67746066/ Как я могу это исправить? - person Tony Brand; 29.05.2021

вот что я сделал в своем проекте, чтобы передать дату и время

@Component
public class DateScalarType extends GraphQLScalarType {
public DateScalarType() {
    super("Date", "Date TIME", new Coercing() {
        @Override
        public Object serialize(Object o) throws CoercingSerializeException {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH);
            return formatter.format((Date)o);
        }

        @Override
        public Object parseValue(Object o) throws CoercingParseValueException {
            return o;
        }

        @Override
        public Object parseLiteral(Object o) throws CoercingParseLiteralException {
            if (o==null){
                return null;
            }
            return o.toString();
        }
    });
}}

в файле graphqls

scalar Date

type example {
creationDate:Date! }
person rnedit    schedule 22.09.2020
comment
Вот моя ошибка аналогичного типа: stackoverflow.com/questions/67746066/ Как я могу это исправить? - person Tony Brand; 29.05.2021