spring 在javax.validation.ConstraintValidator中只使用带注解的参数

niwlg2el  于 2023-11-16  发布在  Spring
关注(0)|答案(1)|浏览(93)

我有一个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[]对象?
w51jfk4q

w51jfk4q1#

最终,我发现了一种从上下文中获取参数名的能力。它们的顺序与Objects[]中的值严格相同。

public boolean isValid(Object[] objects, ConstraintValidatorContext context) {
        Integer testValue;
        String id;

        try {
            List<String> methodParameterNames = ((CrossParameterConstraintValidatorContextImpl) context).getMethodParameterNames();
            int idIdndex = methodParameterNames.indexOf(idParameterName);
            int periodDaysIndex = methodParameterNames.indexOf(periodDaysParameterName);
            testValue = (Integer) objects[periodDaysIndex];
            id = validateTenantId((String) objects[idIndex]);
        } catch (Exception e) {
            return false;
        }
        // validator logic
}

字符串
P.S.不喜欢W/O评论的家伙,你可以操你自己:)

相关问题