GraphQL在Springboot+mybatis中的结合

16 篇文章 0 订阅
6 篇文章 0 订阅

1.      使用步骤

1)        首先创建当前这个controller的查询器我创建了queue的查询器QueueQuery.java

2)        在查询器中注入service,这个查询器就是分解了请求过来的方法名

3)        在controller的某一个方法中调用,与别的url地址方法不冲突。可以指定某一个url使用这个graphql查询语句,我的controller是QueueGraphQLController

2.      注解的使用@GraphQLQuery(name="name"),@GraphQLMutation(name= "createQueue")

a)        在类中get方法上使用时,代表查询时候的别名,可以不爆露我们的字段。默认使用javabean的

b)        在查询器的方法名上使用,代表查询的方法也是别名

3.      注解@GraphQLArgument(name = "name") String name

a)        在查询语句中使用时候,代表闯入参数的名称对应后台的名称,不可省略

以上步骤请结合java的后台进行验证



1.maven依赖


<dependency>
		    <groupId>com.graphql-java</groupId>
		    <artifactId>graphql-java</artifactId>
		    <version>7.0</version>
		</dependency>
		<dependency>
		    <groupId>io.leangen.graphql</groupId>
		    <artifactId>spqr</artifactId>
		    <version>0.9.6</version>
</dependency>
我的controller
package com.ewe.workorder.controller;

/**
 * 用户的核心业务层
 */

import com.ewe.workorder.graphquery.EchartQuery;
import com.ewe.workorder.graphquery.WorkorderQuery;

import graphql.*;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.ewe.core.exception.CustomException;
import com.ewe.workorder.graphquery.QueueQuery;
import com.ewe.workorder.graphquery.utils.MyGraphqlError;
import com.ewe.workorder.graphquery.utils.MyGraphqlErrorData;

import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import graphql.language.SourceLocation;
import graphql.schema.GraphQLSchema;
import io.leangen.graphql.GraphQLSchemaGenerator;
import io.leangen.graphql.metadata.strategy.query.AnnotatedResolverBuilder;
import io.leangen.graphql.metadata.strategy.query.PublicResolverBuilder;
import io.leangen.graphql.metadata.strategy.value.jackson.JacksonValueMapperFactory;

@RestController
public class GraphQLController  {
	private final GraphQL graphQlFromAnnotated;
	private static final Logger LOGGER = LoggerFactory.getLogger(GraphQLController.class);

	@Autowired
	/**
	 * 这是注册器
	 * @param orderQuery
	 */
    public GraphQLController(QueueQuery orderQuery,WorkorderQuery workorderQuery,EchartQuery echartQuery) {
		 //Schema generated from query classes
        GraphQLSchema schemaFromAnnotated = new GraphQLSchemaGenerator()
                .withResolverBuilders(
                        //Resolve by annotations
                        new AnnotatedResolverBuilder(),
                        //Resolve public methods inside root package
                        new PublicResolverBuilder("com.ewe.workorder"))
                .withOperationsFromSingleton(orderQuery)
                .withOperationsFromSingleton(workorderQuery)
                .withOperationsFromSingleton(echartQuery)
                .withValueMapperFactory(new JacksonValueMapperFactory())
                .generate();
        graphQlFromAnnotated = GraphQL.newGraphQL(schemaFromAnnotated).build();
        LOGGER.info("Generated GraphQL schema using SPQR");
        }

	 	@SuppressWarnings("deprecation")
		@PostMapping(value = "/graphql", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
	    @ResponseBody
	    public Object indexFromAnnotated(@RequestBody Map<String, Object> request) {
	 		LOGGER.info("graphql进入");
			String query=(String) request.get("query");
			if(query!=null){
				
			}
			else if(query==null){
				 query=(String) request.get("mutation");
			}
			
			if(query==null){
				throw new CustomException("The option name can't be null", HttpStatus.INTERNAL_SERVER_ERROR);
			}
			query=query.replaceAll("\'", "\"");
			LOGGER.info(query);
			
			String operationName=(String) request.get("operationName");
			LOGGER.info(operationName);
			long start=(new Date()).getTime();
			ExecutionInput executionInput=new ExecutionInput(query, operationName,null,null, (Map<String,Object>)request.get("variables"));
	        ExecutionResult executionResult = graphQlFromAnnotated.execute(executionInput);
			/**
			 * 使用自己定义的错误返回
			 */
	        if (!executionResult.getErrors().isEmpty()) {
	        	//自定义的error
	         	MyGraphqlErrorData data=new MyGraphqlErrorData();
	         	MyGraphqlError error=new MyGraphqlError();
	         	
	        	error.setErrors(sanitize(executionResult).getErrors());
	        	data.setData(error);
	        	LOGGER.info(data.toString()+"");
	        	return data;
	        }

        long end=(new Date()).getTime();
		LOGGER.info("查询耗时==>"+(end-start+"ms"));
        return executionResult;
	}
 	 /**
 	  * 返回我们想要的message中的信息
 	  * @param executionResult
 	  * @return
 	  */
    private ExecutionResult sanitize(ExecutionResult executionResult) {
        return new ExecutionResultImpl(executionResult.getErrors().stream()
                .peek(err -> LOGGER.error(err.getMessage()))
                .map(this::sanitize)
                .collect(Collectors.toList()));
    }
    /**
     * 对错误进行处理
     * @param error
     * @return
     */
    private GraphQLError sanitize(GraphQLError error) {
        if (error instanceof ExceptionWhileDataFetching) {
            return new GraphQLError() {
                @Override
                public String getMessage() {
                    Throwable cause = ((ExceptionWhileDataFetching) error).getException().getCause();
                    return cause instanceof InvocationTargetException ? ((InvocationTargetException) cause).getTargetException().getMessage() : cause.getMessage();
                }

                @Override
                public List<SourceLocation> getLocations() {
                    return error.getLocations();
                }

                @Override
                public ErrorType getErrorType() {
                    return error.getErrorType();
                }
            };
        }
        return error;
    } 	
}


2.增加一个查询器

package com.ewe.workorder.GraphQLQuery;

import io.leangen.graphql.annotations.GraphQLArgument;
import io.leangen.graphql.annotations.GraphQLMutation;
import io.leangen.graphql.annotations.GraphQLQuery;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.ewe.workorder.controller.QueueGraphQLController;
import com.ewe.workorder.model.Queue;
import com.ewe.workorder.model.Users;
import com.ewe.workorder.service.IQueueService;
@Component
public class QueueQuery{
	private static final Logger LOGGER = LoggerFactory.getLogger(QueueGraphQLController.class);

	@Autowired
    private IQueueService queueService;

    /**
     * 方法名@GraphQLQuery 去别名的意思
     * @return
     */
	@GraphQLQuery(name = "queues")
    public List<Queue> queues() {
        return queueService.getList();
    }
	/*
	 * 根据queueid查询数据
	 */
	@GraphQLQuery(name = "queuesById")
    public Queue queuesById(@GraphQLArgument(name = "id") Integer queueId) {
		Queue queue=queueService.selectByqueueId(queueId);
		if(queue!=null&&queue.getUsers().size()>0){
			LOGGER.info("size=>>{}",queue.getUsers().size());
			//根据用户名查询信息查询信息
			List<Users> users=new ArrayList<Users>();
			for(Users user :queue.getUsers()){
				users.add(queueService.selectByUserName(user.getUsername()));
			}
			queue.setUsers(users);
		}
		
		
        return queue;
    }
	/**
	 * 根据用户名查询
	 * @param userName
	 * @return
	 */
	@GraphQLQuery(name = "userQueue")
    public Users queuesByuserName(@GraphQLArgument(name = "name")String userName) {
		Users user=queueService.selectByUserName(userName);
		if(user!=null&&user.getQueues().size()>=0)
		{
			LOGGER.info("queues size=>>{}",user.getQueues().size());
			LOGGER.info("person size=>>{}",user.getQueues().get(0).getUsers().size());
			//根据id查询信息
			List<Queue> queues=new ArrayList<Queue>();
			for(Queue queue :user.getQueues()){
				queues.add(queueService.selectByqueueId(queue.getId()));
			}
			user.setQueues(queues);
		}
		
        return user;
    }
	/**
	 * 添加数据
	 * @param queue
	 * @return
	 */
	@GraphQLMutation(name = "createQueue")
    public Queue createQueue(@GraphQLArgument(name = "name") String name,@GraphQLArgument(name = "description")String description){
		Queue queue=new Queue();
		queue.setName(name);
		queue.setDescription(description);
		LOGGER.info(queue.getName());
        return queueService.addqueue(queue);
    } 
/*	@GraphQLMutation(name = "createQueue")
    public Queue createQueue(@GraphQLArgument(name = "Queue")Queue queue){
    	LOGGER.info(queue.getName());
    	return queueService.addqueue(queue);
    } */
/*	@GraphQLQuery(name = "test")
    public List<Queue> test(@GraphQLArgument(name = "Queue") Queue queue) {
		LOGGER.info(queue.getName());
        return queueService.getList();
    }*/
}

我的Queuemodel

package com.ewe.workorder.model;

import java.util.List;

import com.ewe.workorder.model.Users;

import io.leangen.graphql.annotations.GraphQLQuery;

public class Queue {
    private Integer id;

    
    private String name;

    private String description;

    List<Users> users;
    
    public List<Users> getUsers() {
		return users;
	}

	public void setUsers(List<Users> users) {
		this.users = users;
	}
	 @GraphQLQuery(name="id")
	public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
    @GraphQLQuery(name="name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description == null ? null : description.trim();
    }
}

最后进行测试语句输入:

{
	"query":"{userQueue(name:'admin'){username,email,queues{name,users{username}}}}"
		
}

结果
{
    "userQueue": {
        "username": "admin",
        "email": "t3wq",
        "queues": [
            {
                "name": "test1",
                "users": [
                    {
                        "username": "124"
                    },
                    {
                        "username": "123"
                    }
                ]
            },
            {
                "name": "213",
                "users": [
                    {
                        "username": "123"
                    }
                ]
            },
            {
                "name": "",
                "users": [
                    {
                        "username": ""
                    }
                ]
            }
        ]
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值