对于当前项目,我们使用JSR-303注释来验证我们的接口参数。
我需要为日期创建自定义注释,因为默认@Past和@Before也会考虑时间。
这是我的注释的定义:
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { NotInFutureValidator.class })
/**
* Annotated element must be a date before tomorrow, compared to the system's date
*/
public @interface NotInFuture {
String message() default "{be.credoc.contractRegistration.interface_v2.validation.pastignoretime}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
验证器的实现非常简单。
我们的Web应用程序是用GWT编写的,它使用了gwt-validation。这允许我们通过相同的注释在客户端验证我们的参数。
但是,当我使用自定义注释对我的参数进行注释时,我希望通过使用GwtValidatorFactory来验证它,当输入日期是将来时,它不会给我一个错误。
是否有人在GWT应用程序中体验过定义和使用自己的注释,并且可以看到我缺少的内容?
提前致谢
答案 0 :(得分:1)
您可以尝试通过提供如下所示的XML约束映射来重新定义现有@Past
和@Future
注释的验证器,而不是创建新注释:
<?xml version="1.0" ?>
<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="javax.validation.constraints.Past">
<validated-by include-existing-validators="false">
<value>x.y.z.NotInFutureValidator</value>
</validated-by>
</constraint-definition>
</constraint-mappings>
此映射必须在配置文件META-INF/validation.xml
中注册,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<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 validation-configuration-1.0.xsd">
<constraint-mapping>META-INF/validation/custom-constraints.xml</constraint-mapping>
</validation-config>
您可以在Bean Validation specification和Hibernate Validator reference guide中了解有关现有约束的自定义验证器的更多信息。
答案 1 :(得分:0)
显然我们为每个自定义注释编写了自己的JavaScript实现,因此本例中的解决方案是编写这样的实现。