真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

springbootvalidator枚舉值校驗(yàn)功能的實(shí)現(xiàn)

本篇內(nèi)容介紹了“springboot validator枚舉值校驗(yàn)功能的實(shí)現(xiàn)”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

十載的湯原網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整湯原建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“湯原網(wǎng)站設(shè)計(jì)”,“湯原網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

一、前言

在spring項(xiàng)目中,校驗(yàn)參數(shù)功能使用hibernate validator是一個(gè)不錯(cuò)的選擇,我們的項(xiàng)目中也是使用它來(lái)進(jìn)行校驗(yàn)的,省去了很多難看的校驗(yàn)邏輯,使代碼的可讀性也大大增加,本章將帶你使用hibernate validator自定義注解功能實(shí)現(xiàn)一個(gè) 枚舉值校驗(yàn)的邏輯。

二、需求

我們先明確下我們的需求,在程序開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)有一個(gè)對(duì)象的屬性值只能出現(xiàn)在一組常量中的校驗(yàn)需求,例如:用戶性別字段gender只能等于MALE/FEMALE這兩個(gè)其中一個(gè)值,用戶賬號(hào)的狀態(tài)status只能等于:

NORMAL/DISABLED/DELETED其中一個(gè)等等,那么我們?cè)趺茨芨玫男r?yàn)這個(gè)參數(shù)呢?我們想擁有一個(gè)java注解,把它標(biāo)記在所要校驗(yàn)的字段上,當(dāng)開(kāi)啟hibernate validator校驗(yàn)時(shí),就可以校驗(yàn)其字段值是否正確。

三、實(shí)現(xiàn)方案

上面提到的一組常量值,我們第一反應(yīng)應(yīng)該是定義一個(gè)枚舉類,盡量不要放在一個(gè)統(tǒng)一的constants類下,這樣當(dāng)系統(tǒng)一旦龐大起來(lái),常量是很難維護(hù)和查找的,所以前期代碼也應(yīng)該有一些規(guī)范性約束,這里我們約定一組常量值時(shí)使用枚舉,并把該枚舉類放在對(duì)應(yīng)的類對(duì)象里(以上述所說(shuō)的用戶功能為例,我們應(yīng)該把GenerEnum、UserStatusEnum枚舉放在User.java下,方便查找)

這里我們定義一個(gè)叫EnumValue.java的注解類,其下有兩個(gè)主要參數(shù)一個(gè)是enumClass用于指定枚舉類,enumMethod指定要校驗(yàn)的方法,下面我們看代碼實(shí)現(xiàn)。

四、代碼實(shí)現(xiàn)

package com.zhuma.demo.annotation; import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method; import javax.validation.Constraint;import javax.validation.ConstraintValidator;import javax.validation.ConstraintValidatorContext;import javax.validation.Payload; import org.assertj.core.util.Strings; /** * @desc 校驗(yàn)枚舉值有效性 * * @author zhumaer * @since 10/17/2017 3:13 PM */@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy = EnumValue.Validator.class)public @interface EnumValue {   String message() default "{custom.value.invalid}";   Class[] groups() default {};   Class[] payload() default {};   Class> enumClass();   String enumMethod();   class Validator implements ConstraintValidator {     private Class> enumClass;    private String enumMethod;     @Override    public void initialize(EnumValue enumValue) {      enumMethod = enumValue.enumMethod();      enumClass = enumValue.enumClass();    }     @Override    public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) {      if (value == null) {        return Boolean.TRUE;      }       if (enumClass == null || enumMethod == null) {        return Boolean.TRUE;      }       Class valueClass = value.getClass();       try {        Method method = enumClass.getMethod(enumMethod, valueClass);        if (!Boolean.TYPE.equals(method.getReturnType()) && !Boolean.class.equals(method.getReturnType())) {          throw new RuntimeException(Strings.formatIfArgs("%s method return is not boolean type in the %s class", enumMethod, enumClass));        }         if(!Modifier.isStatic(method.getModifiers())) {          throw new RuntimeException(Strings.formatIfArgs("%s method is not static method in the %s class", enumMethod, enumClass));        }           Boolean result = (Boolean)method.invoke(null, value);        return result == null ? false : result;      } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {        throw new RuntimeException(e);      } catch (NoSuchMethodException | SecurityException e) {        throw new RuntimeException(Strings.formatIfArgs("This %s(%s) method does not exist in the %s", enumMethod, valueClass, enumClass), e);      }    }   }}

備注

1) 自定義注解需要實(shí)現(xiàn)ConstraintValidator校驗(yàn)類,這里我們定義一個(gè)叫Validator的類來(lái)實(shí)現(xiàn)它,同時(shí)實(shí)現(xiàn)它下面的兩個(gè)方法initialize、isValid,一個(gè)是初始化參數(shù)的方法,另一個(gè)就是校驗(yàn)邏輯的方法,本例子中我們將校驗(yàn)類定義在該注解內(nèi),用@Constraint(validatedBy = EnumValue.Validator.class)注解指定校驗(yàn)類,內(nèi)部邏輯實(shí)現(xiàn)比較簡(jiǎn)單就是使用了靜態(tài)類反射調(diào)用驗(yàn)證方法的方式。

2) 對(duì)于被校驗(yàn)的方法我們要求,它必須是返回值類型為Boolean或boolean,并且必須是一個(gè)靜態(tài)的方法,返回返回值為null時(shí)我們認(rèn)為是校驗(yàn)不通過(guò)的,按false邏輯走。

五、使用演示

校驗(yàn)的目標(biāo)對(duì)象類

package com.zhuma.demo.model.po; import java.io.Serializable;import java.util.Date; import javax.validation.constraints.Pattern; import org.hibernate.validator.constraints.Length;import org.hibernate.validator.constraints.NotBlank;import org.hibernate.validator.constraints.Range; import com.zhuma.demo.annotation.EnumValue;import com.zhuma.demo.validator.CreateGroup; /** * @desc 用戶PO  * @author zhumaer * @since 6/15/2017 2:48 PM */public class User implements Serializable {   private static final long serialVersionUID = 2594274431751408585L;   /**   * 用戶ID   */  private Long id;   /**   * 登錄密碼   */  @NotBlank  private String pwd;   /**   * 昵稱   */  @NotBlank  @Length(min=1, max=64)  private String nickname;   /**   * 頭像   */  private String img;   /**   * 電話   */  @Pattern(regexp = "^1[3-9]\\d{9}$")  private String phone;   /**   * 賬號(hào)狀態(tài)   */  @EnumValue(enumClass=UserStatusEnum.class, enumMethod="isValidName")  private String status;   /**   * 最新的登錄時(shí)間   */  private Date latestLoginTime;   /**   * 最新的登錄IP   */  private String latestLoginIp;   private Date createTime;  private Date updateTime;     /**   * 用戶狀態(tài)枚舉   */  public enum UserStatusEnum {    /**正常的*/    NORMAL,    /**禁用的*/    DISABLED,    /**已刪除的*/    DELETED;     /**     * 判斷參數(shù)合法性     */    public static boolean isValidName(String name) {      for (UserStatusEnum userStatusEnum : UserStatusEnum.values()) {        if (userStatusEnum.name().equals(name)) {          return true;        }      }      return false;    }  }     //省略getter、setter方法 } 

controller類

package com.zhuma.demo.web.user; import java.util.Date; import org.springframework.http.HttpStatus;import org.springframework.validation.annotation.Validated;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseStatus;import org.springframework.web.bind.annotation.RestController; import com.zhuma.demo.model.po.User; /** * @desc 用戶管理控制器 * * @author zhumaer * @since 6/20/2017 16:37 PM */@RestController@RequestMapping("/users")public class UserController {   @PostMapping  @ResponseStatus(HttpStatus.CREATED)  public User addUser(@Validated @RequestBody User user) {    user.setId(10000L);    user.setCreateTime(new Date());    return user;  } }

“springboot validator枚舉值校驗(yàn)功能的實(shí)現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!


網(wǎng)站題目:springbootvalidator枚舉值校驗(yàn)功能的實(shí)現(xiàn)
當(dāng)前網(wǎng)址:http://weahome.cn/article/pssops.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部