Я пытаюсь создать валидатор для двух параметров, входящих в адрес конечной точки запроса ниже:
@PutMapping("/{region}/organizations/{organizationId}")
public void updateOrganization(
@PathVariable("region") String region,
@PathVariable("organizationId") Long organizationId)
Увы, интерфейс ConstraintValidator позволяет мне использовать один параметр:
public interface ConstraintValidator<A extends Annotation,T>
Есть ли способ получить оба параметра в классе валидатора, чтобы я мог проверить, находится ли запрошенная организация в заданном регионе, не заставляя интерфейсную сторону передавать объект в мой контроллер, и если да, как я могу это сделать?
Я думал о том, чтобы перехватить параметры, прежде чем передать их в валидатор и создать какой-то пользовательский объект только для проверки. Вместо этого он будет использоваться в классе валидатора, но любой вариант будет хорош, если он работает и достаточно прост.
Класс контроллера:
@Validated
@RestController
@RequiredArgsConstructor
public class OrganizationController {
@PutMapping("/{region}/organizations/{organizationId}")
public void updateOrganization(
@PathVariable("region") String region,
@PathVariable("organizationId") Long organizationId) {
// TODO
}
}
Аннотация:
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = OrganizationIdValidator.class)
public @interface OrganizationId {
String message() default "Given organization does not belong to requested region";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
И валидатор:
public class OrganizationIdValidator implements ConstraintValidator<OrganizationId, SomeObjectToPassHere> {
@Override
public boolean isValid(SomeObjectToPassHere value, ConstraintValidatorContext context) {
//TODO
}
}