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
相关产品推荐
相关产品推荐

