我在java web应用程序中找不到用于验证输入参数的@UUID
(或类似)注释。
到目前为止,我已经在中查看了
- javax.validation.constraints
- org.hibernate.validator.constraints
是的,自己构建
@Target(ElementType.FIELD)
@Constraint(validatedBy={})
@Retention(RUNTIME)
@Pattern(regexp="^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$")
public @interface UUID {
String message() default "{invalid.uuid}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
[更新]
@Jaiwo99的解决方案不会显示指定的消息,而是显示@Pattern
的错误消息。要解决这个问题,只需将@ReportAsSingleViolation
注释添加到@Jaiwo的解决方案中即可。(@LudovicRonsin在对这个答案的评论中指出了这一点,@helospark在对@Jaiwo99的回答的评论中也指出了这。)
@Target(ElementType.FIELD)
@Constraint(validatedBy={})
@Retention(RUNTIME)
@Pattern(regexp="^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$")
@ReportAsSingleViolation
public @interface UUID {
String message() default "{invalid.uuid}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
[旧答案]
Jaiwo99的解决方案有效,但我无法从外部设置自定义消息(它被@Pattern
的消息覆盖)。如果你需要,我建议你简单地使用这样的东西:
@Pattern(regexp = SomeUtilClass.UUID_PATTERN, message = "TokenFormatError")
private String token;
你可以把模式放在一些静态的最终字段中以避免重复:
public static SomeUtilClass {
public static final String UUID_PATTERN = "^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$";
}
在提出这个问题时,没有一个,但同时它已经从org.hibernate开始添加。validator:hibernate validator:8.0.最终
https://docs.jboss.org/hibernate/stable/validator/api/org/hibernate/validator/constraints/UUID.html
与@Jaiwo99的答案相同,但正如@mrzli所指出的,模式的消息覆盖了任何自定义消息。如果您想要自定义消息,在@Pattern中使用消息将修复此问题。
@Target(ElementType.FIELD)
@Constraint(validatedBy={})
@Retention(RUNTIME)
@Pattern(regexp="^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$", message = "Not a valid UUID")
public @interface UUID {
String message() default "{invalid.uuid}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}