如何基于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
相关产品推荐
相关产品推荐

