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

Java Spring Boot如何将员工列表接口响应调整为指定结构化JSON格式

实现方案

第一步:创建自定义响应封装类

首先新增一个DTO类来匹配你需要的响应结构,字段上添加@JsonProperty注解保证序列化后的JSON字段名符合要求:

import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.Map;

public class EmployeeResponse {
    @JsonProperty("total_items")
    private long totalItems;

    @JsonProperty("has_more")
    private boolean hasMore;

    private Map<Long, Employee> employees;

    // 无参构造
    public EmployeeResponse() {}

    // 全参构造
    public EmployeeResponse(long totalItems, boolean hasMore, Map<Long, Employee> employees) {
        this.totalItems = totalItems;
        this.hasMore = hasMore;
        this.employees = employees;
    }

    // Getter和Setter
    public long getTotalItems() {
        return totalItems;
    }

    public void setTotalItems(long totalItems) {
        this.totalItems = totalItems;
    }

    public boolean isHasMore() {
        return hasMore;
    }

    public void setHasMore(boolean hasMore) {
        this.hasMore = hasMore;
    }

    public Map<Long, Employee> getEmployees() {
        return employees;
    }

    public void setEmployees(Map<Long, Employee> employees) {
        this.employees = employees;
    }
}

第二步:修改控制器逻辑

调整EmployeeController中接口的返回值,将查询到的员工列表转换为以员工ID为key的Map,再封装到自定义响应类中返回:

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.raksh.springboot.model.Employee;
import com.raksh.springboot.repository.EmployeeRepository;
import com.raksh.springboot.dto.EmployeeResponse; // 替换为你实际的DTO包路径

@CrossOrigin(origins = "http://localhost:3000/")
@RestController
@RequestMapping("/api/v1/")
public class EmployeeController {

    @Autowired
    private EmployeeRepository employeeRepository;

    // 获取所有员工
    @GetMapping("/employees")
    public EmployeeResponse getAllEmployees(){
        // 查询所有员工
        List<Employee> employeeList = employeeRepository.findAll();
        // 转换为ID为key的Map
        Map<Long, Employee> employeeMap = employeeList.stream()
                .collect(Collectors.toMap(Employee::getId, emp -> emp));
        // 获取员工总条数
        long total = employeeRepository.count();
        // 全量查询时has_more为false,后续加分页功能可根据分页参数计算该值
        boolean hasMore = false;
        // 封装返回
        return new EmployeeResponse(total, hasMore, employeeMap);
    }
}

拓展:分页场景下的has_more计算

如果后续需要实现分页查询,只需要调整接口接收分页参数,修改查询逻辑即可:

// 分页版本接口示例
@GetMapping("/employees")
public EmployeeResponse getEmployeesByPage(
        @RequestParam(defaultValue = "0") int page,
        @RequestParam(defaultValue = "10") int size
){
    Page<Employee> employeePage = employeeRepository.findAll(PageRequest.of(page, size));
    Map<Long, Employee> employeeMap = employeePage.getContent().stream()
            .collect(Collectors.toMap(Employee::getId, emp -> emp));
    long total = employeePage.getTotalElements();
    // 非最后一页则has_more为true
    boolean hasMore = !employeePage.isLast();
    return new EmployeeResponse(total, hasMore, employeeMap);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 04:27:01