当前位置: 代码网 > it编程>编程语言>Java > Java自定义注解对枚举类型参数的校验方法

Java自定义注解对枚举类型参数的校验方法

2025年01月03日 Java 我要评论
1.前提准备条件java注解了解1.1 pom.xml文件依赖:<?xml version="1.0" encoding="utf-8"?><project xmlns="http:

1.前提准备条件

java注解了解

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 = "添加数据")
    public userdto validcreate(@requestbody @valid userdto userdto) {
        return userdto;
    }
}

1.4 实体参数:

@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的配置

我是结合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.实现要求

希望对参数userdto中的字段rolecode进行自动校验,校验rolecode参数必须且只能是枚举类中的编码的其中一个。通过注解的方式实现,最大程度上提高参数的灵活性。

3.实现步骤

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 启动测试

若我传的参数如下则不通过:

后端控制台也会打印出如下提示:

若我按要求传参数,就能得到正确的结果:

4.扩展

根据我在pom中引入的参数校验依赖:hibernate-validator,

找到扩展依赖中的如下两个依赖,查看其他的可用的参数校验注解:

打开之后,根据下述提示找到可使用的注解,自己可测试使用哦

嗯,完结了,希望大家能多多对我提出点建议。

到此这篇关于java自定义注解对枚举类型参数的校验的文章就介绍到这了,更多相关java枚举类型参数校验内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com