0

0

GraphQL Spring Boot Client:处理对象列表的查询

DDD

DDD

发布时间:2025-10-31 16:19:01

|

608人浏览过

|

来源于php中文网

原创

graphql spring boot client:处理对象列表的查询

本文档旨在指导开发者如何在 Spring Boot GraphQL 客户端中传递对象列表进行查询。我们将探讨如何构建 GraphQL 查询,并使用 `GraphQLTemplate` 发送包含对象列表的请求。通过本文,你将学会如何有效地与 GraphQL 服务交互,并获取所需的数据。

在使用 Spring Boot 构建 GraphQL 客户端时,一个常见的需求是向 GraphQL 服务传递一个对象列表作为查询参数。这在需要根据多个 ID 或其他属性检索数据时非常有用。以下是如何使用 GraphQLTemplate 实现此功能的详细步骤。

1. 定义 GraphQL Schema (服务端)

首先,确保你的 GraphQL 服务端定义了正确的 schema,允许接收对象列表作为参数。例如,如果你的服务端有一个 Person 类型,并且你想通过 ID 列表查询多个 Person 对象,你的 schema 可能如下所示:

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

type Query {
  getPersonsByIds(personIds: [ID!]): [Person]
}

这里的 getPersonsByIds 查询接受一个 personIds 参数,它是一个 ID 类型的非空列表,并返回一个 Person 对象的列表。

2. 构建 GraphQL 查询 (客户端)

在 Spring Boot 客户端,你需要构建一个 GraphQL 查询,其中包含一个变量,该变量将绑定到你的对象列表。例如:

query GetPersonsByIds($personIds: [BigInteger]) {
  getPersonsByIds(personIds: $personIds) {
    firstName
    middleName
    lastName
    birthDt
  }
}

注意 $personIds: [BigInteger] 部分,它定义了一个名为 personIds 的变量,该变量的类型是 BigInteger 的列表。 确保服务端声明的ID类型与客户端保持一致,例如服务端ID是String,客户端也需要声明为String。

3. 使用 GraphQLTemplate 发送请求

PDFlux
PDFlux

PDF内容提取+智能问答神器,结合了科研级精准的非结构化文档解析能力,以及ChatGPT的智能问答能力。

下载

现在,你可以使用 GraphQLTemplate 发送包含对象列表的请求。以下是一个示例:

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

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

@Service
public class PersonService {

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

    public List getPersonsByIds(List personIds) {

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

    public static class Variable {
        private final String key;
        private final T value;

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

        public String getKey() {
            return key;
        }

        public T getValue() {
            return value;
        }
    }

    // 假设的 ResponseGetPersonsByIds 类
    public static class ResponseGetPersonsByIds {
        private GetPersonsByIdsResponse response;

        public GetPersonsByIdsResponse getResponse() {
            return response;
        }

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

    public static class GetPersonsByIdsResponse {
        private List getPersonsByIds;

        public List getGetPersonsByIds() {
            return getPersonsByIds;
        }

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

    public 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;
        }
    }

    public static void main(String[] args) {
        PersonService personService = new PersonService();
        List ids = Arrays.asList(new BigInteger("2477142261427744786"), new BigInteger("2477142261427744787"));
        List persons = personService.getPersonsByIds(ids);

        if (persons != null) {
            persons.forEach(person -> System.out.println(person.getFirstName()));
        } else {
            System.out.println("No persons found.");
        }
    }
}

在这个例子中,personIds 是一个 BigInteger 类型的列表,它作为 variables 参数传递给 GraphQLRequestEntity.Builder()。

4. 处理响应

graphQLTemplate.query() 方法返回一个包含响应数据的对象。你需要定义相应的 Java 类来映射 GraphQL 响应。在上面的例子中,ResponseGetPersonsByIds 类用于封装响应数据。

注意事项:

  • 确保 GraphQLTemplate 依赖已正确添加到你的项目中。
  • 服务端和客户端的变量类型必须匹配。
  • 处理可能出现的异常,例如网络错误或 GraphQL 服务端返回的错误。
  • 根据你的实际需求调整 GraphQL 查询和 Java 类。

总结:

通过使用 GraphQLTemplate 和正确构建 GraphQL 查询,你可以轻松地将对象列表作为参数传递给 Spring Boot GraphQL 客户端中的查询。 重要的是要确保服务端和客户端之间的类型匹配,并正确处理响应数据。 这种方法可以有效地检索与多个 ID 或其他属性相关的数据。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

651

2023.06.15

java流程控制语句有哪些
java流程控制语句有哪些

java流程控制语句:1、if语句;2、if-else语句;3、switch语句;4、while循环;5、do-while循环;6、for循环;7、foreach循环;8、break语句;9、continue语句;10、return语句。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

454

2024.02.23

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

722

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

725

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

394

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

441

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

427

2023.08.02

笔记本电脑卡反应很慢处理方法汇总
笔记本电脑卡反应很慢处理方法汇总

本专题整合了笔记本电脑卡反应慢解决方法,阅读专题下面的文章了解更多详细内容。

1

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2万人学习

C# 教程
C# 教程

共94课时 | 5.3万人学习

Java 教程
Java 教程

共578课时 | 37.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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