Walidacja w Thymeleaf

0

Cześć.
Nie wiem czemu nie wyświetlają mi się komunikaty błędów jeśli dane zostaną źle wprowadzone. Sprawdzałem kila różnych wersji dostarczania tych komunikatów, ale nic nie chce mi działać.
Czytałem, że problem może być związany z nazewnictwem parametrów. Jednak wydaj mi się, że u mnie są one dobrze nazwane. W metodzie obsługującej formularz przekazuję Advert advert co powinno być odpowiednikiem advert w Thymeleaf. Nie wiem o co może już chodzić.
W thymeleaft wygląda tak:

<form th:action="@{/addadvert}" th:object="${advert}" method="post">
    <input th:field="*{title}" type="text" placeholder="title" autocomplete="off" th:errorclass="invalid"/>
    <div th:if="${#fields.hasErrors('title')}" class="red-text" th:errors="*{title}">Error</div>
    <input th:field="*{description}" type="text" placeholder="description" autocomplete="off"/>
    <div th:if="${#fields.hasErrors('description')}" class="red-text" th:errors="*{description}">Error</div>
    <button type="submit" class="btn blue lighten-1">Add advert</button>
</form>

A metoda obsługująca formularz tak:

    @PostMapping(value = "/addadvert")
    public String addAdvert(
            @Valid @ModelAttribute Advert advert,
            BindingResult bindingResult,
            RedirectAttributes redirectAttributes,
            Principal principal
            ) {
        if (bindingResult.hasErrors()) {
            for (int i = 0; i < bindingResult.getAllErrors().size(); i++) {
                log.info(bindingResult.getAllErrors().get(i).getObjectName());
                log.info(bindingResult.getAllErrors().get(i).getCode());
                log.info(bindingResult.getAllErrors().get(i).toString());
            }
            redirectAttributes.addFlashAttribute(
                    "org.springframework.validation.BindingResult.advert",
                    advert);
            redirectAttributes.addFlashAttribute("advert", advert);
            return "redirect:/addadvert";
        }
        User user = userService.findUserByUsername(principal.getName());
        advert.setUser(user);
        advertRepository.save(advert);
        return "redirect:/userpanel";
    }

Dodałem logi, żeby zobaczyć czy coś się dzieje i niby tak bo dostaję coś takiego:

2017-09-13 12:20:34.650  INFO 2784 --- [nio-8080-exec-2] c.ad.web.controller.AddAdvertController  : advert
2017-09-13 12:20:34.651  INFO 2784 --- [nio-8080-exec-2] c.ad.web.controller.AddAdvertController  : NotEmpty
2017-09-13 12:20:34.651  INFO 2784 --- [nio-8080-exec-2] c.ad.web.controller.AddAdvertController  : Field error in object 'advert' on field 'description': rejected value []; codes [NotEmpty.advert.description,NotEmpty.description,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [advert.description,description]; arguments []; default message [description]]; default message [may not be empty]
2017-09-13 12:20:34.651  INFO 2784 --- [nio-8080-exec-2] c.ad.web.controller.AddAdvertController  : advert
2017-09-13 12:20:34.651  INFO 2784 --- [nio-8080-exec-2] c.ad.web.controller.AddAdvertController  : Size
2017-09-13 12:20:34.651  INFO 2784 --- [nio-8080-exec-2] c.ad.web.controller.AddAdvertController  : Field error in object 'advert' on field 'title': rejected value [as]; codes [Size.advert.title,Size.title,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [advert.title,title]; arguments []; default message [title],30,5]; default message [size must be between 5 and 30]

Próbowałem też bez dodawania redirectAttributes.addFlashAttribute, a komunikaty wyświetlać tak:

<ul th:if="${#fields.hasErrors('*')}" class="errorlist">
    <li th:each="err : ${#fields.errors('*')}" th:text="${err}">Błędne dane</li>
</ul>

ale efekt też był zerowy.

0

Sprobuj w ifie po prostu return "/addadvert", a obiekt redirectAttributes usun.

https://spring.io/guides/gs/validating-form-input/

0

Ja bym ifa wyrzucił. Też miałem problem z komunikatami ale jak już uczlowieczylem kontroler i encje poszło. Bez if

0

No w końcu udało mi się wpaść o co chodzi z tymi nie wyświetlającymi się komunikatami. Oczywiście głupi błąd. W ifie zwracam

return "redirect:/addadvert";

a powinienem

return "addadvert";
0

Kolego, przeciez to napisalem :D Wczoraj :)

0

Hehe nie zauważyłem :P Dzięki za pomoc :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1