要在应用校验,需要:
- 在被校验的类上声明校验规则(Taco类);
- 在控制器方法上声明要进行校验(DesignTacoController#processDesign()和OrderControlller#processOrder());
- 修改表单视图以展现校验错误。
1.声明校验规则
@Data
public class Taco {
@NotNull //name属性不为空或null
//name属性至少有5个字符长度
@Size(min=5, message = "Name must be at least 5 characters long!")
private String name;
@NotNull
@Size(min = 1, message = "You must choose at least 1 ingredient!")
private List<String> ingredients;
}
@Data
public class Order {
//name属性不能为空白字段
@NotBlank(message = "Name is required")
private String name;
@NotBlank(message = "Street is required")
private String street;
@NotBlank(message = "City is required")
private String city;
@NotBlank(message = "State is required")
private String state;
@NotBlank(message = "Zip code is required")
private String zip;
//合法的信用卡号码
@CreditCardNumber(message = "Not a valid credit card number")
private String ccNumber;
//符合MM/YY格式
@Pattern(regexp = "^(0[1-9]|1[0-2])([\\/])([1-9][0-9])$",
message = "Must be formatted MM/YY")
private String ccExpiration;
//是一个3位的数字
@Digits(integer = 3, fraction = 0, message = "Invalid CVV")
private String ccCVV;
}
2. 在表单绑定的时候执行校验
添加了@Valid
注解对Taco对象进行校验和Errors属性判断是否出错。
@PostMapping
public String processDesign(@Valid Taco design, Errors errors) {
if (errors.hasErrors()) {
return "design";
}
log.info("Processing design:"+design);
return "redirect:/order/current";
}
@PostMapping
public String processOrder(@Valid Order order, Errors errors) {
if(errors.hasErrors()) {
return "orderForm";
}
log.info("Order submitted: " + order);
return "redirect:/";
}
3. 展现错误
fields.hasErrors()
会检查ccNumber域是否存在错误,th:errors
属性会引用ccNumber输入域,如果该输入域存在错误,将会把**<span>**元素的占位符内容替换为校验信息。
<h3>Here's how I'll pay...</h3>
<label th:for="ccNumber">Credit Card #:</label>
<input type="text" th:name="ccNumber" />
<span class="validationError"
th:if="${#fields.hasErrors('ccNumber')}" th:errors="*{ccNumber}">CC Num Error</span>
<br>