Как веб-приложение Spring Boot может проверить поле формы, обязательное для другого поля? - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть веб-приложение Spring Boot, в котором поля моего компонента, поддерживающего форму, помечены Проверка компонента аннотации (см. учебное пособие Baeldung или документы весной. -й ). Например, поля в компонентах Customer могут быть аннотированы следующим образом:

@NotBlank
@Pattern(regexp="[ \\.A-Za-z-]*")
private String firstName;

@DateTimeFormat(pattern="M/d/yyyy")
@NotNull
@Past
private Date DOB;

Что я хочу знать: (Как) Могу ли я реализовать комплексную проверку, которая просматривает несколько полей? Я имею в виду, используя эту структуру. Например, допустим, у меня есть поле Country и поле ZipCode, и я хочу, чтобы ZipCode было @NotBlank тогда и только тогда, когда Country равно "US", необязательно в противном случае.

В моем контроллере проверка очень элегантно запускается с использованием аннотации @Valid, и ошибки прикрепляются к объекту BindingResult. Вот так:

@PostMapping("customer/{id}")
public String updateCustomer( @PathVariable("id") Integer id,
                              @Valid @ModelAttribute("form") CustomerForm form, 
                              BindingResult bindingResult ) {
    if (bindingResult.hasErrors()) {
        return "customerview";
    }
    customerService.updateCustomer(form);
    return "redirect:/customer/"+id;
}

Я надеюсь найти способ написать этот условный валидатор таким образом, чтобы он тоже вызывался аннотацией @Valid и прикреплял сообщение об ошибке. в поле ZipCode в BindingResult. В идеале мне вообще не нужно менять код контроллера.

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Для такого рода вещей вам нужно использовать перекрестную валидацию. Пожалуйста, попробуйте:

Создать аннотацию:

package foo.bar;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {CustomerValidator.class})
public @interface CustomerValid {

    String message() default "{foo.bar.CustomerValid.message}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};

}

Создать пользовательский валидатор:

public class CustomerValidator implements ConstraintValidator<CustomerValid, Customer> {

    @Override
    public void initialize(CustomerValid constraint) {
    }

    @Override
    public boolean isValid(Customer customer, ConstraintValidatorContext context) {
        return !("US".equals(customer.getCountry() && "".equals(customer.getZipCode())));
    }
}

Аннотировать ваш класс:

@CustomerValid
public class Customer {
// body
}

Проверка этого класса будет обрабатываться в дополнение к существующим валидаторам полей.

1 голос
/ 09 апреля 2020

вы можете получить помощь в создании пользовательского класса валидатора, вам поможет следующая ссылка: https://www.baeldung.com/spring-mvc-custom-validator#custom -validation

...