Walidacja w Thymeleaf

Odpowiedz Nowy wątek
2017-09-13 15:15
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.

Pozostało 580 znaków

2017-09-14 00:10
0

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

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

edytowany 1x, ostatnio: pwntmaciek, 2017-09-14 00:35

Pozostało 580 znaków

2017-09-14 22:12
0

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

edytowany 1x, ostatnio: Michał Brzeziński, 2017-09-14 22:13

Pozostało 580 znaków

2017-09-14 23:46
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";

Pozostało 580 znaków

2017-09-14 23:48

Kolego, przeciez to napisalem :D Wczoraj :)

Pozostało 580 znaków

2017-09-14 23:49
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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