目前GraphQL还没有大规模在国内应用,所以文档较少,为方便大家解决问题,故整理了下在Spring Boot项目中创建GraphQL标量的步骤:
(现假设你已经有一个spring boot + graphql环境,并且可以正常跑起来了,如果没有,请看本人之前的关于graphql搭建的博客)
1. 比如你要新建一个DateTime的标量,新建一个DateTimeScalarType类,它需要继承GraphQLScalarType基类。请在构造函数中声明标量的名称,描述,以及序列化、转换值、validate相关的逻辑:
@Component
public class DateTimeScalarType extends GraphQLScalarType {
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm";
public DateTimeScalarType() {
super("DateTime", "DateTime value", new Coercing<Date, String>() {
@Override
public String serialize(Object o) {
Date date = (Date) o;
return DateUtil.format(date, DATE_FORMAT);
}
@Override
public Date parseValue(Object o) {
String value = String.valueOf(o);
if ("null".equalsIgnoreCase(value) || "".equalsIgnoreCase(value)) {
return null;
}
try {
return DateUtils.parseDate(value, DATE_FORMAT);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
@Override
public Date parseLiteral(Object o) {
String value = String.valueOf(o);
if ("null".equalsIgnoreCase(value) || "".equalsIgnoreCase(value)) {
return null;
}
try {
return DateUtils.parseDate(value, DATE_FORMAT);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
});
}
}
2. 到resource目录下面,找到schema.graphqls文件,或者其他的graphqls文件,一定不要忘了在graphqls文件里面也声明一下ScalarType,不然会报错的,比如下面这样,声明完之后就可以在定义类型的时候使用了:
scalar DateTime
3. 启动项目,看看自定义的序列化机制起作用了没:
搞定!