Java 未执行对方法参数的自定义批注

Java 未执行对方法参数的自定义批注,java,validation,annotations,Java,Validation,Annotations,我已经实现了一个自定义注释@Password,以对我的方法setPassword()的参数执行验证。注释的定义如下: // Password.java import java.lang.annotation.*; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.*; import javax.validation.*; @Target({M

我已经实现了一个自定义注释
@Password
,以对我的方法
setPassword()
的参数执行验证。注释的定义如下:

// Password.java
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

import javax.validation.*;

@Target({METHOD, FIELD, PARAMETER, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = PasswordValidator.class)
@Documented
public @interface Password {
    String message() default PasswordValidator.message;
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
基本思想是,我使用User类为用户存储哈希密码,但在设置哈希密码之前,我(希望)对未哈希密码(即
clearPassword
)进行验证

我遇到的问题是没有进行验证。在当前的实现中,它应该(根据我的理解)总是抛出一个
ConstraintViolationException
,因为
isValid()
总是返回false,但事实并非如此

我已通过调用(在应用程序的另一部分中)以下内容检查注释是否附加到方法参数:

Method method = user.getClass().getMethod("setPassword", new Class[] { String.class });
Annotation[][] parameterAnnotations = method.getParameterAnnotations();
System.out.println(method.getName() + ": " + parameterAnnotations[0][0]);
将生成以下输出:

setPassword:@utils.Password(message=error.invalid.password, payload=[], groups=[])
这告诉我注释正在应用于方法参数。但是我不明白为什么我在实际调用该方法时没有得到
ConstraintViolationException
。我也从来没有看到我添加到这些方法中作为检查它们是否被触发的输出“in initialize()”或“in isValid()”

作为另一个测试,我还向
User.class
中的成员变量
Password
添加了
@Password
注释。这会导致按预期抛出
ConstraintViolationException
,例如,当我尝试持久化
用户
对象时


有人能解释为什么方法参数上的注释不能正常工作吗?提前谢谢

我认为您的
密码注释中缺少此声明:

ConstraintTarget validationAppliesTo() default ConstraintTarget.IMPLICIT;
从文档中:

ValidationApplicationo在约束声明时用于阐明约束的目标(即带注释的元素、方法返回值或方法参数)

元素ValidationApplicationo必须仅针对泛型和交叉参数约束存在,在这种情况下它是必需的。如果违反这些规则,将引发ConstraintDefinitionException

ValidationApplicationTo参数的类型为ConstraintTarget。默认值必须为ConstraintTarget.IMPLICIT


它不会得到验证,因为hibernate validator在用户对象而不是方法setPassword上进行验证。如果要抛出该异常,必须获取ExecutableValidator实例,调用validateParameters方法,然后自己抛出ConstraintViolationException。

Hi,我添加了这个声明,现在我得到了一个相当混乱的异常:由:javax.validation.ConstraintDefinitionException:HV000159引起:只有具有泛型和跨参数验证器的约束必须定义一个属性validationApplicationTo(),但约束utils.Password必须定义。有什么想法吗?从表面上看,你有一个通用的和跨平台的约束。在这种情况下,您必须创建两个不同的验证器——一个用于泛型元素,另一个用于支持参数查找。检查此处的示例注释-,以及此处的示例参数验证器-@robguinness您是否发现了问题所在?我有一个和你完全一样的箱子,还有一个密码。
setPassword:@utils.Password(message=error.invalid.password, payload=[], groups=[])
ConstraintTarget validationAppliesTo() default ConstraintTarget.IMPLICIT;