我有一个ConstraintValidator,它需要根据另一个参数(id)验证输入参数(periodDays)。为此,我实现了基于ElementType.METHOD的验证逻辑。我的接口:
@Target({ElementType.METHOD, ElementType.TYPE})
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { DaysPeriodValidator.class })
public @interface ValidDaysPeriod {
// ...
字符串
验证器:
@SupportedValidationTarget(ValidationTarget.PARAMETERS)
public class DaysPeriodValidator implements ConstraintValidator<ValidDaysPeriod, Object[]> {
@Override
public boolean isValid(Object[] objects, ConstraintValidatorContext context) {
Integer testValue;
String id;
try {
testValue = (Integer) objects[1];
id = validateTenantId((String) objects[0]);
} catch (Exception e) {
return false;
}
// ... validation logic
return valid;
}
}
型
它适用于控制器方法,如
@ValidDaysPeriod
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public MyData getMyData(@Nullable String id,
@NotNull Integer periodDays) {
型
其中参数的顺序是期望的。但是如果有人写了一个新的端点,其中参数不是这样的顺序,我也不能免疫。Validator在无名的Object[]对象中获取它们,如果有更多的String或String参数,我不能识别其中的id和periodDays。
是否有方法在Validator中检测这些参数?例如:
- 添加特定注解
- 将参数名和值传递给Object[]对象?
1条答案
按热度按时间w51jfk4q1#
最终,我发现了一种从上下文中获取参数名的能力。它们的顺序与Objects[]中的值严格相同。
字符串
P.S.不喜欢W/O评论的家伙,你可以操你自己:)