很多时候,前端需要传递表单数据给后端,那么后端该如何接收前端的数据呢?又如何对参数进行校验呢?
假如前端以application/x-www-form-urlencoded的方式将以下参数以键值对传递给后台:
可见参数比较复杂,而且包含一个对象数组,此时可以在后端新建一个表单类去接收参数,属性名要与前端参数的名称一致。此时可在属性名上加入@NotEmpty等注解进行参数的校验。
表单类
package com.pers.order.form;
import lombok.Data;
import org.hibernate.validator.constraints.NotEmpty;
@Data
public class OrderForm {
@NotEmpty(message = "姓名必填")
private String name;
@NotEmpty(message = "手机号必填")
private String phone;
@NotEmpty(message = "地址必填")
private String address;
@NotEmpty(message = "openId必填")
private String openid;
@NotEmpty(message = "购物车不能为空")
private String items;
}
Controller层
@RestController
@RequestMapping("/order")
@Slf4j
public class OrderController {
@Autowired
private OrderService orderService;
@PostMapping("/create")
public ResultVo create(@Valid OrderForm orderForm, BindingResult bindingResult){
if(bindingResult.hasErrors()){
log.error("创建订单,参数不正确,orderForm={}",orderForm);
throw new OrderException(ResultEnum.PARAM_ERROR.getCode(),bindingResult.getFieldError().getDefaultMessage());
}
}
@Valid加在传入的参数名前表示要对传入的参数进行参数校验BindingResult类型对象是表单验证返回的结果,如果参数错误,可以抛出自定义的异常。
下面是自定义的异常
public class OrderException extends RuntimeException {
private Integer code;
public OrderException(Integer code,String message){
super(message);
this.code=code;
}
public OrderException(ResultEnum resultEnum){
super(resultEnum.getMessage());
this.code=resultEnum.getCode();
}
}
写了一个枚举去处理多种异常的情况
@Getter
public enum ResultEnum {
PARAM_ERROR(1,"参数错误"),
CART_EMPTY(2,"购物车为空"),
;
private Integer code;
private String message;
ResultEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
}