@Builder注释导致@RequestBody的前端json反序列化失败,HTTP400

项目里发生了一个bug,就是前端请求一个接口时候,报了HTTP 400 Bad Request

通常来说这个问题是前后端的参数没对齐,比如前端传了个String,但后端对应的是Integer。

所以我就排查了半天,结果没发现啥错误,有点懵。

最后发现问题出在Controller层里,@RequestBody SubmitParam。

而SubmitParam中的某一个参数,我给加上了@Data和@Builder,注释,这个@Builder注释可好,直接给我干400了,其实去掉@Builder或者加上@AllArgsConstructor和@NoArgsConstructor都可以解决这个问题。

这是为什么呢,因为@Builder算是Lombok里很常用的注释了,可以简化我们构建对象,避免大量set的语句。当你在一个类上使用@Builder注解时,Lombok会自动生成一个静态内部类Builder,将目标类的参数都复制到Builder类里,用于创建该类的实例,提供一种流畅的链式方式来构建对象。

举个例子

import lombok.Builder;

@Builder
public class Person {
    private String name;
    private int age;
    private String address;
}

// 在其他地方的代码中
Person person = Person.builder()
                      .name("John")
                      .age(30)
                      .address("123 Main St")
                      .build();

坑就在@Builder注释在目标类中创建一个私有构造函数,参数为 Builder类型。在Builder类中提供设置各个参数的方法,并返回当前对象。最后在 Builder类中提供一个 build方法,用来创建目标类的实例,并将各个参数赋值给目标类。</

private List<RequirementResp> getRequirementInfosRestrict(String queryParamKey, List<String> requirementIds) { HashMap<String, String> headers = new HashMap<>(RequirementHeaders.toMap()); headers.put(OPERATOR, getCurrentUser()); List<Map<String, StringAndListType>> requestBody = buildRequestBody(queryParamKey, requirementIds); try { CubeResponse<String> response = invoker.invoke(CubeRequest.builder() .headers(headers) .service(REQUIREMENT_QUERY) .body(requestBody) .method(HttpMethod.POST) .sgovToken() .build(), String.class); return JSONObject.parseObject(response.getBody()) .getJSONObject(DATA) .getJSONArray(RESULT) .toJavaList(RequirementResp.class); } catch (Exception e) { log.error("Query requirement information exception", e); } return new ArrayList<>(); } private List<Map<String, StringAndListType>> buildRequestBody(String queryParamKey, List<String> queryParamValue) { List<Map<String, StringAndListType>> requestBody = new ArrayList<>(); Map<String, StringAndListType> queryParam = new HashMap<>(); queryParam.put(KEY, new StringValue(queryParamKey)); queryParam.put(OPERATOR, new StringValue(OR)); queryParam.put(VALUE, new ListValue<>(queryParamValue)); requestBody.add(queryParam); Map<String, StringAndListType> returnFields = new HashMap<>(); returnFields.put(KEY, new StringValue(RETURN_FIELDS)); //TODO 测试替换 returnFields.put(VALUE, new StringValue(RETURN_FIELDS_LIST)); requestBody.add(returnFields); Map<String, StringAndListType> pageParam = new HashMap<>(); pageParam.put(KEY, new StringValue(PAGE_PARAM)); pageParam.put(PAGE_NO, new StringValue(PAGE_ONE)); pageParam.put(PAGE_SIZE, new StringValue(String.valueOf(queryParamValue.size()))); requestBody.add(pageParam); return requestBody; } private sealed interface StringAndListType permits StringValue, ListValue { } private record StringValue(String value) implements StringAndListType { } private record ListValue<String>(List<String> value) implements StringAndListType { } requestBody 好像序列化失败
09-24
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值