springboot集成graphql(一)

背景:基于上篇springboot集成jooq继续

GraphQL Playgroundhttps://github.com/prisma-labs/graphql-playground/releases

一、pom.xml文件引入相关依赖

<dependency>
    <groupId>com.graphql-java-kickstart</groupId>
    <artifactId>graphql-spring-boot-starter</artifactId>
    <version>5.10.0</version>
</dependency>
<dependency>
    <groupId>com.graphql-java</groupId>
    <artifactId>graphql-java</artifactId>
    <version>2019-10-31T04-37-48-0919e71</version>
</dependency>
<!-- 图形化界面graphiql-spring-boot-starter -->
<dependency>
    <groupId>com.graphql-java-kickstart</groupId>
    <artifactId>graphiql-spring-boot-starter</artifactId>
    <version>5.10.0</version>
</dependency>
<dependency>
    <groupId>com.graphql-java</groupId>
    <artifactId>graphql-java-spring-boot-starter-webmvc</artifactId>
    <version>2019-06-24T11-47-27-31ab4f9</version>
</dependency>

二、配置文件修改

1. application.yml增加服务配置

server:
  port: 8088
  #指定项目服务路径
  servlet:
    context-path: /api/v1

2. 在资源文件夹src/main/resources目录下添加文件company.graphqls

schema {
    query: CompanyQuery
}
type CompanyQuery {
    companyById(id: ID): Company
}
type Company {
    id: ID
    name: String
    age: Int
    address: String
    salary: Float
    joinDate: String
}

三配置GraphQLProvider,注册GraphQL

package com.zsx.graphql;

import com.google.common.base.Charsets;
import com.google.common.io.Resources;
import graphql.GraphQL;
import graphql.schema.GraphQLSchema;
import graphql.schema.idl.RuntimeWiring;
import graphql.schema.idl.SchemaGenerator;
import graphql.schema.idl.SchemaParser;
import graphql.schema.idl.TypeDefinitionRegistry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.IOException;
import java.net.URL;

import static graphql.schema.idl.TypeRuntimeWiring.newTypeWiring;

@Component
public class CompanyGraphQLProvider {

    private GraphQL graphQL;

    @Autowired
    private CompanyGraphQLDataFetchers graphQLDataFetchers;

    @Bean
    public GraphQL graphQL() {
        return graphQL;
    }

    @PostConstruct
    public void init() throws IOException {
        URL url = Resources.getResource("company.graphqls");
        String sdl = Resources.toString(url, Charsets.UTF_8);
        GraphQLSchema graphQLSchema = buildSchema(sdl);
        this.graphQL = GraphQL.newGraphQL(graphQLSchema).build();
    }

    private GraphQLSchema buildSchema(String sdl) {
        // TODO: we will create the schema here later
        TypeDefinitionRegistry typeRegistry = new SchemaParser().parse(sdl);
        RuntimeWiring runtimeWiring = buildWiring();
        SchemaGenerator schemaGenerator = new SchemaGenerator();
        return schemaGenerator.makeExecutableSchema(typeRegistry, runtimeWiring);
    }


    private RuntimeWiring buildWiring() {
        return RuntimeWiring.newRuntimeWiring()
                .type(newTypeWiring("CompanyQuery")
                        .dataFetcher("companyById", graphQLDataFetchers.getCompanyByIdDataFetcher()))
                .build();
    }

}

 

四、配置GraphQLDataFetchers

package com.zsx.graphql;

import com.zsx.entity.Company;
import com.zsx.service.CompanyService;
import graphql.schema.DataFetcher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class CompanyGraphQLDataFetchers {

    @Autowired
    private CompanyService companyService;

    public DataFetcher getCompanyByIdDataFetcher() {
        List<Company> companies = companyService.getCompanies();
        return dataFetchingEnvironment -> {
            Long companyId  = Long.valueOf(dataFetchingEnvironment.getArgument("id"));
            return companies
                    .stream()
                    .filter(company -> company.getId().equals(companyId))
                    .findFirst()
                    .orElse(null);
        };
    }

}

五、编写业务接口

pac
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值