SpringMVC自定义注解进行日期校验

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[] 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{
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";
}


}


你可能感兴趣的:(spring)