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

