Walidacja formularza w Spring - problem.

0

Witam.

Przerabiam tutoriala z tym problemem, mimo że wszystko zrobiłem wg. zaleceń walidacja nie działa.
Problem w tym że BindingResult nie zwraca błędu kiedy wprowadzone dane nie powinny przejść.
Kod kontrolera:

@RequestMapping(value = "/sendMailSimple", method = POST)
    public String sendSimpleMail(@ModelAttribute("form") @Valid FormularzDTO form, BindingResult result) {
        
        if (result.hasErrors()) {
            System.out.println("2. formularz nie jest uzupełniony prawidłowo. !!!!!!!!");
            return "form.html";
        } else {
            System.out.println("2. formularz wypełniony prawidłowo.");
            return "redirect:sent.html";
        }
    }    

Rozumiem że mogłem się pomylić.
Więc pobrałem gotowy kod całego projektu z:

http://www.mkyong.com/spring-mvc/spring-3-mvc-and-jsr303-valid-example/

i mam dokładnie to samo.
W jaki sposób podejść do tematu ażeby znaleźć przyczynę?

Pozdrawiam.

0

NIe masz tego na githubie?

0

Nie mam.

0

Trochę stary ten tutorial.

0
Antonii napisał(a):

Nie mam.

No to sory, nie będe zgadywać ;)

Ale mogę pokazać u mnie walidację:

 @RequestMapping(value = "/register",method = RequestMethod.POST)
    @PreAuthorize(value = "permitAll")
    public ModelAndView registerSubmit(@Valid @ModelAttribute(ATTRIBUTE_REGISTER_FORM) UserRegisterDTO form, Errors errors){
        ModelAndView modelAndView = new  ModelAndView("user-register");
        if(errors.hasErrors()){
            modelAndView.addObject(ATTRIBUTE_FEEDBACK,"Data are invalid");
            modelAndView.addObject(ATTRIBUTE_REGISTER_FORM,form);
            modelAndView.setStatus(HttpStatus.BAD_REQUEST);
        }else{
            userService.registerUser(form);
            modelAndView.addObject(ATTRIBUTE_FEEDBACK,"Your account has been created");
            modelAndView.addObject(ATTRIBUTE_REGISTER_FORM,new UserRegisterDTO());
            modelAndView.setStatus(HttpStatus.CREATED);
        }
        return modelAndView;
    
}

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserRegisterDTO {
    @Pattern(regexp = "[a-z0-9_]{4,20}",
            message = "Username should contains small letters,numbers and _ signs with 4-20 lengths ")
    private String username;
    @Pattern(regexp = "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-_]).{8,20}$", message =
            "Password should have length between 8 and 20,at least one lowercase,uppercase,special character and ")
    private String password;
    @Email
    private String email;

}
0

U mnie jest tak:

@Controller
public class MainController {

    // Sending confirmation page. 
    @RequestMapping(value = "/sent.html", method = GET)
    public String sent() {
        return "sent.html";
    }

    // Simple HTML email.
    @RequestMapping(value = {"/", "/login.html"}, method = GET)
    public String simple() {
        System.out.println("1. Wyswietlenie strony logowania.>");
        return "login.html";
    }
     
    //Obsługa walidacji - test
    @RequestMapping(value = "/sendMailSimple", method = POST)
    public String sendSimpleMail(@ModelAttribute("form") @Valid FormularzDTO form, BindingResult result) {
        
        System.out.println("ErrorCount> " + result.getErrorCount());
        System.out.println("LoginName> " + form.getLoginName());
        System.out.println("Password> " + form.getPassword());

        if (result.hasErrors()) {
            System.out.println("2. formularz nie jest uzupełniony prawidłowo. !!!!!!!!");
            return "redirect:sent.html";
        } else {
            System.out.println("2. formularz wypełniony prawidłowo.");
            return "redirect:sent.html";
        }
    }    
    
   
}

public class FormularzDTO {

    @NotNull
    @Size(min=3, max=5)
    private String loginName;

    
    @NotNull
    private String password;
    
    //@NotEmpty
    //@Email
    private String email;

    @Min(18)
    private Integer wiek;

gettery...
settery...   
}

<body>
        <div class="container">
            <h1>Spring email with Thymeleaf - test</h1>
            <h2>HTML email (simple)</h2>
            <form action="sent.html" th:action="@{/sendMailSimple}"  method="post">
                <fieldset>
                    <label for="simpleLoginName">Login:</label>
                    <input type="text" id="simpleLoginName" name="loginName" size="60" /> <br />

                   <label for="simplePassword">Password:</label>
                   <input type="text" id="simplePassword" name="Password" size="60" /> <br />

                    <label for="simpleRecipientEmail">To (email):</label>
                    <input type="email" id="simpleRecipientEmail" name="recipientEmail" placeholder="[email protected]" size="60" /> <br />
                    <input type="submit" value="Send mail" class="button-primary" />

                </fieldset>
            </form>
            <p>
                <a href="index.html" th:href="@{/index.html}" class="button">Back to home page</a>
            </p>
        </div>
    </body>
0

Hmm Ty masz BindingResults a ja mam Errrors, mój kod u mnie działa :)

0

Błąd nie leży raczej w różnicy między użyciem BindingResults a Errors. Ciężko będzie wywróżyć coś z fusów, najlepiej będzie jak wrzucisz gdzieś cały kod. Jesteś pewien, że implementacja beanvalidation - JSR303/JSR349 jest w classpath?

0

Odnośnie walidacji w pom-ie mam wpis:

<dependency>
      <groupId>javax.validation</groupId>
      <artifactId>validation-api</artifactId>
      <version>1.1.0.Final</version>
      <scope>compile</scope>
</dependency>

no i w projekcie w zależnościach mavena jest widoczy jar.
Ogarnę więc GitHub-a i dam tam swój projekt.
Dzięki za zainteresowanie.

Pozdrawiam.

0

A masz silnik do tego?
Np. Validator Hibernate?

U mnie to jest:


        <!-- Validation -->

        <dependency>
            <groupId>commons-validator</groupId>
            <artifactId>commons-validator</artifactId>
            <version>1.6</version>
        </dependency>

        <dependency>
            <groupId>javax.el</groupId>
            <artifactId>javax.el-api</artifactId>
            <version>3.0.0</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>el-impl</artifactId>
            <version>2.2</version>
            <scope>test</scope>
        </dependency>


        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.4.1.Final</version>
        </dependency>
1

To co dołączyłeś to tylko "specyfikacja". Potrzebujesz teraz jej implementacji. Jedną z nich może być właśnie Hibernate validator wspomniany przez @scibi92. Po dodaniu tej zależności powinno działać - spring powinien ją wykryć automatycznie.

Ponadto twoja zależność ma "scope" "compile", czyli w ogóle nie jest dostępna w trakcie uruchomienia programu.

0

No cóż, trudne są początki początkującego.
Po dodaniu:

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>5.4.1.Final</version>
</dependency>

wszystko działa prawidłowo, za co bardzo dziękuje.

Przesiadam się z C/C++ i pewnych rzeczy nie rozumiem, jak np. w przyszłości ustrzec się przed takimi problemami?
W C/C++ jak program się skompiluje to potem działa.
Jak można dojść do rozwiązania takich problemów?
Czytając samouczki nie spotkałem się z wyjaśnieniami jakich zależności i dlaczego potrzebuję w pom-ie.

Pozdrawiam.

0

Jeśli dobrze pamiętam C/C++ to nie jest prawda, że:

W C/C++ jak program się skompiluje to potem działa.

Przecież możesz dołączyć biblioteki dynamiczne, które nie będą dostępne na innym komputerze gdzie danych program skompilowałeś. Możesz skompilować go pod inną architekturą i na oddmiennej go nie uruchomisz, prawda?

Jak można dojść do rozwiązania tych problemów?

Pisząc "niekonstruktywnie": wnikliwie czytając dokumentację. https://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html#validation-beanvalidation-spring

A JSR-303/JSR-349 provider, such as Hibernate Validator, is expected to be present in the classpath and will be detected automatically.

W praktyce dokumentacji do przeróżnych bibliotek/frameworków czy samych specyfikacji jest tak dużo, że stało się to trochę wiedzą tajemną. Niestety często sprowadza się to do szukania czegoś w google i przeklejenia bez zrozumienia magicznych adnotacji z odpowiedzi na stack overflow. Czy to dobrze, czy źle - to jest osobna dyskusja, nie na ten wątek.

Pisząc konstruktywnie, pytać, czytać, uczyć się. Po tym wątku wiesz już o zależnościach, wiesz, że mogą mieć kilka zakresów. Poznałeś "compile" i "runtime" (domyślny). Niedługo poznasz "test" ;). Rozwiązując tegy typu problemy i starając się coś z nich wynieść uczysz się najwięcej.

0

Albo też czytając logi. Ja często ne wiem że jest coś potrzebne ale wyrzuca mi stacka po którym widać że czegos brakuje i można wygóglać ;)

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