1. 程式人生 > >SpringMVC自定義註解進行日期校驗

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<? 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";
}


}

相關推薦

SpringMVC定義註解進行日期

SpringMVC固定註解雖然很方便,但是類似兩個日期之間的這種校驗做不了,所以可以進行自定義註解的方式進行,下面以一個校驗日期為例 第一步:建立POPO /**  *   */ package iss.spmvc.self_ann; import java.util.Da

SpringMVC定義註解進行引數

在我的另一篇部落格中(SpringMVC),學習瞭如何使用Spring MVC結合Hibernate的校驗框架validation(它和hibernate沒有任何關係)對引數進行校驗。在實際專案中,引數的校驗邏輯可能比較複雜,這時我們可以自定義註解來實現引數校驗,下面是一個簡單的例子。 po

SpringMVC定義註解進行引數(以列舉值是否合法為例)

pom引入springMVC依賴,以springboot專案為例 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-

利用AOP和定義註解進行Token

因為公司業務需要每個訪問的方法校驗token,程式碼比較重複,所以就考慮利用Spring的AOP對每個方法進行token校驗。運用到了aop和自定義註解的知識。aop配置檔案 <!-- 自定義註解 --> <bean id="authTok

定義註解完成引數

在現在的專案開發中,經常會用到註解,比如Spring的@Autowired,SpringMVC的@Controller,@RequestMapping等等,大部分人只知道用,不知道這些註解的怎麼發揮作用。有沒有想過手動寫一個註解,完成引數校驗呢? 簡介 註解(

利用反射打造定義註解,自動或處理資料

    開發過程中,難免會對資料進行校驗或處理,難道每次都對不同的實體類的屬性挨個判斷是否符合規範或者對其進行特殊處理,程式設計師不應該這麼做。在這個時候,自定義註解就派上大用場了。比如自定義一個 @Email 註解,將其標註在只能存放email格式的屬性(private

springboot-No6 : 的引入 @Constraint和定義註解進行策略的設計模式淺談

之前寫的註解校驗的不足前面寫到如何使用自定義的註解進行校驗,@FieldInfo  主要做法是在註解中加入一些需要校驗的資訊然後呢 編寫解析註解的方法,然後我們寫統一的校驗策略來進行校驗。最後在統一的呼叫這個校驗演算法來達到校驗的目的但是上面這個過程呢我們並不知道使用該註解進

定義@interface及groups

groups @interface一、自定義annotation摘自:http://elim.iteye.com/blog/1812584@Target({ElementType.FIELD, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME)

elementUI定義驗證表單

1.表單名稱 ref=”idname” 2.表單繫結 :rules=rules 3.el-form-item prop屬性 4.驗證方法方法 提交方法: confirm(formName){         this.$refs[formName].val

springmvc 使用JSR-303進行資料

專案中,通常使用較多的是前端的校驗,比如頁面中js校驗以及form表單使用bootstrap校驗。然而對於安全要求較高點建議在服務端進行校驗。 服務端校驗: 控制層controller:校驗頁面請求的引數的合法性。在服務端控制層controller校驗

定義 jquery.validate.js 方法

部落格參考:http://blog.csdn.net/yangxiaovip/article/details/21550145  jquery.validate.js 是一個前端 form 表單校驗外掛,具體詳情可以百度一下。 jquery.validate.js 不僅

定義註解進行許可權攔截

什麼是註解? 用一個詞就可以描述註解,那就是元資料,即一種描述資料的資料。所以,可以說註解就是原始碼的元資料。比如,下面這段程式碼: @Override public String toString() { return "This is String Repre

Java筆記 #06# 定義簡易參數框架——EasyValidator

ide lse logger 需求 diy eve rdquo names page 索引 一、校驗效果演示 二、校驗器定義示例 定義一個最簡單的校驗器 正則校驗器 三、EasyValidator的實現 四、更好的應用姿勢—&md

AOP如何對定義註解進行切面程式設計

spring AOP需要的jar包<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt --><dependency>   <groupId>org.aspectj</groupId>   &

AngularJs的定義的正則指令--程式碼共享

1.對URL地址值的格式校驗 2.對純數字做校驗 3.使用方式 比如校驗http: <span style="font-size:14px;"><input type="tex

UEditor 定義圖片視訊尺寸

UEditor支援單圖、多圖以及視訊上傳,編輯器配置項支援檔案格式、檔案大小校驗,對於檔案寬高尺寸校驗暫不支援。這裡記錄一下自定義圖片、視訊尺寸校驗過程,內容核心主要是擴充套件校驗邏輯和增加自定義提示文字。 ### 單圖上傳 單圖上傳的邏輯在`ueditor.all.js`中,由`simpleUpload`

【Java】——定義註解對引數進行、spring掃描定義註解

前提    上篇部落格中詳細介紹自定義註解的使用,本文主要是對自定義註解的進一步深入。會使用CGLIb進行動態代理來完成對方法引數是否為空的判斷,以及再spring中如何掃描自定義註解自定義註解對方法引數為空校驗為什麼要用動態代理?因為Java的反射拿不到引數的相關資訊,對方

Java定義註解反射數據

sda new out 格式 是否 本地 imp 使用範圍 數據類型 package com.annotations.ecargo; import java.lang.annotation.ElementType; import java.lang.annotati

springboot定義註解時出現的異常

異常資訊: javax.validation.ConstraintDefinitionException: HV000074 原因: 在約束註釋中它是關於groups()和payload()缺失的,只需新增這兩行就可以了: Class<?>[] groups() de

Spring Boot系列-使用定義註解使用者是否登入

摘要: 記得今年年初剛開始面試的時候,被問的最多的就是你知道Spring的兩大核心嘛?那你說說什麼是AOP,什麼是IOC?我相信你可能也被問了很多次了。 1、到底是什麼是AOP? 所謂AOP也就是面向切面程式設計,能夠讓我們在不影響原有業務功能的前提下,橫切擴充套件新的功能。 記得今年