• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Spring, gradle, jpa, thymeleaf, walidacja pól zwraca błąd

Object Storage Arubacloud
0 głosów
390 wizyt
pytanie zadane 22 lutego 2018 w Java przez niezalogowany

Hej. Chcę dodać walidację do pól. Mam klasę domenową:

 

@Entity
public class Dog {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    @NotNull
    @Size(min=2, max=30)
    private String name;

+ wiadomo gettery, settery.

Mam kontroler:

 

@RequestMapping(value="/addDog", method = RequestMethod.GET)
    public String addDog(Model model) {

        model.addAttribute("newDog", new Dog());
        return "adddog";
    }

    @RequestMapping(value="/addDog", method = RequestMethod.POST)
    public String saveDog(@ModelAttribute @Valid Dog newDog, BindingResult result) {

        if (result.hasErrors()) {
            return "adddog";
        }else{
            dogService.addDog(newDog);
            return "redirect:/success";
        }
    }
@RequestMapping(value="/success", method = RequestMethod.GET)
    public String succes(Model model) {

        model.addAttribute("newDog", new Dog());
        model.addAttribute("msgAdded", "Dodano nowego psa!");
        return "adddog";
    }

No i mam stronę:

 

<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"/>
<title>Psy</title>
</head>
<body>
	<nav class="navbar navbar-inverse">
  <div class="container-fluid">
    <div class="navbar-header">
      <a class="navbar-brand" href="#">Moje psy</a>
    </div>
    <ul class="nav navbar-nav">
      <li><a href="#" th:href="@{/}">Home</a></li>
      <li><a href="#" th:href="@{/dogs}">Lista psów</a></li>
      <li class="active"><a href="#" th:href="@{/addDog}">Dodaj psa</a></li>
    </ul>
    <ul class="nav navbar-nav navbar-right">
    <li><form th:action="@{/logout}" method="post">
        <input type="submit" value="Wyloguj się"/>
      </form>
      </li>
    </ul>  
  </div>
</nav>
    <section class="container">
				<h1>Dodaj nowego psa</h1>

            <form action="#" th:action="@{/addDog}" method="post" th:object="${newDog}">
                <table>
                    <tr>
                        <td>Imię psa:</td>
                        <td><input type="text" th:field="*{name}"/></td>
                        <td th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</td>
                    </tr>
                    <tr>
                        <td>Wiek psa:</td>
                        <td><input type="text" th:field="*{age}" /></td>
                        <td th:if="${#fields.hasErrors('age')}" th:errors="*{age}">Wiek błąd</td>
                    </tr>
                    <tr>
                        <td>Imię właściciela:</td>
                        <td><input type="text" th:field="*{ownersName}" /></td>
                        <td th:if="${#fields.hasErrors('ownersName')}" th:errors="*{ownersName}">Imię właściciela błąd</td>
                    </tr>
                    <tr>
                        <td><button type="submit">Submit</button></td>
                    </tr>
                </table>
            </form>


				<p th:if="${msgAdded}">
				<div class="alert alert-success alert-dismissable">
				<a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
					<strong><h1 th:text="${msgAdded}"></h1></strong>
				</div>
				</p>
	</section>
</body>
</html>

Po wysłaniu formularza pojawia się błąd:


 

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Thu Feb 22 16:47:42 CET 2018

There was an unexpected error (type=Internal Server Error, status=500).

Error during execution of processor 'org.thymeleaf.spring4.processor.attr.SpringInputGeneralFieldAttrProcessor' (adddog:33)

Siedzę nad tym drugi dzień i nie rozumiem, na czym polega błąd. Być może coś nie tak jest z polem ID? 

Nie rozumiem, jak działa  

BindingResult

Obiekt sprawdza poprawność pól po kliknięciu przycisku submit? Rozumiem, że polu ID przypisuje kolejną wolną wartość?

Do Gradle'a dodałem: compile group: 'org.hibernate.validator', name: 'hibernate-validator', version: '6.0.7.Final'
 

2 odpowiedzi

0 głosów
odpowiedź 22 lutego 2018 przez Wiciorny Ekspert (269,690 p.)
edycja 22 lutego 2018 przez Wiciorny

wyraźnie masz napisane  this application has no explicit mapping for /error, so you are seeing this as a fallback.

zaimplementuj error ...   bo byc może w nim jest błąd, z drugiej strony może być on poprawny ale jeszcze nie działać gdyż uwzględniony jest ważniejszy błąd procesorowy.Dlatego..

druga sprawa,  jeśli chodzi o błąd- powiedz mi proszę albo podaj jak wygląda getter/setter dla Encji 

+ wiadomo gettery, settery. 

no właśnie nie wiadomo, bo one są istotne i to bardzo zarówno od strony adnotacji ( czasem wymaga narzucenie na nie odpowiednich adnotacji, dodatkowo ważne jest struktura typów )  

Obiektu typu BindingResult wykorzystamy z kolei do sprawdzenia, czy formularz został prawidłowo zweryfikowany. Na tej podstawie zadecydujemy, czy odesłać użytkownikowi przekierowanie do innej strony czy też ponownie wyświetlić formularz z informacjami o błędach, jak na przykład w poniższej metodzie:

zauważ że uzupełniając jakieś formularz, masz odpowiednie zależności ( wartości, zmiennych, stanu Encji i tego co podane )  i powiązania czy to "TYPU ZMIENNEJ' czy uzupełnienia itd.  Po prostu ta klasa- sprawdza czy wszystkie  te rzeczy są zgodne ze sobą  w Springu i implementacji,  w ten sposób zwraca albo "odp. w postaci wygenerowanej strony jako response, albo error" 

komentarz 22 lutego 2018 przez niezalogowany
public Dog() {

    }

    public Dog(String name, String ownersName, int age) {
        this.name = name;
        this.ownersName = ownersName;
        this.age = age;
    }

    public long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getOwnersName() {
        return ownersName;
    }

    public void setOwnersName(String ownersName) {
        this.ownersName = ownersName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

Mapowanie dla /error mam, ale problem występuje nada.

komentarz 22 lutego 2018 przez Wiciorny Ekspert (269,690 p.)
public long getId() {
        return id;
    }

dlatego Ci niedziała... zwracasz typ prosty, a potrzebne encji jest typ Long  czyli obiekt klasy

public Long getId() {
        return id;
    }

Long nie równa się long, typ prymitywny nie moze byc odczytany przez persistance jako element, natomiast referencja obiektowa juz tak 

komentarz 22 lutego 2018 przez niezalogowany
Niestety to nie rozwiązało problemu. Wrzucę na gita.
komentarz 22 lutego 2018 przez Wiciorny Ekspert (269,690 p.)
a to wrzuć bo jestem bardzo ciekaw rozwiązania i sam bym pogłówkował ale nie znam też całej struktury kodu
komentarz 22 lutego 2018 przez Wiciorny Ekspert (269,690 p.)

@YourDoom, jeszcze masz w Request błą

 

(@ModelAttribute @Valid Dog newDog) 

zamień na 

@Valid @ModelAttribute("newDog") Dog newDog

ewentualnie dodaj nazwe Modelu... bo podejrzewam że spring nie jest wstanie odgadnąć o jaki model chodzi "Dog"

 

komentarz 22 lutego 2018 przez niezalogowany
Pierwszy raz użyłem gita (dobrze, że jest Derek Bananas :D) i nie wiem, czy wszystko jest przesłane, ale wydaje mi się, że tak ;D

https://github.com/Y00Rd00m/dogCalendar.git
0 głosów
odpowiedź 22 lutego 2018 przez Mateusz51 Nałogowiec (28,180 p.)
Hej, powiem szczerze że z tych zrębów informacji można się tylko domyślać co jest nie tak. Masz może cały projekt wrzucony na git albo gdzieś indziej?
komentarz 22 lutego 2018 przez Wiciorny Ekspert (269,690 p.)
dokładnie, 2 sprawa- podejrzewam że przepisuje skądś kod...  skoro używa czegoś nie znając znaczenia.
komentarz 22 lutego 2018 przez niezalogowany
Nie wiem, czy o mnie piszesz, ale ja wiem, co ten obiekt robi. Chodziło mi o szczegółowy opis działania, implementacji.

A o walidacji czytałem tutaj:

https://spring.io/guides/gs/validating-form-input/
komentarz 22 lutego 2018 przez niezalogowany

@Mateusz51, Pierwszy raz użyłem gita (dobrze, że jest Derek Bananas :D) i nie wiem, czy wszystko jest przesłane, ale wydaje mi się, że tak ;D

https://github.com/Y00Rd00m/dogCalendar.git

komentarz 23 lutego 2018 przez Wiciorny Ekspert (269,690 p.)

@YourDoom, pytanie z jakiego tutoriala to piszesz i lub książki, czy też przepisujesz z czyjegoś gita? Bo struktura plików w kwesti  twojego pytania na to wskazuje 

komentarz 23 lutego 2018 przez niezalogowany
Nie rozumiem. Tworzę strukturę projektu (podział pakietów i klas) na podstawie książki "Spring MVC - przewodnik dla początkujących". Tworzona aplikacja jest moja, chcę ją stworzyć samodzielnie, a to dopiero początek. Korzystam z tych źródeł wiedzy:

Dokumentacja Spring.io.
Spring in action wyd. 4 - książka
Spring MVC - książka
Udemy Spring & Hibernate for Beginners by Chad Darby
Artur Owczarek YT
JavaStart kursy zaawansowane Spring i Java EE

Kolejność ma znaczenie, bo dokumentacja Springa jest dla mnie najlepszym źródłem.
komentarz 23 lutego 2018 przez niezalogowany

A co do problemu, to użytkownik @Mateusz51 pomógł mi wczoraj na PW rozwiązać go. Otóż okazało się, że w kontrolerze :

 

  @RequestMapping(value="/addDog", method = RequestMethod.POST)
    public String saveDog(@ModelAttribute @Valid Dog newDog, BindingResult result) {

        if (result.hasErrors()) {
            return "adddog";
        }else{
            dogService.addDog(newDog);
            return "redirect:/success";
        }
    }

nie przypisywałem obiektu typu Dog w razie źle wypełnionego formularza. Poprawiona i działająca wersja kontrolera:

 

  @RequestMapping(value="/addDog", method = RequestMethod.POST)
    public String saveDog(@Valid @ModelAttribute("newDog") Dog newDog, BindingResult result) {

        if (result.hasErrors()) {
            return "adddog";
        }else{
            dogService.addDog(newDog);
            return "redirect:/success";
        }
    }

 

komentarz 23 lutego 2018 przez Wiciorny Ekspert (269,690 p.)

To ja Ci napisałem :D  jeśli chodzi o naprawienie 

 saveDog(@Valid @ModelAttribute("newDog")

wyczuwałem to niemniej jednak powodzenia !

1
komentarz 23 lutego 2018 przez niezalogowany
Masz rację, znalazłeś rozwiązanie. Niestety nie zauważyłem Twojej wiadomości, wybacz.
komentarz 23 lutego 2018 przez Wiciorny Ekspert (269,690 p.)
Nie no ważne jest że problem został rozwiązany :)

Podobne pytania

0 głosów
1 odpowiedź 443 wizyt
pytanie zadane 26 marca 2018 w Java przez LockeLamora Użytkownik (740 p.)
0 głosów
0 odpowiedzi 140 wizyt
0 głosów
1 odpowiedź 546 wizyt

92,550 zapytań

141,392 odpowiedzi

319,520 komentarzy

61,935 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...