Пользовательская аннотация валидатора в Spring MVC


Я создал пользовательскую проверку для <form:select>, которая заполняет список стран.


Customer.jsp

    Country: 
    <form:select path="country" items="${countries}" />
    <form:errors path="country" cssClass="error"/>

FomeController.java

    @RequestMapping(value = "/customer", method = RequestMethod.POST)
    public String prosCustomer(Model model,
            @Valid @ModelAttribute("defaultcustomer") Customer customer,
            BindingResult result
    ) {
        CustomerValidator vali = new CustomerValidator();
        vali.validate(customer, result);
        if (result.hasErrors()) {
            return "form/customer";
        } else {
           ...
        }
    }

CustomValidator.java

public class CustomerValidator implements Validator {

    @Override
    public boolean supports(Class<?> type) {
        return Customer.class.equals(type);
    }

    @Override
    public void validate(Object target, Errors errors) {
        Customer customer = (Customer) target;
       int countyid=Integer.parseInt(customer.getCountry().getCountry());
        if (countyid==0) {
             errors.rejectValue("country",  "This value is cannot be empty");
        }
    }
}

Клиент.java

   private Country country;

Проверка работает отлично. Но проблема в том, что метод проверки также прикрепил другое сообщение. validation view
Подскажите, пожалуйста, как исправить это сообщение.


person Dil.    schedule 09.01.2019    source источник


Ответы (1)


Можете ли вы попробовать изменить реализацию Validator в контроллере, как описано в https://stackoverflow.com/a/53371025/10232467.

Таким образом, ваш метод контроллера может быть похож на

@Autowired
CustomerValidator customerValidator;


@InitBinder("defaultcustomer")
protected void initDefaultCustomerBinder(WebDataBinder binder) {
binder.addValidators(customerValidator);
}

@PostMapping("/customer")
public String prosCustomer(@Validated Customer defaultcustomer, BindingResult bindingResult) {
// if error 
if (bindingResult.hasErrors()) {
    return "form/customer";
}
// if no error
return "redirect:/sucess";
}

Кроме того, имя модели формы в jsp должно быть определено как «defaultcustomer».

РЕДАКТИРОВАТЬ :

Я пропустил вложенный объект Country в классе Customer. В валидаторе заменить

errors.rejectValue("country",  "This value is cannot be empty");

с

errors.rejectValue("defaultcustomer.country",  "This value is cannot be empty");

Также обнаружено, что класс Customer должен быть изменен как

@Valid
private Country country;
person Defaulter    schedule 09.01.2019
comment
Можете ли вы поделиться полным кодом jsp, отображает ли он defaultcustomer.country, даже если форма не отправлена? - person Defaulter; 09.01.2019