扩展@NotEmpty以接受其他类

时间:2012-02-21 16:30:28

标签: hibernate validation spring-mvc hibernate-validator

我一直在尝试创建一个自定义验证器,因此我只能对特定的类使用@NotEmpty注释(在本例中为java.util.Calendar或CommandItem)。但我得到一个例外:

javax.validation.UnexpectedTypeException: No validator could be found for type: com.bla.DocumentCommandItem 

现在,我唯一能想到它为什么不起作用的是@NotEmpty注释本身声明了这一点:

@Constraint(validatedBy = { })

因此没有与Validator类直接关联。但是,它如何验证字符串和集合?

这是我的Validator类:

    public class DocumentNotEmptyExtender implements ConstraintValidator<NotEmpty,DocumentCommandItem> {

@Override
public void initialize( NotEmpty annotation ) {
}

@Override
public boolean isValid( DocumentCommandItem cmdItem, ConstraintValidatorContext context ) {
    if ( !StringUtils.hasText( cmdItem.getId() ) && (cmdItem.getFilename() == null || cmdItem.getFilename().isEmpty()) ) {
        return false;
    } else {
        return true;
    }
}

}

这甚至可能吗?

(作为旁注......当我制作我自己的类似注释时,我也收到了这个例外,但那个神秘地消失了。)

谢谢!

2 个答案:

答案 0 :(得分:3)

您必须在约束映射文件中注册验证器,如下所示:

<constraint-mappings
    xmlns="http://jboss.org/xml/ns/javax/validation/mapping"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation=
        "http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.0.xsd">

    <constraint-definition annotation="org.hibernate.validator.constraints.NotEmpty">
        <validated-by include-existing-validators="true">
            <value>com.foo.NotEmptyValidatorForDocumentCommandItem</value>
        </validated-by>
    </constraint-definition>
</constraint-mappings>

此映射文件必须在META-INF/validation.xml

中注册
<validation-config xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration">

    <constraint-mapping>/your-mapping.xml</constraint-mapping>
</validation-config>

您可以在Hibernate Validator reference guide和Bean验证specification中了解更多信息。

答案 1 :(得分:2)

@Gunnar

列出了上述解决方案

虽然引起了一些意想不到的事情......

NotEmpty基本上是@NotNull和@Size(min = 1)约束的包装器。所以没有实际的@NotEmpty实现。

为DocumentCommandItem制作我自己的@NotEmpty实现导致了两件事:

  • 验证器触发NotNull和Size验证(因此为Size-DocumentCommandItem组合找不到'找不到验证器'
  • 更重要的是,Size-String验证开始失败,因为它无法找到它的实现。

所以我对这个问题的最终解决方案是:

为DocumentCommandItem创建一个@Size实现 和 为String

创建一个@NotEmpty实现

(可能我还要为集合制作另一个@NotEmpty)