一 场景
搭建SpringBoot项目时,当前端或者其他调用方,调用我们写的接口时,我们不能只依靠调用方,来控制参数的准确性,自己也要对参数进行校验。

二 使用方法

按照以往的做法,我们需要对request中的参数一个一个校验:

model:

public class OrderDto implements Serializable{
    private String vendorCode;//商家编码,非空
    private String orderNo;//订单编号,非空
    private String userId;//收件人ID,非空
    private String receiver;//收件人姓名
    private String receivePhone;//收件人号码
}

然后再一个一个写判断

controller:

@PostMapping("/getOrder")
public String classs getOrder(@Requestbody  VendorOrderDto  vendorOrderDto )
{
     if(vendorOrderDto.vendorCode==null||vendorOrderDto.vendorCode.equals("")){
         return "请输入商家编码!";
     }
     if(vendorOrderDto.orderNo==null||vendorOrderDto.orderNo.equals("")){
         return "请输入订单编号!";
     }
     ...
     return null;
}

这种做法是可取的,能达到我们的要求,但是如果model字段很多,controller层判定语句也会增加,代码冗余且维护起来麻烦。我们使用Spring注解,来实现我们的需求。

model:

public class OrderDto implements Serializable{
    @NotBlank(message = "请输入商家编码!")
    private String vendorCode;//商家编码,非空
    @NotNull("请输入订单编号!")
    private String orderNo;//订单编号,非空
    @NotNull("请输入收件人ID!")
    private String userId;//收件人ID,非空
    private String receiver;//收件人姓名
    private String receivePhone;//收件人号码
}

三 某个应用场景
注解@NotBlank等,还可配合网关进行权限管理。

比如,有运营端和商家端。他们在查看订单时调用的接口一样,均是getOrder(orderDto),但是他们返回的VO对象的内容不一样。运营端看到的信息要多,比如,userId。而商家端只能看到收件人姓名、电话等信息,看不到UserId。

运营端调用服务端2的getOrder()接口时,走的是服务端,服务端1调用服务端2,也就是服务端1调用服务端2的getOrder()接口,那么在服务端1时,就不需要配置商家编码@NotBlank这个条件,因为运营端可以查看所有商家的订单信息。

商家端只能查看自己的订单,所以服务端2需要商家编码才能返回商家自己的订单。商家端调用服务端2的getOrder()接口时,走的是网关,网关调用服务端2,那么在网关处就需配置@NotBlank这个条件,这样就能实现权限管理。

这是我再在学习时看到的一个使用场景,专业的权限管理方法,请查阅资料。