重構EnumUtils及自定義EnumValue註解自動校驗入參枚舉值

EnumUtils主要功能介紹

該簡單介紹可看筆者之前文章 java枚舉工具類(減少每個枚舉中重複的方法) 但以上該方式存在一些問題,例如枚舉值(value)可能爲 String也可能爲 Byte等等,不止只是 Integer類型,而且有些枚舉可能不需要枚舉名稱(name)屬性,只需要個枚舉值value屬性即可,以上最簡單的實現方式就不支持這些需求了,故通過拆分BaseEnum接口以及增加泛型來支持該要求。

具體實現

BaseEnum接口拆分爲ValueEnum以及NameValueEnum接口

ValueEnum接口定義
  
  
  
  1. /**

  2. * 最簡單的枚舉類,即只含value的枚舉(實現此接口可使用{@link mayfly.core.util.EnumUtils}中的方法)

  3. * @author meilin.huang

  4. * @version 1.0

  5. * @date 2019-04-22 10:10

  6. */

  7. public interface ValueEnum<T> {

  8. /**

  9. * 獲取枚舉值

  10. * @return 枚舉值

  11. */

  12. T getValue();

  13. }

NameValueEnum接口定義
  
  
  
  1. /**

  2. * 帶有枚舉值以及枚舉名稱的枚舉接口(可使用{@link mayfly.core.util.EnumUtils}中的方法)

  3. * @author meilin.huang

  4. * @version 1.0

  5. * @date 2019-03-22 11:04 AM

  6. */

  7. public interface NameValueEnum<T> extends ValueEnum<T> {

  8. /**

  9. * 獲取枚舉名稱

  10. * @return 枚舉名

  11. */

  12. String getName();

  13. }

EnumUtils重構

  
  
  
  1. /**

  2. * 枚舉常用工具類。<br/>

  3. * 使用該枚舉工具類需要指定的枚舉實現{@link ValueEnum} OR {@link NameValueEnum}接口

  4. * @author meilin.huang

  5. * @version 1.0

  6. * @date 2019-03-22 11:12 AM

  7. */

  8. public final class EnumUtils {


  9. /**

  10. * 判斷枚舉值是否存在於指定枚舉數組中

  11. * @param enums 枚舉數組

  12. * @param value 枚舉值

  13. * @return

  14. */

  15. public static <T> boolean isExist(ValueEnum<T>[] enums, T value) {

  16. if (value == null) {

  17. return false;

  18. }

  19. for (ValueEnum<T> e : enums) {

  20. if (value.equals(e.getValue())) {

  21. return true;

  22. }

  23. }

  24. return false;

  25. }


  26. /**

  27. * 根據枚舉值獲取其對應的名字

  28. * @param enums 枚舉列表

  29. * @param value 枚舉值

  30. * @return 枚舉名稱

  31. */

  32. public static <T> String getNameByValue(NameValueEnum<T>[] enums, T value) {

  33. if (value == null) {

  34. return "";

  35. }

  36. for (NameValueEnum e : enums) {

  37. if (value.equals(e.getValue())) {

  38. return e.getName();

  39. }

  40. }

  41. return "";

  42. }



  1. /**

  2. * 根據枚舉名稱獲取對應的枚舉值

  3. * @param enums 枚舉列表

  4. * @param name 枚舉名

  5. * @return 枚舉值

  6. */

  7. public static <T> T getValueByName(NameValueEnum<T>[] enums, String name) {

  8. if (StringUtils.isEmpty(name)) {

  9. return null;

  10. }

  11. for (NameValueEnum<T> e : enums) {

  12. if (name.equals(e.getName())) {

  13. return e.getValue();

  14. }

  15. }

  16. return null;

  17. }

  18. }

自定義@EnumValue註解對入參進行自動校驗

通過hibernate validator自定義參數校驗註解方式實現對入參爲枚舉類型的參數進行校驗

  
  
  
  1. /**

  2. * 枚舉值校驗,即值只能是指定枚舉類中的值

  3. * @author meilin.huang

  4. * @version 1.0

  5. * @date 2019-06-19 10:32 AM

  6. */

  7. @Target({ElementType.FIELD})

  8. @Retention(RetentionPolicy.RUNTIME)

  9. @Documented

  10. @Constraint(validatedBy = ValueEnum.ValueEnumValidator.class)

  11. public @interface ValueEnum {

  12. /**

  13. * 錯誤提示

  14. */

  15. String message() default "枚舉值錯誤";


  16. /**

  17. * 必須的屬性

  18. * 用於分組校驗

  19. */

  20. Class<?>[] groups() default {};



  21. Class<? extends Payload>[] payload() default {};



  22. /**

  23. * 枚舉類(必須實現{@link EnumValue}接口的枚舉)

  24. */

  25. Class<? extends Enum<? extends EnumValue>> enumClass();





  26. class ValueEnumValidator implements ConstraintValidator<ValueEnum, Object> {



  1. private Class<? extends Enum<? extends EnumValue>> enumClass;



  2. @Override

  3. public void initialize(ValueEnum valueEnum) {

  4. this.enumClass = valueEnum.enumClass();

  5. }



  6. @Override

  7. public boolean isValid(Object value, ConstraintValidatorContext context) {

  8. if (value == null) {

  9. return true;

  10. }

  11. // 轉換爲ValueEnum接口

  12. Enum<? extends EnumValue>[] enums = enumClass.getEnumConstants();

  13. EnumValue[] enumValues = new EnumValue[enums.length];

  14. for (int i = 0; i < enums.length; i++) {

  15. enumValues[i] = (EnumValue) enums[i];

  16. }

  17. return EnumUtils.isExist(enumValues, value)

  18. }

  19. }

  20. }

使用:
  
  
  
  1. enum StringEnum implements ValueEnum<String> {

  2. S1("01"), S2("02");



  1. private String value;


  1. StringEnum(String value) {

  2. this.value = value;

  3. }



  1. @Override

  2. public String getValue() {

  3. return this.value;

  4. }

  5. }



  1. enum IntegerEnum implements ValueEnum<Integer> {

  2. I1(1), I2(2);



  1. private Integer value;


  2. IntegerEnum(Integer value) {

  3. this.value = value;

  4. }




  1. @Override

  2. public Integer getValue() {

  3. return this.value;

  4. }

  5. }




  1. public class User{

  2. @NotBlank

  3. private String username;



  1. @EnumValue(StringEnum.class)

  2. private String sEnum;



  1. @EnumValue(IntegerEnum.class)

  2. private Integer iEnum;

  3. }


本文分享自微信公衆號 - Code基地(_mayfly_)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章