当前位置: 首页 > 知识库问答 >
问题:

java的GraphQL标量。时间LocalDate将日期解析为StringValue

孟增
2023-03-14

我尝试将日期解析为java,例如“2022-02-02”。时间LocalDate。

为什么传递给标量类的值被包装成大括号?我该怎么解决这个问题?

我为java配置了标量。时间本地日期:

@Component
public class DateScalar extends GraphQLScalarType {

public DateScalar() {
    super("Date", "java.time.LocalDate", new Coercing() {
        @Override
        public Object serialize(Object o) throws CoercingSerializeException {
            return DateTimeFormatter.ofPattern("yyyy-MM-dd").format((LocalDate) o);
        }

        @Override
        public Object parseValue(Object o) throws CoercingParseValueException {
            return LocalDate.parse(o.toString());
        }

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

以下是问题:

mutation {
createEvent(createEventRequest: {
    name: "test",
    description: "test description",
    userId: 1,
    participants: [{
        firstName: "first",
        lastName: "last"
    }],
  location: {
    street: "street",
    streetNumber: "streetNumber",
    country: "country"
  },
  duration: {
    entireDay: false,
    recurringDate: false,
    start: "2018-09-03"
  }
}) {
    id
    name
    description
    participantResponses {
        id
        firstName
        lastName
    }
    locationResponse {
        id
        street
        streetNumber
        country
    }
    durationResponse {
        id
        start
        end
        entireDay
        recurringDate
    }
    userResponse {
        id
        firstName
        lastName
        email
    }
}
}

错误说文本'StringValue{value='2018-09-03'}'无法在索引0处解析。我真的不明白为什么这仍然被包装到大括号中。

如果需要,这是graphqls文件:

type Query {
    user(id : Int) : UserResponse,
    userByEmail(email : String) : [UserResponse]
}

type Mutation {
    createUser(createUserRequest: CreateUserRequest) : UserResponse
    createEvent(createEventRequest: CreateEventRequest) : EventResponse
}

input CreateEventRequest {
    name: String,
    description: String,
    participants: [Participant],
    location: Location,
    duration: Duration,
    userId: Int
}

input Duration {
    start:Date,
    end:Date,
    entireDay:Boolean      ,
    recurringDate:Boolean
}

input Location {
    street:String ,
    streetNumber:String,
    country:String
}

input Participant {
    firstName: String,
    lastName: String
}

type UserResponse {
    id: Int,
    firstName: String,
    lastName: String,
    email: String
}

type EventResponse {
    id: Int,
    name: String,
    description: String,
    participantResponses: [ParticipantResponse],
    locationResponse: LocationResponse,
    durationResponse: DurationResponse,
    userResponse: UserResponse
}

type DurationResponse {
    id: Int
    start: Date
    end: Date
    entireDay: Boolean
    recurringDate: Boolean
}


type LocationResponse {
    id: Int,
    street: String ,
    streetNumber: String ,
    country: String
}

type ParticipantResponse {
    id: Int,
    firstName: String,
    lastName: String
}

input CreateUserRequest {
    firstName: String!,
    lastName: String!,
    email: String!
}

scalar Date

共有2个答案

柯锋
2023-03-14

GraphQL将日期字符串作为全文发送,正如您将其声明为日期一样。或者,您可以将start声明为String,并在javaend解析字符串todate。

input Duration {
start: String,
end: String,
entireDay:Boolean      ,
recurringDate:Boolean

}

高明辉
2023-03-14

parseLiteral方法参数实际上是解析GraphQL查询生成的抽象语法树的一个节点。方法实现应该从节点中提取文本值:

@Override
public LocalDate parseLiteral(Object o) throws CoercingParseLiteralException {
  if (o instanceof StringValue) {
    var value = ((StringValue) o).getValue();
    try {
      return LocalDate.parse(value);
    } catch (DateTimeParseException e) {
      throw new CoercingParseLiteralException("Cannot parse [" + value + "] to LocalDate", e);
    }
  } else {
    throw new CoercingParseLiteralException(
        "Expected literal of type StringValue but was " + o.getClass());
  }
}
 类似资料:
  • 这是我的用户类,我要在我的数据库中保存符合ISO的日期时间。 这是我的球衣控制器: 我如何使用像泽西岛这样的日期时间格式?是否可以发送一个datatime并自动创建Java8日期时间对象?

  • 我正在尝试转换java。util。日期至java。时间本地日期: 但是,当有例如22:25的一天时间时,我选择ZoneId,例如:。 即将推出的本地日期将有不同的日期(因为该区域增加了6小时),例如欧洲/明斯克: 我想在结果的LocalDate中保留与该实例相同的日期。一些方法如何解决这个问题?我想可能有几种方法。

  • 问题内容: 有人可以向我展示一段解析此日期的Java代码: 2009-08-05 进入此GMT日期: 2009/217:00:00 ==== 到目前为止,我有: 但它不起作用 问题答案: 这是您要寻找的格式:

  • 如何将字符串日期格式转换为日期,我有格式为以下格式的日期字符串: 接下来,我尝试了,但没有运气。 所有上述语句都存在解析错误。

  • 本文向大家介绍Java日期与时间类原理解析,包括了Java日期与时间类原理解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java日期与时间类原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 基础知识 日期: 类似于 2018-12-12 时间: 类似于 2018-12-12 12:12:12 时刻: 类似于 2018-12

  • 问题内容: 有谁知道如何将JS dateTime转换为MySQL datetime?还有一种方法可以向JS日期时间添加特定的分钟数,然后将其传递给MySQL日期时间? 问题答案: 尽管JS确实拥有足够的基本工具来执行此操作,但它相当笨拙。