苏州高端网站建设设计公司哪家好,sem投放,印章在线制作软件,拼图式网站开发项目里发生了一个bug#xff0c;就是前端请求一个接口时候#xff0c;报了HTTP 400 Bad Request
通常来说这个问题是前后端的参数没对齐#xff0c;比如前端传了个String#xff0c;但后端对应的是Integer。
所以我就排查了半天#xff0c;结果没发现啥错误#xff0c;…项目里发生了一个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方法用来创建目标类的实例并将各个参数赋值给目标类。
然而RequestBody在接受前端传来的json反序列化为Java对象时候会默认调用无参构造的Builder会给默认的无参构造器顶掉这就会导致RequestBody没法替我们反序列化了就会导致400 Bad Request。
另外需要注意 1如果你在类上使用了 Builder 注解那么你需要手动添加一个无参构造函数否则有些序列化框架需要通过 newInstance 构造对象时会报错。 2如果你在类上使用了 Builder 注解那么你不能再在构造函数或方法上使用 Builder 注解否则会导致重复生成构造器类。 3如果你想给某个属性设置一个默认值那么你需要在属性上使用 Builder.Default 注解否则默认值会被忽略。 4如果你想让子类继承父类的属性那么你需要在子类的全参构造函数上使用 Builder 注解并且在父类上使用 AllArgsConstructor 注解否则子类的构造器类不会包含父类的属性。