欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java自定義注解對枚舉類型參數(shù)的校驗方法

 更新時間:2025年01月02日 12:06:56   作者:中文很快樂  
文章介紹了如何使用Java注解對枚舉類型參數(shù)進行校驗,通過自定義注解和注解校驗類實現(xiàn)參數(shù)的靈活性校驗,感興趣的朋友一起看看吧

1.前提準備條件

java注解了解http://www.dbjr.com.cn/program/287468xs5.htm

1.1 pom.xml文件依賴:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.8-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.knife4j</groupId>
    <artifactId>MyKnife4jDemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>MyKnife4jDemo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.github.xiaoymin</groupId>
                <artifactId>knife4j-dependencies</artifactId>
                <version>4.5.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>8.0.0.Final</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>nexus-maven</id>
            <name>nexus-maven</name>
            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
        </repository>
    </repositories>
</project>

1.2 枚舉類:

@Getter
@AllArgsConstructor
public enum RoleEnum {
    ADMIN("A", "Administrator"),
    USER("U", "User"),
    GUEST("G", "Guest");
    private final String code;
    private final String name;
    public static RoleEnum fromCode(String code) {
        for (RoleEnum role : RoleEnum.values()) {
            if (role.getCode().equals(code)) {
                return role;
            }
        }
        throw new IllegalArgumentException("Unknown code: " + code);
    }
}

1.3 controller接口:

@RequestMapping("/user")
@RestController
@Tag(name = "用戶控制類")
public class UserController {
    @PostMapping("/add")
    @Operation(description = "添加數(shù)據(jù)")
    public UserDTO validCreate(@RequestBody @Valid UserDTO userDTO) {
        return userDTO;
    }
}

1.4 實體參數(shù):

@NoArgsConstructor
@AllArgsConstructor
@Data
@Schema(description = "用戶新增--DTO")
public class UserDTO {
    @Schema(description = "用戶名")
    @NotBlank(message = "用戶名不能為空")
    private String userName;
    @Schema(description = "用戶編號")
    @NotBlank(message = "用戶編號不能為空")
    private String userNo;
    @Schema(description = "角色編碼")
    private String roleCode;
}

1.5 knife4j的配置

我是結(jié)合Knife4j來使用的,knife4j的詳細了解使用如下鏈接:

knife4j的配置如下:

@Configuration
@EnableKnife4j
public class Knife4jConfig {
    @Bean
    public OpenAPI openAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("knife4j-openapi3入門測試")
                        .version("1.0")
                        .description("knife4j-openapi3項目的接口文檔"));
    }
    @Bean
    public GroupedOpenApi userAPI() {
        return GroupedOpenApi.builder().group("用戶信息管理").
                pathsToMatch("/user/**").
                build();
    }
}

2.實現(xiàn)要求

希望對參數(shù)UserDTO中的字段roleCode進行自動校驗,校驗roleCode參數(shù)必須且只能是枚舉類中的編碼的其中一個。通過注解的方式實現(xiàn),最大程度上提高參數(shù)的靈活性。

3.實現(xiàn)步驟

3.1 自定義注解類:

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EnumCodeValidator.class)
public @interface ValidEnumCode {
    String message() default "must be any of enum {enumClass} codes";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    Class<? extends Enum<?>> enumClass();
}

3.2 使用注解:

在字段roleCode上添加自定義注解:

@NoArgsConstructor
@AllArgsConstructor
@Data
@Schema(description = "用戶新增--DTO")
public class UserDTO {
    @Schema(description = "用戶名")
    @NotBlank(message = "用戶名不能為空", groups = {Create.class})
    private String userName;
    @Schema(description = "用戶編號")
    @NotBlank(message = "用戶編號不能為空", groups = {Update.class})
    private String userNo;
    @Schema(description = "角色編碼")
    @ValidEnumCode(enumClass = RoleEnum.class,message = "Role code must be any of {codes} from {enumClass}")
    private String roleCode;
}

3.3  添加注解校驗類:

public class EnumCodeValidator implements ConstraintValidator<ValidEnumCode, CharSequence> {
    private List<String> acceptedCodes;
    private String messageTemplate;
    private String enumClassName;
    @Override
    public void initialize(ValidEnumCode constraintAnnotation) {
        Class<? extends Enum<?>> enumClass = constraintAnnotation.enumClass();
        acceptedCodes = Stream.of(enumClass.getEnumConstants())
                .map(this::getEnumCode)
                .collect(Collectors.toList());
        messageTemplate = constraintAnnotation.message();
        enumClassName = enumClass.getSimpleName();
    }
    private String getEnumCode(Enum<?> enumConstant) {
        try {
            Method getCodeMethod = enumConstant.getClass().getMethod("getCode");
            return (String) getCodeMethod.invoke(enumConstant);
        } catch (Exception e) {
            throw new RuntimeException("Failed to get enum code", e);
        }
    }
    @Override
    public boolean isValid(CharSequence value, ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        }
        if (!acceptedCodes.contains(value.toString())) {
            String message = messageTemplate.replace("{enumClass}", enumClassName)
                    .replace("{codes}", String.join(", ", acceptedCodes));
            context.disableDefaultConstraintViolation();
            context.buildConstraintViolationWithTemplate(message)
                    .addConstraintViolation();
            return false;
        }
        return true;
    }
}

3.4 啟動測試

若我傳的參數(shù)如下則不通過:

后端控制臺也會打印出如下提示:

若我按要求傳參數(shù),就能得到正確的結(jié)果:

4.擴展

根據(jù)我在pom中引入的參數(shù)校驗依賴:hibernate-validator,

找到擴展依賴中的如下兩個依賴,查看其他的可用的參數(shù)校驗注解:

打開之后,根據(jù)下述提示找到可使用的注解,自己可測試使用哦

嗯,完結(jié)了,希望大家能多多對我提出點建議。

到此這篇關(guān)于Java自定義注解對枚舉類型參數(shù)的校驗的文章就介紹到這了,更多相關(guān)java枚舉類型參數(shù)校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JPA save()方法將字段更新為null的解決方案

    JPA save()方法將字段更新為null的解決方案

    這篇文章主要介紹了JPA save()方法將字段更新為null的解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • Kotlin內(nèi)存陷阱inline使用技巧示例詳解

    Kotlin內(nèi)存陷阱inline使用技巧示例詳解

    這篇文章主要為大家介紹了Kotlin內(nèi)存陷阱inline使用技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • java實現(xiàn)操作系統(tǒng)中的最佳置換Optimal算法

    java實現(xiàn)操作系統(tǒng)中的最佳置換Optimal算法

    這篇文章主要介紹了java實現(xiàn)操作系統(tǒng)中的最佳置換Optimal算法 ,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • springboot下添加日志模塊和設置日志文件輸出的方法

    springboot下添加日志模塊和設置日志文件輸出的方法

    日志的使用將通過SLF4J來使用,SLF4J是一個為Java應用提供簡單日志記錄的接口,在Spring框架中,SLF4J常常用于處理框架本身以及應用程序的日志記錄,本文給大家介紹springboot下添加日志模塊和設置日志文件輸出的相關(guān)知識,感興趣的朋友一起看看吧
    2023-12-12
  • Springboot整合AOP和redis的示例詳解

    Springboot整合AOP和redis的示例詳解

    本文主要介紹了Springboot整合AOP和Redis的詳細過程,包括AOP的依賴引入和默認配置屬性,日志切面格式以及Redis的自動配置和連接池使用,總結(jié)了在多線程環(huán)境下,選擇合適的連接方式和客戶端是非常重要,感興趣的朋友一起看看吧
    2024-11-11
  • 一文掌握Java中的JWT

    一文掌握Java中的JWT

    這篇文章主要介紹了Java中的JWT,JWT的本質(zhì)就是一個字符串,它是將用戶信息保存到一個Json字符串中,然后進行編碼后得到一個JWT?token,對JWT相關(guān)知識感興趣的朋友一起看看吧
    2022-06-06
  • java并發(fā)編程Lock鎖可重入性與公平性分析

    java并發(fā)編程Lock鎖可重入性與公平性分析

    這篇文章主要為大家介紹了java并發(fā)編程Lock鎖可重入性與公平性分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • 使用java為pdf添加書簽的方法(pdf書簽制作)

    使用java為pdf添加書簽的方法(pdf書簽制作)

    下載一些pdf格式的電子書沒有書簽,用JAVA寫了一個小工具,將特定格式的文本解析成為書簽,然后保存到pdf格式中
    2014-02-02
  • java實現(xiàn)超市商品庫存管理平臺

    java實現(xiàn)超市商品庫存管理平臺

    這篇文章主要為大家詳細介紹了java實現(xiàn)超市商品庫存管理平臺,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 把spring boot項目發(fā)布tomcat容器(包含發(fā)布到tomcat6的方法)

    把spring boot項目發(fā)布tomcat容器(包含發(fā)布到tomcat6的方法)

    這篇文章主要介紹了把spring boot項目發(fā)布tomcat容器(包含發(fā)布到tomcat6的方法),然后在文章給大家提到了如何將Spring Boot項目打包部署到外部Tomcat,需要的朋友參考下吧
    2017-11-11

最新評論