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

Java实体类嵌套包装及RestTemplate GET请求传参方案咨询

解决RestTemplate GET请求传参及返回值校验问题

1. 创建参数包装类

直接定义一个DTO类,封装需要传递的user和likes字段:

public class LikeRequestParams {
    private String user;
    private Integer likes; // 用Integer兼容空值场景

    // 生成Getter、Setter方法(或用Lombok的@Data注解简化)
    public String getUser() { return user; }
    public void setUser(String user) { this.user = user; }
    public Integer getLikes() { return likes; }
    public void setLikes(Integer likes) { this.likes = likes; }
}

2. 修正GET请求的参数传递方式

目标API的示例是查询参数传递(?likes=xyz&user=abc),HTTP规范中GET请求不建议携带请求体(多数后端框架会忽略GET请求体),因此推荐用UriComponentsBuilder构建带查询参数的URL:

public List<Account> getRatingViaApi(LikeRequestParams requestParams) {
    RestTemplate restTemplate = new RestTemplate();
    String resourceUrl = "http://localhost:8080/api/likes/user";

    // 构建带查询参数的URL
    UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl(resourceUrl)
            .queryParam("user", requestParams.getUser())
            .queryParam("likes", requestParams.getLikes())
            .build();

    ResponseExtractor<List<Account>> responseExtractor = response -> {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.readValue(response.getBody(), new TypeReference<List<Account>>() {});
    };

    // 执行GET请求,无需RequestCallback(原逻辑的RequestCallback用于写请求体,GET场景不需要)
    return restTemplate.execute(uriComponents.toUriString(), 
                               HttpMethod.GET, 
                               null, 
                               responseExtractor);
}

若后端强制要求GET带请求体(不推荐),可保留RequestCallback并设置请求头:

RequestCallback requestCallback = request -> {
    ObjectMapper mapper = new ObjectMapper();
    mapper.writeValue(request.getBody(), requestParams);
    request.getHeaders().setContentType(MediaType.APPLICATION_JSON);
    request.getHeaders().setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
};

3. 实体类适配调整

API返回的likes是字符串类型("likes":"1"),但你的PostList类中likes是int类型,需做反序列化适配,避免报错:

public class PostList {
    // 用@JsonDeserialize实现字符串转int,或直接将字段类型改为String
    @JsonDeserialize(using = StringToIntegerDeserializer.class)
    public int likes;
    public String comment;
    public int shares;
}

4. 返回值校验逻辑

针对API的两种返回情况,编写校验逻辑:

List<Account> result = getRatingViaApi(requestParams);

if (result == null || result.isEmpty()) {
    throw new IllegalArgumentException("API返回空结果");
}

Account account = result.get(0);
// 校验无帖子场景
if (account.getUser() == null && account.getDate() == null && account.getPost() == null) {
    return Collections.emptyList();
}

// 校验有帖子场景的字段完整性
if (account.getUser() == null || account.getDate() == null || account.getPost() == null) {
    throw new IllegalArgumentException("Account核心字段缺失");
}

// 校验PostList字段合法性
for (PostList post : account.getPost()) {
    if (post.likes <= 0 || post.comment == null || post.shares <= 0) {
        throw new IllegalArgumentException("PostList字段不合法");
    }
}

return result;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:48:57