Ошибка проверки при заполнении формы

#java #spring #spring-mvc #thymeleaf

#java #весна #spring-mvc #thymeleaf

Вопрос:

Я пытаюсь установить пользовательскую ошибку проверки при передаче неправильного ввода.

это моя форма, написанная с помощью шаблона thymeleaf:

 <form th:action="@{/addPet}" th:object="${petDto}" method="post">
            <table>
                <tr>
                    <td>Pet name:</td>
                    <td><input type="text" th:field="*{pet.petName}" /></td>
                    <td th:if="${#fields.hasErrors('pet.petName')}" th:errors="*{pet.petName}">fieldError</td>
                </tr>
                <tr>
                    <td>Owner First name:</td>
                    <td><input type="text" th:field="*{owner.firstName}" /></td>
                    <td th:if="${#fields.hasErrors('owner.firstName')}" th:errors="*{owner.firstName}">fieldError</td>
                </tr>
                <tr>
                    <td>Owner Last name:</td>
                    <td><input type="text" th:field="*{owner.lastName}" /></td>
                    <td th:if="${#fields.hasErrors('owner.lastName')}" th:errors="*{owner.lastName">fieldError</td>
                </tr>
                <tr>
                    <td>Owner Number:</td>
                    <td><input type="text" th:field="*{owner.phoneNumber}" /></td>
                    <td th:if="${#fields.hasErrors('owner.phoneNumber')}" th:errors="*{owner.phoneNumber}">fieldError</td>
                </tr>
                <tr>
                    <td><input type="submit" value="add" /></td>
                </tr>
            </table>
  

Итак, передан dto, содержащий два поля:

 public class PetDto {


    private Pet pet;
    private Owner owner;
  

Теперь, когда я ввожу неверный ввод, я получаю это:

 here was an unexpected error (type=Internal Server Error, status=500).
Validation failed for classes [pl.kaczynski.model.Owner] during persist time for groups [javax.validation.groups.Default, ] List of constraint violations:[ ConstraintViolationImpl{interpolatedMessage='Length must be between 2 and 15 characters.', propertyPath=lastName, rootBeanClass=class pl.kaczynski.model.Owner, messageTemplate='{Size}'} ConstraintViolationImpl{interpolatedMessage='Length must be between 2 and 15 characters.', propertyPath=firstName, rootBeanClass=class pl.kaczynski.model.Owner, messageTemplate='{Size}'} ConstraintViolationImpl{interpolatedMessage='numeric value out of bounds (<9 digits>.<0 digits> expected)', propertyPath=phoneNumber, rootBeanClass=class pl.kaczynski.model.Owner, messageTemplate='{javax.validation.constraints.Digits.message}'} ]
  

И моя цель состоит в том, чтобы сообщение об ошибке отображалось рядом с полями ввода в том же представлении, а не перенаправлялось на страницу ошибки. Я создал похожие страницы формы для объектов Pet и Owner, и там все работает нормально, что заставляет меня думать, что есть проблема с моим классом композиции DTO.

редактировать// это класс модели:

 @Entity
public class Pet extends BaseClass{

    @Column(name = "pet_name")
    @Size(min=2,max=15,message="{Size}")
    private String petName;
    @OneToOne()
    @JoinColumn(name = "owner_Id")
    private Owner owner;

@Entity
public class Owner extends BaseClass {

    @Column(name = "first_name")
    @Size(min = 2, max = 15, message = "{Size}")
    private String firstName;

    @Column(name = "last_name")
    @Size(min = 2, max = 15, message = "{Size}")
    private String lastName;

    @Column(name = "phone")
    @Digits(fraction = 0, integer = 9)
    private String phoneNumber;
  

И вот контроллер:

 @RequestMapping(value = "/addPet", method = RequestMethod.POST)
    public String addPetPost(@Valid @ModelAttribute(value="petDto") PetDto petDto, BindingResult result){

        if(result.hasErrors())
            return "/addPet";

        Owner owner = petDto.getOwner();
        Pet pet = petDto.getPet();
        pet.setOwner(owner);

        ownerService.add(owner);
        petService.add(pet);
        return "redirect:addPet";
    }
  

Ответ №1:

Попробуйте этот подход:

 <tr>
    <td>Pet name:</td>
    <td><input type="text" th:field="*{pet.petName}" /></td>
    <span th:if="${#fields.hasErrors('pet.petName')}">
        <ul>
            <li th:each="err : ${#fields.errors('pet.firstName')}" th:text="${err}">error text</li>
        <ul>
    </span>
</tr>
  

Если у вас есть несколько сообщений об ошибках для одного и того же поля (например, требуется имя, имя должно содержать от 2 до 15 символов и т.д.), Они будут напечатаны в виде списка.

Комментарии:

1. это не работает, я думаю, что проблема может быть в объекте результата BindingResult, потому что я его отлаживал, и if(result.hasErrors()) неверно, и поток продолжается, поэтому возникает ошибка страницы whitelabel из spring boot. Итак, цель теперь состоит в том, чтобы результат отображал ошибку

2. что бы вы хотели иметь?

3. Я думаю, что ваша ошибка здесь if(result.hasErrors()) return "/addPet"; . Вы должны вернуть ту же форму, что-то вроде return "petForm"; или как вы ее назвали.

4. код не попадает туда, поэтому в основном это не имеет значения, что там, следовательно, рабочий процесс пропускает его