首页 > Java > java教程 > 正文

Spring Boot GraphQL 客户端:传递对象列表的完整指南

DDD
发布: 2025-10-31 16:25:27
原创
906人浏览过

spring boot graphql 客户端:传递对象列表的完整指南

本文档旨在指导开发者如何在 Spring Boot GraphQL 客户端中传递对象列表。我们将探讨如何构建 GraphQL 查询,并使用 `GraphQLTemplate` 发送包含对象列表的请求,从而实现高效的数据交互。

在构建微服务架构时,GraphQL 作为一种强大的 API 查询语言,被广泛应用于数据聚合和交互。当我们需要从 GraphQL 服务端获取或传递对象列表时,客户端的实现方式就显得尤为重要。本文将重点介绍如何在 Spring Boot 环境下,使用 GraphQLTemplate 构建 GraphQL 客户端,并传递对象列表作为请求参数。

GraphQL Schema 定义

首先,我们需要明确 GraphQL 服务端定义的 Schema。假设我们有一个 Person 类型,其定义如下:

type Person {
    firstName: String
    middleName: String
    lastName: String
    birthDt: String
}

type Query {
    getPersonsByIds(personIds: [BigInteger]): [Person]
}
登录后复制

在这个 Schema 中,getPersonsByIds 查询接受一个 BigInteger 类型的列表 personIds 作为参数,并返回一个 Person 类型的列表。

构建 GraphQL 客户端

接下来,我们将使用 GraphQLTemplate 构建客户端,并发送包含 personIds 列表的请求。

import com.github.americanexpress.nodes.graphql.GraphQLRequestEntity;
import com.github.americanexpress.nodes.graphql.GraphQLTemplate;
import org.springframework.stereotype.Service;

import java.math.BigInteger;
import java.net.MalformedURLException;
import java.util.Arrays;
import java.util.List;

@Service
public class PersonService {

    private final GraphQLTemplate graphQLTemplate = new GraphQLTemplate();
    private final String url = "http://localhost:8084/graphql";

    public List<Person> getPersonsByIds(List<BigInteger> personIds) {

        GraphQLRequestEntity requestEntity;
        try {
            requestEntity = GraphQLRequestEntity.Builder()
                .url(url)
                .requestMethod(GraphQLTemplate.GraphQLMethod.QUERY)
                .request("query($personIds: [BigInteger]) {\n" +
                    "  getPersonsByIds(personIds : $personIds ) {\n" +
                    "    firstName\n" +
                    "    middleName\n" +
                    "    lastName\n" +
                    "    birthDt\n" +
                    "  }\n" +
                    "}"
                )
                .variables(new Variable<>("personIds", personIds))
                .build();
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        }
        return graphQLTemplate.query(requestEntity, ResponseGetPersonsByIds.class).getResponse().getGetPersonsByIds();
    }

    // 内部类,用于封装变量
    private static class Variable<T> {
        private final String name;
        private final T value;

        public Variable(String name, T value) {
            this.name = name;
            this.value = value;
        }

        public String getName() {
            return name;
        }

        public T getValue() {
            return value;
        }
    }

    // 假设的 ResponseGetPersonsByIds 类,需要根据实际情况定义
    private static class ResponseGetPersonsByIds {
        private Response response;

        public Response getResponse() {
            return response;
        }

        public void setResponse(Response response) {
            this.response = response;
        }

        private static class Response {
            private List<Person> getPersonsByIds;

            public List<Person> getGetPersonsByIds() {
                return getPersonsByIds;
            }

            public void setGetPersonsByIds(List<Person> getPersonsByIds) {
                this.getPersonsByIds = getPersonsByIds;
            }
        }
    }

    // 假设的 Person 类,需要根据实际情况定义
    private static class Person {
        private String firstName;
        private String middleName;
        private String lastName;
        private String birthDt;

        // Getters and setters
        public String getFirstName() {
            return firstName;
        }

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        public String getMiddleName() {
            return middleName;
        }

        public void setMiddleName(String middleName) {
            this.middleName = middleName;
        }

        public String getLastName() {
            return lastName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

        public String getBirthDt() {
            return birthDt;
        }

        public void setBirthDt(String birthDt) {
            this.birthDt = birthDt;
        }
    }
}
登录后复制

代码解释:

  1. GraphQL 查询: 定义了 GraphQL 查询字符串,其中 $personIds 是一个变量,用于传递 BigInteger 类型的列表。

    知我AI·PC客户端
    知我AI·PC客户端

    离线运行 AI 大模型,构建你的私有个人知识库,对话式提取文件知识,保证个人文件数据安全

    知我AI·PC客户端0
    查看详情 知我AI·PC客户端
  2. GraphQLRequestEntity: 使用 GraphQLRequestEntity.Builder 构建请求实体,设置 URL、请求方法和查询字符串。

  3. Variables: 使用 variables 方法传递参数。关键在于将 personIds 列表作为 personIds 变量的值传递给 GraphQL 查询。 这里创建了一个内部类Variable,目的是为了能够更方便地传递变量的名称和值。

  4. graphQLTemplate.query(): 执行查询,并使用 ResponseGetPersonsByIds.class 将响应映射到 Java 对象。 ResponseGetPersonsByIds 需要根据实际的 GraphQL 响应结构进行定义。

  5. 调用示例:

    @Autowired
    private PersonService personService;
    
    public void testGetPersonsByIds() {
        List<BigInteger> ids = Arrays.asList(new BigInteger("2477142261427744786"), new BigInteger("2477142261427744787"));
        List<Person> persons = personService.getPersonsByIds(ids);
        System.out.println(persons);
    }
    登录后复制

注意事项:

  • 确保 ResponseGetPersonsByIds 类能够正确映射 GraphQL 响应。
  • 根据实际情况调整 URL 和查询字符串。
  • 处理可能出现的 MalformedURLException 异常。
  • com.github.americanexpress:nodes:0.5.0 库可能不是最新的,建议查看是否有更新的版本。

总结

通过本文,我们学习了如何在 Spring Boot GraphQL 客户端中使用 GraphQLTemplate 传递对象列表。关键在于正确构建 GraphQL 查询,并使用 variables 方法将列表作为参数传递给查询。这种方法可以有效地实现客户端与服务端之间的数据交互,提高开发效率。记住,需要根据实际的 GraphQL Schema 和响应结构调整代码,才能确保程序的正确运行。

以上就是Spring Boot GraphQL 客户端:传递对象列表的完整指南的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号