При десериализации полезной нагрузки JSON я хочу проверить номер телефона с помощью пользовательского валидатора. Этот валидатор должен знать, в какой стране находится клиент, чтобы правильно проанализировать номер телефона. Страна, которую я могу найти в заголовке http Accept-Language.
Проблема в том, как я могу предоставить пользовательскому валидатору эти дополнительные метаданные?
Я был уверен, что @Context внедрит HttpHeaders в PhoneNumberValidator, но это не работает:
@Context
private HttpHeaders mHttpHeaders;
Поле равно нулю.
Конечная точка API:
@Path("customer")
public class CustomerResource {
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response postCustomer(@Valid Customer pCustomer) {
return Response.ok(pCustomer).build();
}
}
POJO:
@Getter
@Setter
public class Customer {
@NotNull
private String firstName;
@ValidPhoneNumber
private String mobileNumber;
}
Интерфейс валидатора:
@Documented
@Retention(RUNTIME)
@Target({ TYPE, FIELD })
@Constraint(validatedBy = { PhoneNumberValidator.class })
public @interface ValidPhoneNumber {
String message() default "Phone number is not valid!";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Пользовательский валидатор:
@Slf4j
public class PhoneNumberValidator implements ConstraintValidator<ValidPhoneNumber, String> {
@Override
public boolean isValid(String vTelephone, ConstraintValidatorContext pContext) {
final PhoneNumberUtil vPhoneNumberUtil = PhoneNumberUtil.getInstance();
// TODO: Get the country in here somehow
final String vCountry = "GB";
try {
PhoneNumber vPhoneNumber = vPhoneNumberUtil.parse(vTelephone, vCountry);
if (!vPhoneNumberUtil.isValidNumber(vPhoneNumber)) {
log.error("Invalid {} phone number: {}", vCountry, vTelephone);
return false;
}
} catch (NumberParseException e) {
log.error("Error parsing {} as a phone number in {}: {}", vTelephone, vCountry, e.getMessage());
return false;
}
return true;
}
}