一、JSR-303规范注解验证
1.验证表单类
public class Transaction {
// 产品编号
@NotNull
private Long productId;
// 用户编号
@NotNull
private Long userId;
// 交易日期
@Future
@DateTimeFormat(pattern = "yyyy-MM-dd") // 日期格式化转换
@NotNull
private Date date;
// 价格
@NotNull
@DecimalMin(value = "0.1") // 最小值0.1元
private Double price;
// 数量
@Min(1)
@Max(100)
@NotNull
private Integer quantity;
// 交易金额
@NotNull
@DecimalMax("500000.00")
@DecimalMin("1.00")
private Double amount;
// 邮件
@Pattern(// 正则式
regexp = "^([a-zA-Z0-9]*[-_]?[a-zA-Z0-9]+)*@"
+ "([a-zA-Z0-9]*[-_]?[a-zA-Z0-9]+)+[\\.][A-Za-z]{2,3}([\\.][A-Za-z]{2})?$",
// 自定义消息提示
message = "不符合邮件格式")
private String email;
// 备注
@Size(min = 0, max = 256) // 0到255个字符
private String note;
// getter/setter。。。
}
2.用控制器验证表单 @Valid
@RequestMapping("/annotation")
public ModelAndView annotationValidate(@Valid Transaction trans, Errors errors){
//是否存在错误
if(errors.hasErrors()){
//获取错误信息
List<FieldError> errorList = errors.getFieldErrors();
for (FieldError error : errorList) {
System.err.println("fied :" + error.getField() + "\t" + "msg:" + error.getDefaultMessage());
}
}
ModelAndView mv = new ModelAndView();
mv.setViewName("index");
return mv;
}
@RequestMapping("/annotation1")
public ModelAndView annotationValidate1(@Valid Transaction trans, BindingResult result){
//是否存在错误
if(result.hasErrors()){
//获取错误信息
List<ObjectError> errorList = result.getAllErrors();
for (ObjectError error : errorList) {
System.err.println("fied :" + error.getObjectName() + "\t" + "msg:" + error.getDefaultMessage());
}
}
ModelAndView mv = new ModelAndView();
mv.setViewName("index");
return mv;
}
二、验证器方式
1.验证器
/**
* 交易验证器
*/
public class TransactionValidator implements Validator{
/**
* 判断当前验证器是否用于检验Clazz类型的POJO
* @param clazz --POJO类型
* @return true启动检验,false则不再检验
*/
@Override
public boolean supports(Class<?> clazz) {
//判断验证是否为Transaction,如果是则进行判断[修改为:验证]
return Transaction.class.equals(clazz);
}
/**
* 检验POJO的合法性
* @param target POJO请求对象
* @param errors 错误信息
*/
@Override
public void validate(Object target, Errors errors) {
Transaction trans = (Transaction) target;
double dis = trans.getAmount() - (trans.getPrice() * trans.getQuantity());
//如果差额大于0.01,则认为业务错误
if (Math.abs(dis) > 0.01){
errors.rejectValue("amount", null, "交易金额和购买数量与价格不匹配");
}
}
}
2.使用验证器验证 @InitBinder
/*
将验证器和控制器捆绑在一起
*/
@InitBinder
public void initBinder(DataBinder binder){
//数据绑定器键入验证器
binder.setValidator(new TransactionValidator());
}
@RequestMapping("/annotation")
public ModelAndView annotationValidate(@Valid Transaction trans, Errors errors){
//是否存在错误
if(errors.hasErrors()){
//获取错误信息
List<FieldError> errorList = errors.getFieldErrors();
for (FieldError error : errorList) {
System.err.println("fied :" + error.getField() + "\t" + "msg:" + error.getDefaultMessage());
}
}
ModelAndView mv = new ModelAndView();
mv.setViewName("index");
return mv;
}
注意:
1.JSR 303注解方式和验证器方式不能同时使用。不过可以在使用JSR 303注解方式得到基本的检验信息后,再使用自己的方法进行验证。
2.
推荐文章:https://www.cnblogs.com/softidea/p/5839327.html