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

Walidacja encji spring nie działa

Object Storage Arubacloud
0 głosów
381 wizyt
pytanie zadane 15 lutego 2019 w Java przez niezalogowany
edycja 19 lutego 2019

Hej. Używam w projekcie Spring Boot, Javy, Gradle i bazy danych MySql. Chcę zastosować walidację pól podczas wysyłania formularzy. W klasie encji mam coś takiego:

 

import javax.persistence.*;
import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Size(max = 20, message = "{Size.AnimalEntity.name.validation}")
    @NotNull(message = "Pole nie może być puste!")
    @Column(name = "animalsName")
    private String nameString;


W Gradle dodane zależności:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa:2.1.2.RELEASE'
    implementation 'org.springframework.boot:spring-boot-starter-security:2.1.2.RELEASE'
    implementation 'org.springframework:spring-context-support:5.1.4.RELEASE'
    implementation 'javax.mail:mail:1.5.0-b01'
    implementation 'mysql:mysql-connector-java:8.0.14'
    implementation 'org.hibernate.validator:hibernate-validator:6.1.0.Alpha2'
    implementation 'org.apache.tomcat.embed:tomcat-embed-el:9.0.14'
    implementation 'org.hamcrest:hamcrest:2.1'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation 'org.mockito:mockito-all:2.0.2-beta'
}

Formularz wygląda tak:

 

<form action="#" th:action="@{/processNewAnimal}" th:object="${newAnimal}" method="post" enctype="multipart/form-data" th:if="${#vars['freePlacesExist']}">
        <fieldset>
          <h1>Still free places:</h1> <h2 th:text="${#vars['freePlacesExist']}"></h2>
          <legend>Tell us more about your pet:</legend>
          <tr><td>Add an image: </td><td><input type="file" name="file"/></td></tr>
          <h1>Name:</h1><br>
          <input type="text" th:field="*{nameString}" class="name"/><br>
          <div th:if="${#fields.hasErrors('nameString')}" th:errors="*{nameString}" >
          <h2 th:text="#{NotNull.AnimalEntity.validation}">ERROR</h2>
          </div>
          <h1>Age:</h1><br>
          <input type="text" th:field="*{age}"><br>
          <input type="radio" th:field="*{specieString}" name="specie" value="dog"/>Dog<br>
          <input type="radio" th:field="*{specieString}" name="specie" value="cat"/>Cat<br>
          <textarea rowes="4" cols="70" th:field="*{animalsDescription}">Short description - max 450</textarea><br>
          <input type="submit" value="Add"/>
        </fieldset>
      </form>


No i nic się nie dzieje, nawet jeśli pole jest puste lub wpiszę wartość spoza zakresu. 

Proszę o pomysły, co może być nie tak.

1 odpowiedź

0 głosów
odpowiedź 16 lutego 2019 przez mbabane Szeryf (79,280 p.)

W kontrolerze trzeba jeszcze ustawić bodajże adnotacje @Valid przy parametrze metody:

import javax.validation.Valid;

class Controller{
@PostMapping("/proccessNewAnimal")
public String proccesNewAnimal(@Valid Animal) {}
}

Po więcej informacji wpisz Spring MVC BeanValidation.

komentarz 16 lutego 2019 przez niezalogowany

Oczywiście! Zapomniałem wkleić kontroler:

 

@PostMapping("/processNewAnimal")
	public String processNewAnimalForm(@Valid @ModelAttribute("newAnimal") AnimalEntity newAnimal, BindingResult result, @RequestParam("file") MultipartFile file,
									   RedirectAttributes redirectAttributes) {
		if (result.hasErrors()) {
			System.out.println(result.getAllErrors());
			return "addAnimal";
		}
		taskExecutor.execute(() -> sendingEmailToWorkersService.checkIfEmailCanBeSent(howManyPlaceLeft.existsFreePlaces(), numberOfFreePlacesToSendEmails));
		addAnimalsService.addAnimalToDb(newAnimal);
		storageService.store(file, newAnimal);
		redirectAttributes.addFlashAttribute("flash.message", "Animal has been added!");
		return "redirect:/addAnimal";
	}

Przeglądałem dokumentację i nic nie znalazłem, a walidacja nie działa :/

komentarz 16 lutego 2019 przez mbabane Szeryf (79,280 p.)

Jeszce zdaje się trzeba dodać w konfiguracji:

@Bean
public Validator getValidator() {
   return new LocalValidatorFactoryBean();
}

 

komentarz 17 lutego 2019 przez niezalogowany
nie
komentarz 17 lutego 2019 przez mbabane Szeryf (79,280 p.)

W konfiguracji  dodaj:

@Bean
public Validator mvcValidator() {    
     return new LocalValidatorFactoryBean();
}

Tamto poprzednie możesz usunąć.

komentarz 18 lutego 2019 przez niezalogowany
I to wszystko?
komentarz 18 lutego 2019 przez mbabane Szeryf (79,280 p.)

Że tak powiem u mnie wszystko działa. W konfiguracji, nie mam nic więcej. W pom.xml lub w build.gradle mam takie dependencje:

komentarz 19 lutego 2019 przez niezalogowany
Ale przecież używam spring boota.
komentarz 19 lutego 2019 przez mbabane Szeryf (79,280 p.)
Sprawdź to:

https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation

Spring boot nie wyklucza uzycia wlasnej konfiguracji.

Jesli chcesz dalszej pomocy to musisz pokazac projekt.

Sprawdz jeszcze to:

https://spring.io/guides/gs/validating-form-input/
komentarz 19 lutego 2019 przez niezalogowany
Tak, wiem, ale nie mogę użyć tego beana, bo już jest autoskonfigurowany.

Tu wrzuciłem cały projekt: https://forum.pasja-informatyki.pl/415287/prosba-o-ocene-aplikacji

Podobne pytania

0 głosów
0 odpowiedzi 674 wizyt
pytanie zadane 15 marca 2017 w Java przez Swierzak Użytkownik (690 p.)
0 głosów
1 odpowiedź 441 wizyt
pytanie zadane 26 marca 2018 w Java przez LockeLamora Użytkownik (740 p.)
0 głosów
2 odpowiedzi 389 wizyt

92,538 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,923 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!

...