后端JSR303校验


一、导入依赖

		<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.4.1.Final</version>
        </dependency>

二、在需要检查的属性上添加注解

	@Pattern(
		regexp = "^[\\w\\u2E80-\\u9FFF-]{6,12}$", 
		message = "请输入6~12位的中英文包括横线和下划线"
		)
    private String empName;
    
	@Pattern(
		regexp = "^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$", 
		message = "请输入正确格式的邮箱"
		)
    private String email;

三、在控制器方法中使用

@Valid:在需要验证的参数上加上注解
BindingResult: 用于保存验证完成的结果

	@RequestMapping(value = "/emp", method = RequestMethod.POST)
    @ResponseBody
    public Msg saveEmp(@Valid Employee emp, BindingResult result){
        Map<String, Object> map = new HashMap<>();
        if(result.hasErrors()){
            for (FieldError fieldError : result.getFieldErrors()) {
                System.out.println("错误字段:" + fieldError.getField());
                System.out.println("错误信息:" + fieldError.getDefaultMessage());
                map.put(fieldError.getField(), fieldError.getDefaultMessage());
            }
            return Msg.fail().add("Errorfields", map);
        }else {
            employeeService.saveEmp(emp);
        }
        return Msg.success();
    }

四、前端从后端中获取到相关信息以后进行相应操作

校验类型注解

空检查
@Null验证对象是否为null
@NotNull验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty检查约束元素是否为NULL或者是EMPTY.
Booelan检查
@AssertTrue验证 Boolean 对象是否为 true
@AssertFalse验证 Boolean 对象是否为 false
长度检查
@Size(min=, max=)验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=)Validates that the annotated string is between min and max included.
日期检查
@Past验证 Date 和 Calendar 对象是否在当前时间之前
@Future验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern验证 String 对象是否符合正则表达式的规则
数值检查建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null
@Min验证 Number 和 String 对象是否大等于指定的值
@Max验证 Number 和 String 对象是否小等于指定的值
@DecimalMax被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Digits验证 Number 和 String 的构成是否合法
@Digits(integer=,fraction=)验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
@Range(min=, max=)检查数字是否介于min和max之间.
@Range(min=10000,max=50000,message=“range.bean.wage”)private BigDecimal wage;
@Valid递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
@CreditCardNumber信用卡验证
@Email验证是否是邮件地址,如果为null,不进行验证,算通过验证。
@ScriptAssert(lang= ,script=, alias=)
@URL(protocol=,host=, port=,regexp=, flags=)
### 了解JSR303前端校验实现方式 JSR303 是一种用于后端数据校验的标准,主要在服务器端使用注解来定义校验规则。然而,前端校验通常依赖于 JavaScript 或框架(如 React、Vue.js 等)中的验证库。为了在前端实现与 JSR303 类似的校验逻辑,可以采用以下方法: #### 1. 使用自定义的前端校验逻辑 前端可以通过 JavaScript 或者现代前端框架(如 Vue.js、React 等)实现类似的校验逻辑。例如,通过正则表达式或条件判断来模拟 JSR303校验规则。 ```javascript function validateInput(input) { const errors = []; if (!input || input.length === 0) { errors.push("字段不能为空"); // @NotNull 校验 } if (input.length < 5 || input.length > 20) { errors.push("长度必须在 5 到 20 之间"); // @Size(min=5, max=20) 校验 } if (!/^[a-zA-Z0-9]+$/.test(input)) { errors.push("只允许字母和数字"); // 自定义正则校验 } return errors; } // 示例调用 const userInput = "abc123"; const validationErrors = validateInput(userInput); if (validationErrors.length > 0) { console.error("校验失败:", validationErrors.join(", ")); } else { console.log("校验成功"); } ``` #### 2. 前后端校验规则同步 为了确保前后端校验规则的一致性,可以将后端JSR303 校验规则以元数据的形式暴露给前端。例如,通过 REST API 返回模型的校验规则,并在前端动态生成校验逻辑。 ```json { "fields": [ { "name": "username", "rules": [ {"type": "notNull", "message": "字段不能为空"}, {"type": "size", "min": 5, "max": 20, "message": "长度必须在 5 到 20 之间"} ] }, { "name": "email", "rules": [ {"type": "email", "message": "请输入有效的电子邮件地址"} ] } ] } ``` 前端可以根据返回的 JSON 数据动态生成校验逻辑。 #### 3. 使用前端校验库 一些流行的前端校验库可以帮助实现复杂的校验逻辑,例如: - **jQuery Validation Plugin**: 适用于基于 jQuery 的项目。 - **Vuelidate / VeeValidate**: 针对 Vue.js 的校验插件。 - **Formik / Yup**: 针对 React 的表单管理和校验工具。 以下是使用 Formik 和 Yup 的示例: ```javascript import { useFormik } from &#39;formik&#39;; import * as Yup from &#39;yup&#39;; const validationSchema = Yup.object({ username: Yup.string() .required(&#39;字段不能为空&#39;) // 对应 @NotNull .min(5, &#39;长度不能小于 5&#39;) // 对应 @Size(min=5) .max(20, &#39;长度不能大于 20&#39;), // 对应 @Size(max=20) email: Yup.string() .email(&#39;无效的电子邮件格式&#39;) // 对应 @Email .required(&#39;电子邮件不能为空&#39;) }); function MyForm() { const formik = useFormik({ initialValues: { username: &#39;&#39;, email: &#39;&#39; }, validationSchema: validationSchema, onSubmit: values => { alert(JSON.stringify(values, null, 2)); } }); return ( <form onSubmit={formik.handleSubmit}> <label>用户名</label> <input type="text" name="username" onChange={formik.handleChange} value={formik.values.username} /> {formik.errors.username && formik.touched.username ? <div>{formik.errors.username}</div> : null} <label>电子邮件</label> <input type="email" name="email" onChange={formik.handleChange} value={formik.values.email} /> {formik.errors.email && formik.touched.email ? <div>{formik.errors.email}</div> : null} <button type="submit">提交</button> </form> ); } ``` #### 4. 结合 Swagger 或 OpenAPI 自动生成前端校验 如果项目中使用了 Swagger 或 OpenAPI 来描述接口和数据模型,可以利用这些工具生成前端代码,其中包括校验逻辑。例如,Swagger Codegen 可以生成包含校验逻辑的前端代码[^2]。 --- ### 总结 尽管 JSR303 主要用于后端校验,但可以通过以下方式在前端实现类似的功能: - 手动编写校验逻辑,模拟 JSR303 注解的行为。 - 将后端校验规则以元数据形式暴露给前端,并动态生成校验逻辑。 - 使用成熟的前端校验库(如 Formik/Yup、Vuelidate 等)实现复杂的校验需求。 - 结合 Swagger 或 OpenAPI 自动生成前端校验代码。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值