jsr
簡介
jsr是Java Specification Requests的縮寫,意思是Java 規(guī)范提案
jsr 303
JSR-303 是JAVA EE 6 中的一項子規(guī)范,叫做Bean Validation,Hibernate Validator 是 Bean Validation 的參考實現(xiàn) . Hibernate Validator 提供了 JSR 303 規(guī)范中所有內(nèi)置 constraint(約束) 的實現(xiàn),除此之外還有一些附加的 constraint(約束)枢里。
注解
參考版本2.0.1.Final
注解 | 說明 |
---|---|
AssertFalse | 被注釋的元素必須為 false |
AssertTrue | 被注釋的元素必須為 True |
DecimalMax | 被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值 |
DecimalMin | 被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值 |
Digits | 其值必須在可接受的范圍內(nèi)淳蔼。integer = 1 , fraction = 2 (整數(shù)最大長度為1,小數(shù)最大長度為2) |
Future | 被注釋的元素必須是一個將來的日期 |
Past | 被注釋的元素必須是一個過去的日期 |
Max | 被注釋的元素必須是一個數(shù)字裁眯,其值必須小于等于指定的最大值 |
Min | 被注釋的元素必須是一個數(shù)字鹉梨,其值必須大于等于指定的最小值 |
NotNull | 被注釋的元素必須為 notnull |
NUll | 被注釋的元素必須為 null |
Pattern | 被注釋的元素必須符合指定的正則表達式 |
Size | 被注釋的元素的大小必須在指定的范圍內(nèi) |
校驗是否是郵箱 | |
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>(必須是數(shù)字)
<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 | 驗證參數(shù)級別腳本 jsr223 |
Range | 數(shù)值范圍 eg:1<id<10 |
SafeHtml | 被約束的元素必須是一個HTML |
ScriptAssert | 驗證類級別腳本存皂,可以對有關(guān)聯(lián)的值進行校驗 jsr223 |
URL | 校驗string是url |
...
注意
- 使用
ScriptAssert
或ParameterScriptAssert
記得引入對應(yīng)的腳本引擎。比如js
腳本引擎可以引入tomcat-embed-el
包 - @Range
Apply on numeric values or string representation of the numeric value
例子:
good 1 or "1"
bad : "a"
自定義校驗
有時候在特定的業(yè)務(wù)場景中需要特殊的校驗逢艘。比如你希望實現(xiàn)以下校驗功能旦袋。
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 { };
}
- 實現(xiàn)具體校驗類
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 實現(xiàn)校驗
直接使用@Valid
進行標(biāo)注
這是入?yún)?/p>
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 實現(xiàn)校驗
在提供者上添加validation="true"
屬性猜憎。
<dubbo:service ref="orderReadService"
interface="com.order.service.OrderReadService"
protocol="dubbo" version="${dubbo_trade_provider_version}"
timeout="60000" retries="0"
//只需要增加這個屬性
validation="true">