一.仔细阅读业务需求

  • 假设有一份API文档如下所示

    API文档
  • 可以看到,从前端传递过来的参数较多,且items为json格式的字符串,需要进行特别处理

二.建立表单类接收参数

  • 表单类 - OrderForm

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    @Data
    public class OrderForm {

    /**
    * 买家姓名
    */
    @NotEmpty(message = "姓名必填")
    private String name;

    /**
    * 买家手机号
    */
    @NotEmpty(message = "手机号必填")
    private String phone;

    /**
    * 买家地址
    */
    @NotEmpty(message = "地址必填")
    private String address;

    /**
    * 买家openid
    */
    @NotEmpty(message = "openid必填")
    private String openid;

    @NotEmpty(message = "购物车不能为空")
    private String items;

    }
  • 其中@NotEmpty注解表示其接收参数不能为空长度为0 ,message为错误信息,除此之外常用的还有@NotNull @NotBlank,其区别如下所述

    1
    2
    3
    @NotEmpty //用在集合上面(不能注释枚举)
    @NotBlank //用在String上面
    @NotNull //用在所有类型上面
  • 使用@Valid注解做Controller层校验,必要时输出错误信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //创建订单
    @PostMapping("/create")
    public ResultVO<Map<String,String>> create(@Valid OrderForm orderForm,
    BindingResult bindingResult){
    if(bindingResult.hasErrors()){
    log.error("[创建订单]参数不正确,orderForm={}",orderForm);
    throw new SellException(ResultEnum.PARAM_ERROR.getCode(),
    bindingResult.getFieldError().getDefaultMessage());
    //使用以上方法获取错误信息
    }
    ......
    }

三.处理JSON格式字符串

  • 添加依赖

    1
    2
    3
    4
    <dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    </dependency>
  • 根据第一部分文档需求,我们要提取items参数中的信息转为列表

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    //创建List
    List<OrderDetail> orderDetailList = new ArrayList<>();

    //将json转换为List,注意下列OrderDetail为接收items参数的实体类
    try {
    orderDetailList = gson.fromJson(orderForm.getItems(),
    new TypeToken<List<OrderDetail>>() {
    }.getType());

    }catch (Exception e){
    //方法上使用@Slf4j注解
    log.error("[对象转换错误],json={}", orderForm.getItems());
    throw new SellException(ResultEnum.PARAM_ERROR);
    }

    orderDTO.setOrderDetailList(orderDetailList);
  • 以上就是要和大家分享的内容啦,利用表单类接收并处理复杂、繁多的接收参数,可以使得编码中的Controller层更简洁,代码更清晰。除了上文提到的校验注解,还有一些常用的SpringBoot校验注解:点击这里