1. 程式人生 > >springmvc使用JSR303 hibernate驗證@valid及定製提示訊息

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 支援的校驗註解

  • @NotNull註解元素必須是非空

    @Null 

    註解元素必須是空
    @Digits 驗證數字構成是否合法
    @Future   驗證是否在當前系統時間之後
     @Past  驗證是否在當前系統時間之前
    @Max  驗證值是否小於等於最大指定整數值
    @Min    驗證值是否大於等於最小指定整數值
    @Pattern 驗證字串是否匹配指定的正則表示式
    @Pattern  驗證字串是否匹配指定的正則表示式
     @Size 驗證元素大小是否在指定範圍內
    @DecimalMax驗證值是否小於等於最大指定小數值
    @DecimalMin驗證值是否大於等於最小指定小數值
     @AssertTrue 被註釋的元素必須為true
     @AssertFalse 被註釋的元素必須為false
    以下是Hibernate validate 進的擴充套件驗證註解
  • @Email被註釋的元素必須是電子郵箱地址
    @Length 被註釋的字串的大小必須在指定的範圍內
    @NotEmpty 被註釋的字串的必須非空
    @Range 被註釋的元素必須在合適的範圍內