【问题标题】:Is there a uuid validator annotation?是否有 uuid 验证器注释?
【发布时间】:2016-09-16 04:40:45
【问题描述】:

我找不到用于验证 Java Web 应用程序中的输入参数的 @UUID(或类似)注释。

我已经看过了

  1. javax.validation.constraints
  2. org.hibernate.validator.constraints

【问题讨论】:

  • 如果你想在 @RestController 端点上进行验证,那么我认为更容易的是只期望 java.util.UUID 类型。如果无法将 HTTP 请求中的值映射到有效的 UUID,那么 spring 就拒绝该请求 :)

标签: java spring validation


【解决方案1】:

是的,自己搭建

@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 我希望验证 uuids 足够普遍,因此它已经包含在库中,我不需要重新发明轮子......
  • 如果违反约束,这将返回@Pattern 注释的错误消息,而不是自定义message()。要从外部返回自定义错误消息集,可以添加javax.validation.ReportAsSingleViolation metaannotation。
  • 如果 UUID 中存在单个大写字符,此正则表达式将使所有大写字母无效。
  • 当然,我只是指出以防有人复制粘贴然后想知道它为什么失败(以防失败):)
  • @dazito 这可以通过将Pattern.Flag.CASE_INSENSITIVE 标志传递给@Pattern 来轻松解决
【解决方案2】:

[更新]

@Jaiwo99 的解决方案不会显示指定的消息,而是显示来自@Pattern 的错误消息。要解决此问题,只需在@Jaiwo 的解决方案中添加@ReportAsSingleViolation 注释即可。 (@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}$";
}

【讨论】:

  • 至少有 3 种方法可以在组合约束中定义自己的消息(如在@Jaiwo99 回答中) * 使用静态默认消息设置 @Pattern 消息字段。 * 使用@javax.validation.OverridesAttribute 覆盖@Pattern 默认消息,并赋予使用约束条件进行上下文化的能力。 * @javax.validation.ReportAsSingleViolation 仅返回注释设置的消息。在这种特殊情况下,我会使用@ReportAsSingleViolationbeanvalidation.org/1.1/spec/…
【解决方案3】:

与@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 {};
}

【讨论】:

    猜你喜欢
    • 2014-10-05
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多