У меня проблемы с отображением ошибок поля для внутреннего класса. Проверка работает, так как ошибки обнаружены, но я не могу понять, как отобразить подробности ошибки на странице.
При тестировании я получаю журналы:
`ОШИБКА CarControllerImpl: 150 - здесь ошибка: ошибка поля в объекте 'carForm' в поле 'clientForm.phoneNumber': отклоненное значение [d]; коды [Size.carForm.clientForm.phoneNumber, Size.clientForm.phoneNumber, Size.phoneNumber, Size. java .lang.String, Size];
Таким образом, это подтвердит, что проверка работает как-то, а также тот факт, что форма не отправляется в случае ошибки, но я не могу отобразить детали в полях формы
Мне удалось заставить ее работать для проверки объектов напрямую, но есть ли что-то особенное для настройки внутренних объектов?
Спасибо за вашу помощь!
Вот мои объекты:
Объект CarForm:
@NotNull
@Size(min = 5, max = 12, message = "{registration.size}")
private String registration;
private int modelId;
@Valid
@NotNull
private ClientForm clientForm;
public CarForm() {
}
@Override
public String toString() {
return "CarForm{" +
"registration='" + registration + '\'' +
", modelId=" + modelId +
", clientForm=" + clientForm +
'}';
}
ClientForm Object:
public ClientForm() {
}
public ClientForm(@NotNull @Size(min = 3, max = 12, message = "should be between 3 and 12") String firstName, @NotNull @Size(min = 3, max = 12, message = "should be between 3 and 12") String lastName, @NotNull @Size(min = 8, max = 12, message = "should be between 8 and 12") String phoneNumber) {
this.firstName = firstName;
this.lastName = lastName;
this.phoneNumber = phoneNumber;
}
private int id;
@NotNull
@Size(min = 3, max = 12, message = "should be between 3 and 12")
private String firstName;
@NotNull
@Size(min = 3, max = 12, message = "should be between 3 and 12")
private String lastName;
@NotNull
@Size(min = 8, max = 12, message = "should be between 8 and 12")
private String phoneNumber;
@Override
public String toString() {
return "ClientForm{" +
"id=" + id +
", firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
", phoneNumber='" + phoneNumber + '\'' +
'}';
}
метод, вызываемый в контроллере:
@PostMapping(value = "/new")
@ResponseBody
public ModelAndView createNew(@Valid CarForm form, BindingResult bindingResult) throws Exception {
LOGGER.info("carForm received: " + form);
String token = helper.getConnectedToken();
if (form == null) form = new CarForm();
ModelAndView mv = checkAndAddConnectedDetails("operations/operations");
mv.addObject("registration", form.getRegistration());
SearchCarForm searchCarForm = new SearchCarForm();
searchCarForm.setRegistration(form.getRegistration());
mv.addObject("searchCarForm", new SearchCarForm());
if (bindingResult.hasErrors()) {
mv.addObject("message", "registration not found in the system");
mv.addObject("form", form);
mv.addObject("models", carModelManager.getAll(token));
LOGGER.error("error here");
return mv;
}
String feedback = "";
try {
feedback = carManager.addNewCar(token, form);
int id = Integer.parseInt(feedback);
return new ModelAndView("redirect:" + "/" + KEY_WORD + "/" + id);
} catch (NumberFormatException e) {
LOGGER.error("bashing: " + e.getMessage());
mv.addObject("form", form);
mv.addObject("models", carModelManager.getAll(token));
mv.addObject("error", feedback);
}
return mv;
}
Наконец, форма, которую я использую:
<form action="#" method="post" th:action="@{'/cars/new/'}" th:object="${form}">
<div class="form-group">
<label for="registration">Registration</label>
<input class="form-control" id="registration" name="registration" placeholder="Enter Registration"
readonly required="required" th:value="${registration}" type="text"/>
<div th:errors="*{registration}" th:if="${#fields.hasErrors('registration')}">Registration Error</div>
</div>
<div class="form-group">
<label for="modelId">Model</label>
<select id="modelId" name="modelId">
<option th:each="model : ${models}"
th:utext="${model.manufacturer.name+' '+model.name}"
th:value="${model.id}"/>
</select>
</div>
<div class="form-group">
<label for="clientForm.firstName">FirstName</label>
<input class="form-control" id="clientForm.firstName" name="clientForm.firstName" required="required"
th:value="${form.clientForm.firstName}"
type="text"/>
<div th:errors="*{clientForm.firstName}" th:if="${#fields.hasErrors('clientForm.firstName')}">FirstName Error</div>
</div>
<div class="form-group">
<label for="clientForm.lastName">LastName</label>
<input class="form-control" id="clientForm.lastName" name="clientForm.lastName" required="required"
th:value="${form.clientForm.lastName}"
type="text"/>
<div th:errors="*{clientForm.lastName}" th:if="${#fields.hasErrors('clientForm.lastName')}">LastName Error</div>
</div>
<div class="form-group">
<label for="clientForm.phoneNumber">PhoneNumber</label>
<input class="form-control" id="clientForm.phoneNumber" name="clientForm.phoneNumber" required="required"
th:value="${form.clientForm.phoneNumber}"
type="text"/>
<div th:errors="*{clientForm.phoneNumber}" th:if="${#fields.hasErrors('clientForm.phoneNumber')}">PhoneNumber Error</div>
</div>
<button class="btn btn-primary" type="submit">Submit</button>
</form>