javaBean验证框架(6)—附加约束和组合约束

来源:互联网 发布:网络通信安全员证书 编辑:程序博客网 时间:2024/05/21 06:21

javaBean验证框架(6)—附加约束和组合约束

除了前文中列出规范中内置的约束外,Hibernate也附加了一些常用约束。

Hibernate附加约束

除了@ScriptAssert是类级约束,其他都是字段级约束。这里仅列举部分常用约束。

  • @CreditCardNumber(ignoreNonDigitCharacters=)

    根据Luhn算法(模10算法)验证输入合法性。目标是避免用于输入错误,不是信用卡的有效性。ignoreNonDigitCharacters默认为false,是否忽略非数字字符。

  • @Email

    检查字符串是否为合法的email地址。可选的参数regexpflags允许知道额外的验证表达式(包括表达式标志)。仅应用域字符串。

  • @Length

    检查验证值字符串序列长度是否在minmax(包括)之间。支持类型仅为CharSequence

  • @NotBlank

    检查验证值(注解的字符串序列)不null,且去除前后空格后长度大于0.与@NotEmpty的区别是,仅能应用在字符串验证,前后空格被忽略。

  • @NotEmpty

    检查验证值是否不null且空(empty)。支持类型包括CharSequence, Collection, Map and arrays

  • @Range

    检查注解值/验证值是否位于(包括)给定的最小值和最大值之间。支持类型包括BigDecimal, BigInteger, CharSequence, byte, short, int, long及相应的包装类。

  • @SafeHtml

    检查验证值是否包括潜在的恶意代码,如<script/>。需要jsoup库支持。

  • @ScriptAssert(lang=, script=, alias=, reportOn=)

    检查给定脚本是否能成功计算,需要JSR 223规范中定义的java script api 实现引擎支持。script可以规范支持的任何语言脚本。即使属于类级别验证,reportOn可以指定特定的属性作为报告违法约束信息路径。

  • @URL(protocol=, host=, port=, regexp=, flags=)

    根据 RFC2396规范验证是否为合法的URL.

    组合约束

    在一些复杂的场景,验证值需要多个约束同时使用,会让人感动过于复杂且啰嗦,如果相同的字段被其他类引用,则相应的约束需完全被拷贝至其他类,这违背了DRY原则(In software engineering, don’t repeat yourself (DRY) is a principle of software development aimed at reducing repetition of all kinds.)。
    为了解决这个问题,我们可以通过多个基本的约束组合创建更高级别的约束。示例代码如下:

@NotNull@Size(min = 2, max = 14)@CheckCase(CaseMode.UPPER)@Target({ METHOD, FIELD, ANNOTATION_TYPE })@Retention(RUNTIME)@Constraint(validatedBy = { })@Documented@ReportAsSingleViolationpublic @interface ValidLicensePlate {    String message() default "{org.hibernate.validator.referenceguide.chapter06." +            "constraintcomposition.ValidLicensePlate.message}";    Class<?>[] groups() default { };    Class<? extends Payload>[] payload() default { };}

创建组合约束,仅需要组合其他约束即可,如果组合约束需要验证器,通过@Constraint指定,反之,无需指定,如上代码所示:@Constraint(validatedBy = { })
注解@ReportAsSingleViolation使任何组合验证违反时,仅作为单一错误信息。使用和之前的使用方式一致。

总结

本文介绍了Hibernate内置的常用注解,以及如何定义组合注解,简化复杂业务验证。

原创粉丝点击