Как получить текущую группу ограничений проверки, примененную к полю в весеннем настраиваемом валидаторе? - PullRequest
0 голосов
/ 14 января 2019

У меня есть условие, когда я хочу, чтобы некоторые проверки были применены условно на основе другого значения поля. Я создал групповые ограничения для этого, но я не уверен, как использовать эти группы ограничений в пользовательском классе валидатора. Мои группы ограничений работают нормально для предопределенных проверок, таких как 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;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...