У меня есть условие, когда я хочу, чтобы некоторые проверки были применены условно на основе другого значения поля. Я создал групповые ограничения для этого, но я не уверен, как использовать эти группы ограничений в пользовательском классе валидатора. Мои группы ограничений работают нормально для предопределенных проверок, таких как NOTNULL, но я хочу, чтобы мой настраиваемый валидатор также вызывался только тогда, когда указанная группа применима.
Я проверил документацию API, но не смог найти какой-либо способ получения текущей применимой группы ограничений.
@RestController
@Slf4j
public class QuoteDetailController {
private QuoteDetailService applicationService;
@Autowired
public QuoteDetailController(QuoteDetailService applicationService) {
this.applicationService = applicationService;
}
@PostMapping(value = "/quote/retail")
public ResponseEntity<String> saveQuoteForRetail(
@RequestBody @Validated(value = RetailCustomerConstraintGroup.class) QuoteDetail quoteDetail) {
log.info("Request for saveQuote in controller : {}", quoteDetail);
String response = applicationService.saveQuote(quoteDetail);
log.info(response);
return ResponseEntity.ok(response);
}
@PostMapping(value = "/quote/corporate")
public ResponseEntity<String> saveQuoteForCorporate(
@RequestBody @Validated(value = CorporateCustomerConstraintGroup.class) QuoteDetail quoteDetail) {
log.info("Request for saveQuote in controller : {}", quoteDetail);
String response = applicationService.saveQuote(quoteDetail);
log.info(response);
return ResponseEntity.ok(response);
}
}
public class QuoteDetail {
private Long Id;
private Double price;
private String description;
private String customerType;
@ValidCustomer(groups= {RetailCustomerConstraintGroup.class,CorporateCustomerConstraintGroup.class})
private CustomerDetails customerDetails;
@NotNull(groups= CorporateCustomerConstraintGroup.class)
private ContactPersonDetail contactPersonDetail;
}
@Documented
@Constraint(validatedBy = {CustomerDetailValidator.class})
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidCustomer {
public abstract String message() default "Invalid value.";
public abstract Class<?>[] groups() default {};
public abstract Class<? extends Payload>[] payload() default {};
public abstract boolean ignoreCase() default true;
}
public class CustomerDetailValidator implements ConstraintValidator<ValidCustomer, CustomerDetails> {
@Override
public boolean isValid(CustomerDetails value, ConstraintValidatorContext context) {
// Need some way here to fetch the current group applied on the QuoteDetail bean as I want to ensure
// this validation is only invoked for specified groups.
// Lets suppose there was 1 more endpoint /international with validation group InternationalCustomers, I don't want this validator to be called in that case. How can I do this.
return true;
}
}