You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot接口改造:将单一列表响应改为包含双列表的结构化响应

解决Spring Boot接口返回结构化双列表的问题

别担心,这个改造其实很直观,我一步步给你讲怎么实现:

1. 先定义一个响应数据传输对象(DTO)

首先你需要创建一个类来封装目标格式里的两个列表,Spring Boot会自动把这个对象序列化成你想要的JSON结构。比如:

public class OrderResponse {
    private List<String> errors;
    private List<String> successful;

    // 无参构造器(Spring序列化必须要有)
    public OrderResponse() {}

    // 带参构造器(方便快速初始化对象)
    public OrderResponse(List<String> errors, List<String> successful) {
        this.errors = errors;
        this.successful = successful;
    }

    // 必须添加Getter和Setter方法,否则JSON序列化会丢失字段
    public List<String> getErrors() {
        return errors;
    }

    public void setErrors(List<String> errors) {
        this.errors = errors;
    }

    public List<String> getSuccessful() {
        return successful;
    }

    public void setSuccessful(List<String> successful) {
        this.successful = successful;
    }
}

2. 修改接口方法的返回类型和业务逻辑

假设你原来的接口是这样的:

@GetMapping("/orders/status")
public List<String> getOrderStatuses() {
    // 这里是获取原始字符串列表的逻辑,比如从业务层拿到
    List<String> originalList = Arrays.asList(
        "The order number 1 was success",
        "The order number 2 was success",
        "The order number 3 was success",
        "The order number 4 failed"
    );
    return originalList;
}

现在把它改成这样:

@GetMapping("/orders/status")
public OrderResponse getOrderStatuses() {
    // 原始状态列表(实际项目中可能从业务服务获取)
    List<String> originalList = Arrays.asList(
        "The order number 1 was success",
        "The order number 2 was success",
        "The order number 3 was success",
        "The order number 4 failed"
    );

    // 对原始列表进行分类
    List<String> errors = new ArrayList<>();
    List<String> successful = new ArrayList<>();
    for (String status : originalList) {
        if (status.contains("failed")) {
            errors.add(status);
        } else if (status.contains("success")) {
            successful.add(status);
        }
        // 如果有其他状态类型,可以在这里补充判断逻辑
    }

    // 返回封装好的结构化响应对象
    return new OrderResponse(errors, successful);
}

3. 额外优化建议

  • 如果你用的是Java 8+,可以用Stream API简化分类逻辑,代码更简洁:
List<String> errors = originalList.stream()
    .filter(status -> status.contains("failed"))
    .collect(Collectors.toList());

List<String> successful = originalList.stream()
    .filter(status -> status.contains("success"))
    .collect(Collectors.toList());
  • 建议把分类逻辑放到业务服务层(比如OrderService),让控制器层只负责接收请求和返回响应,符合单一职责原则,代码也更易维护。

这样改造后,你的接口就会返回你想要的结构化JSON了:

{"errors":["The order number 4 failed"], "successful":["The order number 1 was success", "The order number 2 was success", "The order number 3 was success"]}

内容的提问来源于stack exchange,提问作者ewarinet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 05:12:47