在Java中,graphql的使用方法
2023-04-18 16:29:18 时间
目录
三、在resources下创建graphql目录,并在graphql下创建三个.graphql文件(main.graphql , person.graphql , user.graphql)
4. UserInput类和PersonInput类中的代码
5. MutationTest类、PersonMutation类和UserMutation类中的代码
6. PersonQuery类、QueryTest类、UserQuery类中代码
五、使用浏览器打开 http://127.0.0.1:8080/playground 网站
一、创建一个SpringBoot项目,并导入下方依赖
<!--graphql-spring-boot-->
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>graphql-spring-boot-starter</artifactId>
<version>11.0.0</version>
</dependency>
<!--playground-->
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>playground-spring-boot-starter</artifactId>
<version>7.1.0</version>
<scope>runtime</scope>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
二、配置 application.properties文件
graphql.tools.schema-location-pattern=./graphql/*.graphql
#设置http://127.0.0.1:8080/playground网页的颜色,dark为黑色,light为白色
graphql.playground.settings.editor.theme=light
三、在resources下创建graphql目录,并在graphql下创建三个.graphql文件(main.graphql , person.graphql , user.graphql)
mani.graphql 中的内容
#scalar用于自定一个数据类型 scalar Date type Query { # ! 表示不能为空,[]表示为链表或数组 events1 : [Date!]! } type Mutation{ createEvents1(date:Date):Date } #可省略 schema { # query query: Query # mutation mutation: Mutation } #定义一个枚举类 # Sex 可为参数,也可为返回值 enum Sex{ MALE FEMALE }
person.graphql 中的内容
# extend 表示继承,继续对 mian.qraphql 中 Query 的编写 extend type Query{ personQuery1:Person personQuery2(id:String!):Person } # extend 表示继承,继续对 mian.qraphql 中 Mutation 的编写 extend type Mutation { createPerson(personInput:PersonInput):Person } # input 表示PersonInput只能作为为参数 # 且必须创建一个名字、参数都与这里定义相同的类 input PersonInput{ name:String sex:Sex text:String } # type 表示Person不能作为为参数,可为返回值 # 且必须创建一个名字、参数都与这里定义相同的类 type Person{ id:String name:String sex:Sex text:String user:User list:[String] }
user.graphql中的内容
# ! 表示不能为空 # extend 表示继承,继续对 mian.qraphql 中 Query 的编写 extend type Query{ userQuery1:User userQuery2(id:ID!): User } # extend 表示继承,继续对 mian.qraphql 中 Mutation 的编写 extend type Mutation{ createUser(UserInput:UserInput):User } # type 表示User不能作为为参数,可为返回值 # 且必须创建一个名字、参数都与这里定义相同的类 type User { id:String name:String sex:Sex text:String } # input 表示UserInput只能作为为参数 # 且必须创建一个名字、参数都与这里定义相同的类 input UserInput{ name:String sex:Sex text:String }
四、 创建类
1. 创建与下方图片相同的层级目录
个人习惯,可以不同
2. Person类、Sex类和User类中代码
@Getter public class Person { String id; String name; Sex sex; String text; @Setter User user; @Setter List<String> list; public Person(String id,String name,Sex sex,String text){ this.id=id; this.name=name; this.sex=sex; this.text=text; } }
public enum Sex { MALE("男"),FEMALE("女"); Sex( String sex){ this.sex=sex; } String sex; }
@Getter @AllArgsConstructor public class User { String id; String name; Sex sex; String text; }
3. PersonFieldResolver类中代码
/** * 该类用于给 Person类 的 user 和 list 添加数据 * @author y */ @Component public class PersonFieldResolver implements GraphQLResolver<Person> { /** * 该方法名要与Person类中User的变量名相同,且参数类型必须是Person */ public User user(Person person){ return new User("1","wjy", Sex.MALE,"yqy"); } /** * 该方法名要与Person类中List<String>的变量名相同,且参数类型必须是Person */ public List<String> list(Person person){ return Arrays.asList("e","f","g"); } }
4. UserInput类和PersonInput类中的代码
@Getter public class UserInput { String name; Sex sex; String text; }
@Getter public class PersonInput { String name; Sex sex; String text; }
5. MutationTest类、PersonMutation类和UserMutation类中的代码
@Component public class MutationTest implements GraphQLMutationResolver { /** * 方法名、传入参数类型、传入参数名、传出参数类型都需和 main.graphql文件中 type Mutation下的相同 * @param date 前端传入的数据 * @return 返回给前端的数据 */ public LocalDateTime createEvents1(LocalDateTime date){ return date; } }
@Component public class PersonMutation implements GraphQLMutationResolver { static public Map<String, Person> map=new ConcurrentHashMap<>(); /** * 方法名、传入参数类型、传入参数名、传出参数类型都需和 person.graphql文件中 extend type Mutation 下的相同 * @param personInput 前端传入的数据 * @return 返回给前端的数据 */ public Person createPerson(PersonInput personInput){ Person person=new Person(UUID.randomUUID().toString(),personInput.getName(),personInput.getSex(),personInput.getText()); map.put(person.getId(),person); System.out.println("Person map size:"+map.size()); return person; } }
@Component public class UserMutation implements GraphQLMutationResolver { static public Map<String, User> map=new ConcurrentHashMap<>(); /** * 方法名、传入参数类型、传入参数名、传出参数类型都需和 user.graphql文件中 extend type Mutation 下的相同 * @param userInput 前端传入的数据 * @return 返回给前端的数据 */ public User createUser(UserInput userInput){ User user =new User(UUID.randomUUID().toString(),userInput.getName(),userInput.getSex(),userInput.getText()); map.put(user.getId(), user); System.out.println("User map size:"+map.size()); return user; } }
6. PersonQuery类、QueryTest类、UserQuery类中代码
@Component public class PersonQuery implements GraphQLQueryResolver { /** * 方法名、传入参数类型、传入参数名、传出参数类型都需和 person.graphql文件中 extend type query 下的相同 * @return 返回给前端的数据 */ public Person personQuery1(){ Person person=new Person(UUID.randomUUID().toString(),"xxx", Sex.MALE,"xxx"); return person; } public Person personQuery2(String id){ return PersonMutation.map.get(id); } }
@Component public class QueryTest implements GraphQLQueryResolver { /** * 方法名、传入参数类型、传入参数名、传出参数类型都需和 main.graphql文件中 type query 下的相同 * @return 返回给前端的数据 */ public List<LocalDateTime> events1(){ List<LocalDateTime> list= Arrays.asList(LocalDateTime.now(),LocalDateTime.now()); return list; } }
@Component public class UserQuery implements GraphQLQueryResolver { /** * 方法名、传入参数类型、传入参数名、传出参数类型都需和 user.graphql文件中 extend type query 下的相同 * @return 返回给前端的数据 */ public User userQuery1(){ User user =new User("1","xxx", Sex.MALE,"xxx"); return user; } public User userQuery2(String id){ return UserMutation.map.get(id); } }
7.ScalarDate类中的代码
@Component public class ScalarDate extends GraphQLScalarType { public ScalarDate() { //第一个参数的值必须和 main.graphql 文件中 scalar 定义的相同,第二个可以随意起名 super("Date", "日期", new Coercing() { /** * 当后端向前端发送 Date 类型数据时调用的方法,将数据转换为 String 型 * o 可以强制转型为 LocalDateTime * 将 LocalDateTime 型的数据转换为 String 型再传给前端 * @param o * @return 返回给前端的数据 */ @Override public String serialize(Object o) throws CoercingSerializeException { System.out.println("serialize-->"+(LocalDateTime)o); return o.toString(); } @Override public LocalDateTime parseValue(Object o) throws CoercingParseValueException { StringValue string=(StringValue)o; System.out.println("parseLiteral-->"+string.getValue()); System.out.println("parseLiteral-->"+string.toString()); return LocalDateTime.parse(string.getValue()); } /** * 当前端向后端传输 Date 类型数据时调用的方法,将数据转换为 LocalDateTime 型 * 此时,o 不能强制转型为 LocalDateTime,只能转为 StringValue 型 * @param o 前端传入的数据 * @return 后端接受的数据 */ @Override public LocalDateTime parseLiteral(Object o) throws CoercingParseLiteralException { StringValue string=(StringValue)o; System.out.println("parseLiteral-->"+string.getValue()); System.out.println("parseLiteral-->"+string.toString()); return LocalDateTime.parse(string.getValue()); } }); } }
8.DemoApplication类中的代码
@SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Slf4j @Component @RequiredArgsConstructor private static class AppRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) { log.info("graphql playground: http://127.0.0.1:{}/playground", "8080"); } } }
五、使用浏览器打开 http://127.0.0.1:8080/playground 网站
在左边编写指令获取数据
自己记录的一些笔记,内容如有不对请指正
相关文章
- Jease 2.6发布 Java开源内容框架
- JVM调优总结:反思
- JVM调优总结:调优方法
- JVM调优总结:新一代的垃圾回收算法
- JVM调优总结:典型配置举例
- JVM调优总结:分代垃圾回收详述
- JVM调优总结:垃圾回收面临的问题
- JVM调优总结:基本垃圾回收算法
- JVM调优总结:一些概念
- 用Java GUI编写的画板程序
- Java的动态绑定机制
- jOOQ 2.0.2发布 Java的ORM框架
- Java中带复选框的树的实现和应用
- Java网络编程菜鸟进阶:TCP和套接字入门
- 甲骨文与谷歌专利权之争定于今年三月开审
- Java调用C/C++编写的第三方dll动态链接库
- 集成开发环境 NetBeans IDE 7.1正式版发布
- kangle 2.7.5紧急发布 防hash碰撞攻击
- 东方通技术引领模式为国产软件“争权”
- UML中关联,组合与聚合等关系的辨析