GraphQL创建自定义标量ScalarType (基于Spring Boot)

目前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. 启动项目,看看自定义的序列化机制起作用了没:

搞定!

原文地址:https://www.cnblogs.com/cnsec/p/13407120.html