Ошибка получения ошибки проверки для внутреннего объекта с Thymeleaf - PullRequest
0 голосов
/ 24 марта 2020

У меня проблемы с отображением ошибок поля для внутреннего класса. Проверка работает, так как ошибки обнаружены, но я не могу понять, как отобразить подробности ошибки на странице.

При тестировании я получаю журналы:

`ОШИБКА 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>

1 Ответ

0 голосов
/ 25 марта 2020

Я наконец-то заставил его работать, используя детали из этого post

Я использовал th: object, чтобы указать объект внутри формы, и изменил его так:

<label>Client</label>
    <div th:object="${carForm.client}">
        <div class="form-group">

            <label>FirstName</label>
            <input class="form-control" th:field="*{firstName}" required="required"
                   th:value="${carForm.client.firstName}"
                   type="text"/>
            <div th:errors="*{firstName}" th:if="${#fields.hasErrors('firstName')}">FirstName Error</div>

        </div>
        <div class="form-group">
            <label>LastName</label>
            <input class="form-control" th:field="*{lastName}" required="required"
                   th:value="${carForm.client.lastName}"
                   type="text"/>
            <div th:errors="*{lastName}" th:if="${#fields.hasErrors('lastName')}">LastName Error</div>

        </div>
        <div class="form-group">
            <label>PhoneNumber</label>
            <input class="form-control" th:field="*{phoneNumber}" required="required"
                   th:value="${carForm.client.phoneNumber}"
                   type="text"/>
            <div th:errors="*{phoneNumber}" th:if="${#fields.hasErrors('phoneNumber')}">PhoneNumber Error</div>

        </div>
    </div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...