对WebFlux的参数使用@Valid校验

实体类代码

@Data
@NoArgsConstructor
@AllArgsConstructor
public class EnterpriseRegister {

    @Size(min = 2, max = 10, message = "联系人名称")
    private String contactsName;

    @Pattern(regexp = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$", message = "使用正则校验邮箱")
    private String contactsEmail;

    @Pattern(regexp = "^1[35678]\\d{9}$", message = "使用正则校验手机号")
    private String contactsPhone;

    @Size(min = 2, max = 2, message = "地区编码")
    private String regionCode;

    @Size(min = 1, max = 20, message = "市名称")
    private String cityName;

    @Size(min = 1, max = 40, message = "详细地址")
    private String enterpriseAddress;

    @Size(min = 4, max = 50, message = "税务登记证图片")
    private String taxRegistrationCertificate;

    @Size(min = 1, max = 1, message = "注册百度1, 注册腾讯2,注册阿里巴巴3")
    private String flag;
}

在Controller的方法里面,如果不使用@Valid校验,就是太麻烦了。需要一个一个if判断是否合规,现在有了@Valid就方便多了。
WebFlux中Controller代码:

@PostMapping(value = "/register", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public Mono enterpriseRegister(@Valid @RequestBody Mono enterpriseRegister) {
        return enterpriseRegister
                .map(enterpriseRegister1 -> {
                    return new Result(true, ReturnCode.SUCCESS, "模拟ok",  enterpriseRegisterService.enterpriseRegister(enterpriseRegister1).block());
                })
                .doOnError(throwable -> log.info("失败原因:>>>" + throwable.getMessage()))
                .onErrorReturn(throwable -> throwable instanceof WebExchangeBindException, new Result(false, ReturnCode.FAIL, "参数不合法"));
    }

return 后面将会订阅这个Mono,如果EnterpriseRegister对象封装不成功,将会发生WebExchangeBindException异常,后面对这个异常进行捕捉,如果捕捉ok则参数不合法

Spring MVC的校验方式:(上面的实体类不变)

@PostMapping(value = "/register", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public Mono enterpriseRegister(@Valid @RequestBody Mono enterpriseRegister, Errors errors) {
        if(errors.hasErrors())
            return Mono.just(new Result(false, ReturnCode.FAIL, "参数不合法"));
        return enterpriseRegister
                .map(enterpriseRegister1 -> {
                    return new Result(true, ReturnCode.SUCCESS, "注册商户成功", enterpriseRegisterService.enterpriseRegister(enterpriseRegister1).block());
                });
    }

如果实体类不符合校验规则,则Errors对象会被访问,会有错误,可以使用hasErrors来进行判断,是否有错误发生,如果有则不符合校验规则。

你可能感兴趣的:(WebFlux校验,WebFlux)