SpringMVC固定注解虽然很方便,但是类似两个日期之间的这种校验做不了,所以可以进行自定义注解的方式进行,下面以一个校验日期为例
第一步:建立POPO
/**
*
*/
package iss.spmvc.self_ann;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
/**
* 作者:南航
*2017年11月27日,下午2:07:27
*/
public class SelfAnnPOJO {
private Integer userId;
@MyDate(message="第1个日期只能在[1990-9-1,1999-8-30]")
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date dt1;
@MyDate(minDate="1989-9-2",maxDate="1999-9-3", message="第2个日期只能在[1989-9-2,1999-9-3]")
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date dt2;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public Date getDt1() {
return dt1;
}
public void setDt1(Date dt1) {
this.dt1 = dt1;
}
public Date getDt2() {
return dt2;
}
public void setDt2(Date dt2) {
this.dt2 = dt2;
}
}
第二步:创建注解类
package iss.spmvc.self_ann;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
/**
*
* 作者:南航
*2017年11月27日,下午1:50:51
@interface,这个类称为:annotation类,即注解类
*/
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=SelfDateAnnValidator.class)
public @interface MyDate {
String minDate() default "1990-9-1"; //设最小日期的缺省值
String maxDate() default "1999-8-30"; //设最大日期的 缺省值
String pattern() default "yyyy-MM-dd";
String message();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
第三步:注解实现类
/**
*
*/
package iss.spmvc.self_ann;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import qh.Log;
/**
* 作者:南航
*2017年11月27日,下午1:54:06
*/
public class SelfDateAnnValidator implements ConstraintValidator<MyDate,Date>{
private MyDate mydt;
@Override
public void initialize(MyDate mydt) {
this.mydt=mydt; //取得类属性的注解送入
}
/**
* Date dt,是当前动态录入参数
*/
@Override
public boolean isValid(Date dt, ConstraintValidatorContext ctx) {
String pattern=mydt.pattern();
SimpleDateFormat df=new SimpleDateFormat(pattern);
Date minDt;
Date maxDt;
boolean isOK=true;
try {
String msg;
if(dt==null){
isOK=false;
msg=mydt.message()+",当前日期为空";
}
else{
msg=mydt.message()+",当前日期为="+dt.toLocaleString();
String strMinDt=mydt.minDate();
String strMaxDt=mydt.maxDate();
minDt=df.parse(strMinDt);
maxDt=df.parse(strMaxDt);
int check1=dt.compareTo(minDt); //返回3个值之一,1:后者大于前者;-1:后者小于前者;0:两个相同
int check2=dt.compareTo(maxDt);
Log.getLog().info("check1="+check1+",minDt="+minDt.toLocaleString());
Log.getLog().info("check2="+check2+",maxDt="+maxDt.toLocaleString());
if(check1==-1 || check2==1 )
isOK=false;
}
Log.getLog().info("isOK="+isOK);
if(isOK==false) { //isOK为false表明有错误提示输出
ctx.disableDefaultConstraintViolation();
ctx.buildConstraintViolationWithTemplate(msg).addConstraintViolation();
}
} catch (Exception e) {
e.printStackTrace();
}
//返回false时,有录入错误提示输出,否则无
return isOK;
}
}
第四步:测试类
/**
*
*/
package iss.spmvc.self_ann;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import qh.Log;
/**
* 作者:南航
*2017年11月27日,下午2:13:15
*/
@Controller
@RequestMapping("/valid2")
public class TestSelfAnnController {
public TestSelfAnnController() {
Log.getLog().info("TestSelfAnnController?");
}
@RequestMapping("/open.html")
ModelAndView open(){
SelfAnnPOJO pojo=new SelfAnnPOJO();
ModelAndView mv=new ModelAndView("/user/TestValid2", "po", pojo);
return mv;
}
@RequestMapping("/save.html")
String save(@Validated @ModelAttribute("po") SelfAnnPOJO pojo,BindingResult bind){
// String save(@Valid @ModelAttribute("po") SelfAnnPOJO pojo,BindingResult bind){
int ecount=bind.getErrorCount();
Log.getLog().info(
"出错个数="+ecount+
",="+pojo.getUserId()+
",="+pojo.getDt1()+
",="+pojo.getDt2()
);
return "/user/TestValid2";
}
}