Java自定義注解對枚舉類型參數(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)文章
java實現(xiàn)操作系統(tǒng)中的最佳置換Optimal算法
這篇文章主要介紹了java實現(xiàn)操作系統(tǒng)中的最佳置換Optimal算法 ,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02把spring boot項目發(fā)布tomcat容器(包含發(fā)布到tomcat6的方法)
這篇文章主要介紹了把spring boot項目發(fā)布tomcat容器(包含發(fā)布到tomcat6的方法),然后在文章給大家提到了如何將Spring Boot項目打包部署到外部Tomcat,需要的朋友參考下吧2017-11-11