最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1.前提準(zhǔn)備條件

java注解了解http://m.fzitv.net/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í)體參數(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的詳細(xì)了解使用如下鏈接:

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項(xiàng)目的接口文檔"));
    }
    @Bean
    public GroupedOpenApi userAPI() {
        return GroupedOpenApi.builder().group("用戶信息管理").
                pathsToMatch("/user/**").
                build();
    }
}

2.實(shí)現(xiàn)要求

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

3.實(shí)現(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  添加注解校驗(yàn)類:

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.擴(kuò)展

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

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

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

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

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

相關(guān)文章

  • Storm框架整合springboot的方法

    Storm框架整合springboot的方法

    Storm框架中的每個(gè)Spout和Bolt都相當(dāng)于獨(dú)立的應(yīng)用,Strom在啟動spout和bolt時(shí)提供了一個(gè)open方法(spout)和prepare方法(bolt)。這篇文章主要介紹了Storm框架整合springboot的方法,需要的朋友可以參考下
    2018-11-11
  • jcrop 網(wǎng)頁截圖工具(插件)開發(fā)

    jcrop 網(wǎng)頁截圖工具(插件)開發(fā)

    今天給大家介紹一下一個(gè)web 中經(jīng)常會用到的截圖(如:頭像等)工具,需要的朋友可以了解下
    2012-11-11
  • Java scala模式匹配機(jī)制詳解

    Java scala模式匹配機(jī)制詳解

    模式匹配語法中,采用match關(guān)鍵字聲明,每個(gè)分支采用case關(guān)鍵字進(jìn)行聲明,當(dāng)需要匹配時(shí),會從第一個(gè)case分支開始,如果匹配成功,那么執(zhí)行對應(yīng)的邏輯代碼,如果匹配不成功,繼續(xù)執(zhí)行下一個(gè)分支進(jìn)行判斷
    2023-02-02
  • 解讀String字符串拼接的原理

    解讀String字符串拼接的原理

    這篇文章主要介紹了關(guān)于String字符串拼接的原理,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Mybatis-Plus最優(yōu)化持久層開發(fā)過程

    Mybatis-Plus最優(yōu)化持久層開發(fā)過程

    Mybatis-plus(簡稱MP)是一個(gè)Mybatis的增強(qiáng)工具,在mybatis的基礎(chǔ)上只做增強(qiáng)不做改變,提高效率,自動生成單表的CRUD功能,這篇文章主要介紹了Mybatis-Plus最優(yōu)化持久層開發(fā),需要的朋友可以參考下
    2024-07-07
  • Java探索之Feign入門使用詳解

    Java探索之Feign入門使用詳解

    這篇文章主要介紹了Java探索之Feign入門使用詳解,關(guān)于feign,我也是第一次遇到,于是在網(wǎng)上搜集了相關(guān)文章,這篇比較詳細(xì),介紹了其簡介,選擇feign的原因以及其他相關(guān)內(nèi)容,需要的朋友可以參考下。
    2017-10-10
  • MyBatis-Plus內(nèi)置接口方法的具體使用

    MyBatis-Plus內(nèi)置接口方法的具體使用

    java開發(fā)應(yīng)用程序與數(shù)據(jù)庫交互使用比較多的就是mybatisPlus接口,本文主要介紹了MyBatis-Plus內(nèi)置接口方法的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Eclipse可視化插件WindowBuilder的安裝方法

    Eclipse可視化插件WindowBuilder的安裝方法

    這篇文章主要介紹了Eclipse可視化插件WindowBuilder的安裝方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • JPA的多表復(fù)雜查詢的方法示例

    JPA的多表復(fù)雜查詢的方法示例

    這篇文章主要介紹了JPA的多表復(fù)雜查詢的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • java.lang.NullPointerException 如何處理空指針異常的實(shí)現(xiàn)

    java.lang.NullPointerException 如何處理空指針異常的實(shí)現(xiàn)

    這篇文章主要介紹了java.lang.NullPointerException 如何處理空指針異常的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評論

广平县| 新营市| 大丰市| 虎林市| 清新县| 明光市| 黔南| 丰宁| 建始县| 河东区| 敖汉旗| 高陵县| 邯郸市| 元谋县| 韶关市| 绥滨县| 出国| 织金县| 乌拉特前旗| 防城港市| 株洲市| 潞西市| 海丰县| 东辽县| 芜湖县| 福安市| 宜阳县| 宁明县| 五台县| 姜堰市| 内黄县| 玛多县| 开江县| 读书| 巴林左旗| 民勤县| 朝阳区| 综艺| 甘德县| 射洪县| 电白县|