天天看點

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接口,如圖

springmvc使用JSR303 hibernate驗證@valid及定制提示消息
@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>
           

效果如圖:

springmvc使用JSR303 hibernate驗證@valid及定制提示消息

五:以下是實作錯誤消息的定制(也可以在注解的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  被注釋的元素必須在合适的範圍内

繼續閱讀