我一直在尝试创建一个自定义验证器,因此我只能对特定的类使用@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;
}
}
}
这甚至可能吗?
(作为旁注......当我制作我自己的类似注释时,我也收到了这个例外,但那个神秘地消失了。)
谢谢!
答案 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实现导致了两件事:
所以我对这个问题的最终解决方案是:
为DocumentCommandItem创建一个@Size实现 和 为String
创建一个@NotEmpty实现(可能我还要为集合制作另一个@NotEmpty)