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

如何基于RestTemplate构建去重且自定义字段名的目标数据列表?

解决方案:过滤并转换RestTemplate获取的列表数据

步骤1:创建自定义DTO类

定义仅包含所需字段的DTO类,通过@JsonProperty指定返回的JSON键名,同时重写equals和hashCode用于去重判断:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import java.util.Objects;

@JsonIgnoreProperties(ignoreUnknown = true)
public class AutonomousRegionDTO {
    @JsonProperty("autonomy_code") // 自定义返回的属性名
    private String autonomyCode;
    
    @JsonProperty("autonomy_name") // 自定义返回的属性名
    private String autonomyName;

    public AutonomousRegionDTO(String autonomyCode, String autonomyName) {
        this.autonomyCode = autonomyCode;
        this.autonomyName = autonomyName;
    }

    // Getter和Setter方法
    public String getAutonomyCode() {
        return autonomyCode;
    }

    public void setAutonomyCode(String autonomyCode) {
        this.autonomyCode = autonomyCode;
    }

    public String getAutonomyName() {
        return autonomyName;
    }

    public void setAutonomyName(String autonomyName) {
        this.autonomyName = autonomyName;
    }

    // 重写equals和hashCode,确保distinct()能正确去重
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        AutonomousRegionDTO that = (AutonomousRegionDTO) o;
        return Objects.equals(autonomyCode, that.autonomyCode) && 
               Objects.equals(autonomyName, that.autonomyName);
    }

    @Override
    public int hashCode() {
        return Objects.hash(autonomyCode, autonomyName);
    }
}

步骤2:修改Service层处理数据

在ProvinceService中使用Java Stream API完成数据转换、去重:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class ProvinceService {

    @Autowired
    RestTemplate restTemplate;

    public List<AutonomousRegionDTO> getUniqueAutonomousRegions(){
        // 获取原始数据
        Provinces listOfProvinces = Templates.restTemplateProvince(restTemplate);
        
        // 流式处理:转换为DTO、去重、收集结果
        return listOfProvinces.getprovinces().stream()
                .map(data -> new AutonomousRegionDTO(data.getCodAuton(), data.getComunidadeCidadeAutonoma()))
                .distinct()
                .collect(Collectors.toList());
    }
}

步骤3:修改Controller返回处理后的结果

更新ShowcaseController,返回处理后的DTO列表:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;

@RestController
public class ShowcaseController {

    @Autowired
    ProvinceService provinceService;

    @GetMapping("/autonomous-regions")
    public List<AutonomousRegionDTO> getUniqueAutonomousRegions(){
        return provinceService.getUniqueAutonomousRegions(); 
    }
}

关键说明

  • DTO类作用:封装对外暴露的字段,通过@JsonProperty自定义JSON输出键名,实现“不同标题展示”的需求。
  • 去重逻辑:distinct()方法依赖DTO重写的equals和hashCode,确保相同的自治区域编码和名称组合仅保留一条数据。
  • Stream优势:用流式操作简化数据转换和过滤,代码简洁易维护。

如果需要返回带外层包装的结构(比如统一的响应键),可以额外创建包装类:

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

public class AutonomousRegionResponse {
    @JsonProperty("autonomous_regions")
    private List<AutonomousRegionDTO> regions;

    public AutonomousRegionResponse(List<AutonomousRegionDTO> regions) {
        this.regions = regions;
    }

    public List<AutonomousRegionDTO> getRegions() {
        return regions;
    }

    public void setRegions(List<AutonomousRegionDTO> regions) {
        this.regions = regions;
    }
}

随后修改Service的返回类型为AutonomousRegionResponse,Controller对应调整即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:45:30