SpringBoot注解 @NotBlank、@NotNull 注解

一 场景
搭建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这个条件,这样就能实现权限管理。

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

可以使用 `@Validated` 和 `@NotNull` 注解来实现对入参对象中的参数进行非空校验,并且可以使用分组校验来对不同分组进行不同的校验。 首先,定义一个入参对象,例如: ```java public class User { @NotNull(groups = {Add.class, Update.class}, message = "id不能为空") private Long id; @NotBlank(groups = {Add.class, Update.class}, message = "用户名不能为空") private String username; @NotBlank(groups = {Add.class}, message = "密码不能为空") private String password; // 省略其他属性和方法 } ``` 在上述代码中,使用了 `@NotNull` 和 `@NotBlank` 注解来对 `id`、`username` 和 `password` 进行非空校验,并且使用了分组校验来对不同分组进行不同的校验。 接着,在 Controller 层中使用 `@Validated` 注解来启用校验功能,并且在需要进行校验的入参对象前使用 `@Valid` 注解来表示需要对该对象进行校验。例如: ```java @RestController @RequestMapping("/user") @Validated public class UserController { @PostMapping("/add") public String addUser(@Validated(Add.class) @RequestBody User user) { // 省略业务逻辑 return "success"; } @PostMapping("/update") public String updateUser(@Validated(Update.class) @RequestBody User user) { // 省略业务逻辑 return "success"; } } ``` 在上述代码中,使用了 `@Validated(Add.class)` 和 `@Validated(Update.class)` 注解来指定不同的分组,分别对应添加用户和修改用户的场景,这样就可以根据不同的场景进行不同的校验。 最后,需要定义分组接口,例如: ```java public interface Add {} public interface Update {} ``` 在上述代码中,定义了 `Add` 和 `Update` 两个分组接口,用来在入参对象的属性上标记需要进行校验的属性。 这样,当调用添加用户和修改用户的接口时,就会根据不同的分组进行不同的校验,从而保证了入参对象中的参数不能为 null。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值