springmvc使用JSR303 hibernate驗證@valid及定製提示訊息
目錄:
一:新增jar包
二:添加註解
三:方法中新增@valied註解
四:頁面上顯示錯誤訊息
五:國際化檔案中錯誤訊息的定製
六:國際化資原始檔的配置訊息的配置
七:JSR303支援的註解及Hibernate validate的擴充套件註解
一:首先需要加入兩個jar包的依賴,我的專案是使用Maven構建,如果讀者沒有使用Maven構建專案自行下載jar包
<!--加入hibernate JSR 303 驗證 --> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator-annotation-processor</artifactId> <version>${hibernate.version}</version> </dependency>
二:在Bean的屬性上加入驗證的註解,紅色的為驗證註解(由於CSDN編輯器的問題,標註顏色的地方顯示了HTML程式碼,讀者自行判斷),可以在註解的message屬性中定製提示資訊
package com.crud.bean; import java.util.Date; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Past; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.NumberFormat; public class Employee { private Integer id; @NotBlank(message="使用者名稱為空啦!")
private String lastName; @Email(message="郵箱地址不合法") @NotBlank private String email; @Past @NotNull @DateTimeFormat(pattern = "yyyy-MM-dd") private Date birth; @NumberFormat(pattern = "#,###.#") private Float salary; private int gerder; private Department department; //此處省略get、set方法 }
三:在Controller的方法的Bean前面加入@Valid註解,注意!如果要獲取錯誤訊息,注入的返回物件必須與Bean相鄰,
注入的結果可是使用BindResult或者Errors,二者都可以獲取錯誤結果,二者的方法也相同,可以檢視BindingResult的原始碼,BindingResult實現了Errors介面,如圖
@RequestMapping(value="/emp", method=RequestMethod.POST)
// 這裡的驗證bean與注入結果必須相鄰,
// 注入的結果可是使用BindResult或者Errors,二者都可以獲取錯誤結果,二者的方法也相同
// public String save(@Valid Employee employee, Errors bindingResult) {
public String save(@Valid Employee employee, BindingResult bindingResult, Map<String, Object> map) {
if (bindingResult.getErrorCount() > 0) {
List<FieldError> errorFields = bindingResult.getFieldErrors();
errorFields.forEach(
(errorField) -> System.out.println(errorField.getField() + "->" + errorField.getDefaultMessage()));
System.out.println(employee);
map.put("departments", departmentDao.getAllDepartment());
return "input";
}
employeeDao.save(employee);
return "redirect:/employee/emps";
}
四:如果想要在頁面上顯示錯誤訊息,可以使用springmvc的errors標籤,其中path相同即可
使用 <form:input path="*" /> 會一次顯示所有的錯誤資訊
<td><form:input path="lastName"/></td>
<td><form:errors path="lastName"/></td>
效果如圖:
五:以下是實現錯誤訊息的定製(也可以在註解的message屬性中加提示資訊,如二中所示):
資原始檔的中的key為 註解名稱.儲存在與物件中的bean的名稱.屬性名
NotBlank.employee.lastName=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A.
Email.employee.email=\u4E0D\u5408\u6CD5\u7684\u90AE\u7BB1\u5730\u5740.
NotBlank.employee.email=\u90AE\u7BB1\u5730\u5740\u4E0D\u80FD\u4E3A\u7A7A.
Past.employee.birth=\u65F6\u95F4\u5FC5\u987B\u662F\u4E00\u4E2A\u8FC7\u53BB\u7684\u65F6\u95F4.
NotNull.employee.birth=\u751F\u65E5\u4E0D\u80FD\u4E3A\u7A7A.
如果使用了型別轉換註解,如上面Employee中的DateTimeFormat註解,國際化資原始檔key以typeMismatch開頭
typeMismatch.employee.birth=\u751F\u65E5\u7C7B\u578B\u4E0D\u5339\u914D.
typeMismatch.employee.solary=\u5DE5\u8D44\u683C\u5F0F\u9519\u8BEF.
六:springmvc配置檔案中的配置
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="i18n"></property>
</bean>
七:JSR303 支援的校驗註解
以下是Hibernate validate 進的擴充套件驗證註解@NotNull 註解元素必須是非空 @Null
註解元素必須是空 @Digits 驗證數字構成是否合法 @Future 驗證是否在當前系統時間之後 @Past 驗證是否在當前系統時間之前 @Max 驗證值是否小於等於最大指定整數值 @Min 驗證值是否大於等於最小指定整數值 @Pattern 驗證字串是否匹配指定的正則表示式 @Pattern 驗證字串是否匹配指定的正則表示式 @Size 驗證元素大小是否在指定範圍內 @DecimalMax 驗證值是否小於等於最大指定小數值 @DecimalMin 驗證值是否大於等於最小指定小數值 @AssertTrue 被註釋的元素必須為true @AssertFalse 被註釋的元素必須為false @Email 被註釋的元素必須是電子郵箱地址 @Length 被註釋的字串的大小必須在指定的範圍內 @NotEmpty 被註釋的字串的必須非空 @Range 被註釋的元素必須在合適的範圍內