jsr
简介
jsr是Java Specification Requests的缩写,意思是Java 规范提案
jsr 303
JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,Hibernate Validator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint(约束) 的实现,除此之外还有一些附加的 constraint(约束)。
注解
参考版本2.0.1.Final
注解 | 说明 |
---|---|
AssertFalse | 被注释的元素必须为 false |
AssertTrue | 被注释的元素必须为 True |
DecimalMax | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
DecimalMin | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
Digits | 其值必须在可接受的范围内。integer = 1 , fraction = 2 (整数最大长度为1,小数最大长度为2) |
Future | 被注释的元素必须是一个将来的日期 |
Past | 被注释的元素必须是一个过去的日期 |
Max | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
Min | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
NotNull | 被注释的元素必须为 notnull |
NUll | 被注释的元素必须为 null |
Pattern | 被注释的元素必须符合指定的正则表达式 |
Size | 被注释的元素的大小必须在指定的范围内 |
校验是否是邮箱 | |
NotEmpty | 验证对象不为空 |
NotBlank | must contain at least one non-whitespace character |
注
- @NotEmpty、@Size
<ul>
<li>{@code CharSequence} (length of character sequence is evaluated)</li>
<li>{@code Collection} (collection size is evaluated)</li>
<li>{@code Map} (map size is evaluated)</li>
<li>Array (array length is evaluated)</li>
</ul>
- @Decimal、@Digits
<ul>
<li>{@code BigDecimal}</li>
<li>{@code BigInteger}</li>
<li>{@code CharSequence}</li>(必须是数字)
<li>{@code byte}, {@code short}, {@code int}, {@code long}, and their respective
wrappers</li>
</ul>
hibernate 自增校验注解 参考版本6.0.17.Final
注解 | 说明 |
---|---|
EAN | 检测欧洲物品编码(European Article Number) |
Length | 验证字符串长度范围[min,max |
ParameterScriptAssert | 验证参数级别脚本 jsr223 |
Range | 数值范围 eg:1<id<10 |
SafeHtml | 被约束的元素必须是一个HTML |
ScriptAssert | 验证类级别脚本,可以对有关联的值进行校验 jsr223 |
URL | 校验string是url |
...
注意
- 使用
ScriptAssert
或ParameterScriptAssert
记得引入对应的脚本引擎。比如js
脚本引擎可以引入tomcat-embed-el
包 - @Range
Apply on numeric values or string representation of the numeric value
例子:
good 1 or "1"
bad : "a"
自定义校验
有时候在特定的业务场景中需要特殊的校验。比如你希望实现以下校验功能。
bean中所有的字段都为空时校验不通过。
步骤
- 声明自定义注解
@Target({TYPE })
@Retention(RUNTIME)
@Documented
// 1. Marks an annotation as being a Bean Validation constraint
// 2. validatedBy = 具体校验类
@Constraint(validatedBy = { NotAllNullValidator.class})
public @interface NotAllNull {
// 校验不通过的时候打印的信息
String message() default "属性值不能全部为null";
// 校验组,用于分组校验
Class<?>[] groups() default { };
//
Class<? extends Payload>[] payload() default { };
}
- 实现具体校验类
public class NotAllNullValidator implements ConstraintValidator<NotAllNull, Object> {
private NotAllNull notAllNull;
@Override
public void initialize(NotAllNull constraintAnnotation) {
notAllNull = constraintAnnotation;
}
/**
* @param value 被注解的对象
* @param context
* @return true 校验通过 false 校验失败
*/
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
return notAllNull(value);
}
private boolean notAllNull(Object value) {
Field[] allFileds = value.getClass().getDeclaredFields();
for (Field field : allFileds) {
try {
if (field.get(value) != null) {
return true;
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return false;
}
}
springmvc 实现校验
直接使用@Valid
进行标注
这是入参
public static class Params {
@NotNull(message = "id不能为空")
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
前端访问接口
@RequestMapping("/test")
public void test(@Valid Params params) {
System.out.println(params.getId());
}
dubbo 实现校验
在提供者上添加validation="true"
属性。
<dubbo:service ref="orderReadService"
interface="com.order.service.OrderReadService"
protocol="dubbo" version="${dubbo_trade_provider_version}"
timeout="60000" retries="0"
//只需要增加这个属性
validation="true">