SpringBoot 使用validator进行参数校验(实例操作+注意事项+自定义参数校验)

一、实例操作

①、引入依赖

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.4.Final</version>
        </dependency>

②、创建实体类

package com.springboot.entity;

import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import java.io.Serializable;

public class User implements Serializable {
    private static final long serialVersionUID = -7362371894429216969L;

    @NotEmpty(message="用户名不能为空")
    @Length(min=6,max = 12,message="用户名长度必须位于6到12之间")
    private String userName;


    @NotEmpty(message="密码不能为空")
    @Length(min=6,message="密码长度不能小于6位")
    private String passWord;

    @Email(message="邮箱格式错误")
    private String email;

    @Pattern(regexp = "^(\\d{18,18}|\\d{15,15}|(\\d{17,17}[x|X]))$", message = "身份证格式错误")
    private String idCard;

    @Pattern(regexp = "^((13[0-9]{1})|159|153)+\\d{8}$",message = "手机号格式错误")
    private String phone;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getIdCard() {
        return idCard;
    }

    public void setIdCard(String idCard) {
        this.idCard = idCard;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public User(@NotEmpty(message = "用户名不能为空") @Length(min = 6, max = 12, message = "用户名长度必须位于6到12之间") String userName, @NotEmpty(message = "密码不能为空") @Length(min = 6, message = "密码长度不能小于6位") String passWord, @Email(message = "请输入正确的邮箱") String email, @Pattern(regexp = "^(\\d{18,18}|\\d{15,15}|(\\d{17,17}[x|X]))$", message = "身份证格式错误") String idCard, @Pattern(regexp = "^((13[0-9]{1})|159|153)+\\d{8}$", message = "手机号格式错误") String phone) {
        this.userName = userName;
        this.passWord = passWord;
        this.email = email;
        this.idCard = idCard;
        this.phone = phone;
    }

    public User() {
    }

    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                ", passWord='" + passWord + '\'' +
                ", email='" + email + '\'' +
                ", idCard='" + idCard + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }
}

③、建立控制层

package com.springboot.controller;

import com.springboot.entity.User;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.List;

@RestController
public class TestController {
    @PostMapping("/test")
    public String testDemo(@Valid User user, BindingResult bindingResult){
        System.out.println(user.toString());
        StringBuffer stringBuffer = new StringBuffer();
        if(bindingResult.hasErrors()){
            List<ObjectError> list =bindingResult.getAllErrors();
            for (ObjectError objectError:list) {
                stringBuffer.append(objectError.getDefaultMessage());
                stringBuffer.append("---");
            }
        }
        return stringBuffer!= null ?stringBuffer.toString():"";
    }
}

④、进行测试

作为测试demo,到这里就可以直接测试了

二、注意事项

①、@NotNull ,@NotEmpty 和 @NotBlank 三者的区别

@NotNull、@NotEmpty 和 @NotBlank 都是用于Java中进行参数校验的注解,它们之间的区别如下:

  1. @NotNull 注解用于限制参数不能为null。

  2. @NotEmpty 注解用于限制字符串、集合、Map等不能为null且大小必须大于0。

  3. @NotBlank 注解用于限制字符串不能为null并且去除两端空格后长度必须大于0。

可以简单理解为:

  • @NotNull 是用来限制对象或元素不能为null;
  • @NotEmpty 是用来限制字符串、集合、Map等不能为空;
  • @NotBlank 是用来限制字符串不能为空且长度必须大于0。

需要注意的是,这三个注解都只能用于校验方法参数,不能用于校验类属性。同时,它们都属于Hibernate Validator提供的校验注解,如果要使用这些注解,需要引入Hibernate Validator的相关依赖。

②、引入依赖的版本

要看清楚,用那种方法,具体导入什么依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

三、自定义参数校验

        这种情况主要是应对有一些特殊场景,没有相应的注解进行校验,当然,在service层中去写相应的逻辑也行,这里算是提供另一个思路和方法(说白了就是写一个自定义注解,在自定义注解中写上相应的要判断的逻辑)

①、项目结构

 ②、编写自定义注解

import com.example.demo.MyConstraint;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;


public class MyConstraintValidator implements ConstraintValidator<MyConstraint, String> {
    //String为校验的类型
    @Override
    public void initialize(MyConstraint myConstraint) {
        //启动时执行
    }

    /**
     * @Description: 自定义校验逻辑
     */
    @Override
    public boolean isValid(String s, ConstraintValidatorContext validatorContext) {
        if (!(s.equals("北京") || s.equals("上海"))) {
            return false;
        }

        return true;
    }
}
import com.example.MyConstraintValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


//用于指定使用范围,该处限定只能在字段上使用
@Target({ElementType.FIELD})
//表示注解在运行时可以通过反射获取到
@Retention(RetentionPolicy.RUNTIME)
//@Constraint注解,里面传入了一个validatedBy的字段,指定该注解校验逻辑
@Constraint(validatedBy = MyConstraintValidator.class)
public @interface MyConstraint {
    /**
     * @Description: 错误提示
     */
    String message() default "请输入中国政治或者经济中心的城市名";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

③、对应的实体类

import com.example.demo.MyConstraint;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.*;
import java.io.Serializable;

@Data
public class User implements Serializable {
    /**
     * 主键ID
     */
    private Long id;

    @NotBlank(message = "用户名不能为空")
    @Length(min = 5, max = 20, message = "用户名长度为5-20个字符")
    private String name;

    @NotNull(message = "年龄不能为空")
    @Min(value = 18 ,message = "最小18岁")
    @Max(value = 60,message = "最大60岁")
    private Integer age;

/*    @NotBlank(message = "电话不可以为空")
    @Length(min = 1, max = 13, message = "电话长度需要在13个字符以内")
    private String phone;*/

    @Email(message = "请输入邮箱")
    @NotBlank(message = "邮箱不能为空")
    private String email;

   /* @NotNull(message = "必须指定用户状态")
    @Min(value = 0, message = "用户状态不合法")
    @Max(value = 1, message = "用户状态不合法")
    private Integer status;*/

    @MyConstraint
    private String answer;

}

④、控制层

import com.example.demo.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.validation.Valid;

@Controller
public class TestValidator {

    @GetMapping("/test")
    public String showForm(User user) {
        return "form";
    }

    @GetMapping("/results")
    public String results() {
        return "results";
    }

    @PostMapping("/test")
    public String checkUser(@Valid User user, BindingResult bindingResult, RedirectAttributes attr) {
        //特别注意实体中的属性必须都验证过了,不然不会成功
        if (bindingResult.hasErrors()) {
            return "form";
        }
        /**
         * @Description:
         * 1.使用RedirectAttributes的addAttribute方法传递参数会跟随在URL后面 ,如上代码即为?name=long&age=45
         * 2.使用addFlashAttribute不会跟随在URL后面,会把该参数值暂时保存于session,待重定向url获取该参数后从session中移除,
         * 这里的redirect必须是方法映射路径。你会发现redirect后的值只会出现一次,刷新后不会出现了,对于重复提交可以使用此来完成。
         */
        attr.addFlashAttribute("user", user);
        return "redirect:/results";

    }
}

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue Validator是一个用于Vue.js的校验库,它可以帮助我们快速地实现表单校验功能。如果我们需要自定义校验规则,可以通过在Vue Validator中添加自定义校验器来实现。具体步骤如下: 1. 在Vue Validator中定义一个自定义校验器,可以使用Vue.extend方法来创建一个新的Vue实例,然后在这个实例中定义校验规则。 2. 在Vue Validator中注册自定义校验器,可以使用Vue.validator方法来注册自定义校验器,将自定义校验器的名称和校验规则传入即可。 3. 在模板中使用自定义校验器,可以在表单元素的v-validate属性中使用自定义校验器的名称,然后在错误提示信息中使用自定义校验器的名称即可。 例如,我们可以定义一个自定义校验器来验证手机号码的格式: Vue.validator('phone', function (val) { return /^1[3456789]\d{9}$/.test(val); }); 然后在模板中使用这个自定义校验器: <input type="text" v-model="phone" v-validate="'required|phone'" /> <span v-show="errors.has('phone')">请输入正确的手机号码</span> 这样就可以实现对手机号码格式的校验了。 ### 回答2: Vue Validator 是一个非常强大的表单校验库,它可以帮助我们轻松地实现表单验证功能。Vue Validator 提供了一些常见的校验规则,例如必填、数字、手机号等。如果我们需要实现一些自定义校验规则,也可以通过实现自定义校验器来实现。 Vue Validator自定义校验非常简单,只需要在 Vue 实例中定义一个自定义校验器对象,然后在表单元素的校验规则中使用即可。下面是一个简单的例子: ```javascript Vue.use(VeeValidate); const customValidator = { getMessage(field, params, data) { return (data && data.message) || '输入值不正确'; }, validate(value, args) { if (args.some(arg => value.indexOf(arg) !== -1)) { return true; } return false; } }; new Vue({ el: '#app', data: { inputValue: '', }, validations: { inputValue: { custom: customValidator, } }, }); ``` 在这个例子中,我们定义了一个名为 customValidator自定义校验器对象。这个校验器对象包含两个方法,getMessage 和 validate。其中,getMessage 方法用于返回校验失败的提示信息,validate 方法用于实现校验逻辑。 在 Vue 实例validations 属性中,我们定义了一个名为 inputValue 的表单元素,并使用了 custom 校验规则,这个规则对应了我们刚才定义的 customValidator 自定义校验器对象。 在页面中,我们只需要在表单元素上通过 v-model 绑定 input 中的数据,然后通过 v-validate 绑定校验规则即可: ```html <div id="app"> <form> <label>输入值:</label> <input type="text" v-model="inputValue" v-validate="'custom:foo,bar'"> <div class="errors"> <span v-if="errors.has('inputValue')">{{errors.first('inputValue')}}</span> </div> </form> </div> ``` 通过这个例子,我们可以看到,在 Vue Validator自定义校验是非常简单的。只需要定义一个自定义校验器对象,并在 validations 中使用即可。通过自定义校验器对象,我们可以实现各种复杂的校验逻辑,方便快捷地完成表单校验。 ### 回答3: vue validator是vue.js的一个插件,用于表单数据的校验。vue validator提供了常用的校验规则,如必填、邮箱、手机号等,同时也支持自定义校验自定义校验是基于validator.js进行封装的,因此在使用自定义校验时,需要先了解validator.js中支持的校验规则。 首先,在vue组件中引入validator.js和vue validator插件: ```javascript import validate from 'validator'; import VeeValidate, { Validator } from 'vee-validate'; import zh_CN from 'vee-validate/dist/locale/zh_CN'; Vue.use(VeeValidate); Validator.extend('customRuleName', { getMessage: (field, args) => { return `自定义校验错误信息`; }, validate: (value, args) => { // 校验逻辑 return true/false; }, }); ``` 以上代码中,通过Validator.extend方法定义了一个自定义校验规则‘customRuleName’,该规则接收两个参数,分别是getMessage和validate。 getMessage是用于定义该规则的校验失败后的错误信息,可以接收两个参数,分别是校验字段的名称和自定义规则的参数validate是定义该规则的校验逻辑,同样接收两个参数,分别是校验字段的值和自定义规则的参数。 在以上代码中,自定义校验规则的参数是args,可以根据规则需要自行指定。 自定义规则定义完成后,只需要在vue组件中使用指定规则即可。在表单中添加属性‘v-validate:规则名称=""’即可使用自定义规则。 例如: ```javascript <input type="text" name="phone" v-model="phone" v-validate:customRuleName=""> ``` 以上代码中,该表单字段使用自定义校验规则‘customRuleName’,当该表单字段值发生变化时,会触发vue validator校验逻辑,如果校验不通过,则会自动显示‘getMessage’方法返回的错误信息。 自定义校验在vue表单开发中扮演着非常重要的角色,可以满足各种复杂的业务场景需求。但需要注意,在使用自定义校验时一定要严谨,保证校验逻辑的准确性和完整性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值