简体   繁体   中英

Validation form in Spring using @Valid not work

I want to validation my form, but this not work. My entity class

import java.io.Serializable;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.Email;

@Entity
@Table(name = "users")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue
    @Column(name = "id")
    private Integer id;
    @NotNull
    @Size(max = 20)
    @Column(name = "username")
    private String username;
    @NotNull
    @Size(max = 20)
    @Column(name = "password")
    private String password;
    @NotNull
    @Size(max = 20)
    @Column(name = "firstName")
    private String firstName;
    @NotNull
    @Size(max = 20)
    @Column(name = "lastName")
    private String lastName;
    @Size(min = 11, max = 11)
    @Column(name = "personalId")
    private String personalId;
    @Size(max = 40)
    @Column(name = "city")
    private String city;
    @Size(max = 40)
    @Column(name = "address")
    private String address;
    @NotNull
    @Email
    @Size(max = 30)
    @Column(name = "email")
    private String email;
    @Size(min = 9, max = 9)
    @Column(name = "phone")
    private String phone;
    @OneToMany(mappedBy = "user")
    private Set<UserRole> userRoleSet;
}

adminList.jsp and form go to addAdmin page:

<form action="addAdminForm" method="post">
    <input type="submit" value="Dodaj administratora" />
</form>

addAdmin.jsp page formule:

    <form:form action="addAdmin" modelAttribute="user" method="post">
    <form:label path="username">Login: </form:label>
    <form:input path="username" />
    <form:errors path="username" cssClass="error" />
    <br />
    <form:label path="password">Hasło: </form:label>
    <form:password path="password" />
    <form:errors path="password" cssClass="error" />
    <br />
    <form:label path="firstName">Imię: </form:label>
    <form:input path="firstName" />
    <form:errors path="firstName" cssClass="error" />
    <br />
    <form:label path="lastName">Nazwisko: </form:label>
    <form:input path="lastName" />
    <form:errors path="lastName" cssClass="error" />
    <br />
    <form:label path="email">Email: </form:label>
    <form:input path="email" />
    <form:errors path="email" cssClass="error" />
    <br />
    <input type="submit" value="Dodaj" />
</form:form>

Controller:

    @RequestMapping(value = "/admin/addAdminForm", method = RequestMethod.POST)
public ModelAndView goAddAdminForm() {
    ModelAndView mav = new ModelAndView("admin/addadmin");
    mav.addObject("user", new User());
    return mav;
}

@RequestMapping(value = "/admin/addAdmin", method = RequestMethod.POST)
public String addAdmin(@Valid @ModelAttribute("user") User user,
        BindingResult result, Model model) {
    if (result.hasErrors()) {
        return "admin/addadmin";
    } else {
        userService.createUser(user);
        user = userService.findByUsername(user.getUsername());
        UserRole userRole = new UserRole("ROLE_ADMIN");
        userRole.setUser(user);
        userRoleService.createUserRole(userRole);
        return "redirect:/admin/adminlist";
    }
}

When i try send empty formule i should get error messages result.hasErrors() not return error and my application go to else and try save user. Why @Valid not work?

After upgrading my project to Spring Boot 2.3.0, I struggled for hours with the same issue until I realized that as of #19550 , Web and WebFlux starters do not depend on the validation starter by default anymore. If your application is using validation features, you'll need to manually add back a dependency on spring-boot-starter-validation in your build file.

Are you sure that the validations don't work? Unless you have for example StringTrimmerEditor registered, your fields will actually be String instances with length equal to 0, not null values when you submit the form and therefore the annotation would consider such values to be valid.

If you want to validate that String is not blank (not null and not an empty String), use for instance the @NotBlank annotation. Also I just tried it myself and the @Email annotation also passes for empty Strings, which would mean that your empty form IS actually valid right now.

I struggled with the same issue in my Spring Boot 2.4.1 project. You'll need to add this dependency in your pom.xml file

...
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
...

I had the same error (the application did not validate).

I added

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>

and worked!

<mvc:annotation-driven/>

check whether above tag is declared within dispatcher-servlet.xml or not. This tag will be active all annotation.

Today (2018-04-22), the hibernate-validator have been update to version 6.0.9.Final . On my test, I found the nested object valid using @Valid can be work <= version 5.2.5.Final , I don't understand why the latest can't working (maybe someone can explain in future), here is my code:

@JsonIgnoreProperties(ignoreUnknown = true)
public class PackQueryReq {

    // ......

    @NotNull(message = "params can't be NULL")
    @Valid
    private PackQueryParams params;
}
public class PackQueryParams {

    @Min(value=1)
    @NotNull(message = "enterpriseId can't be NULL")
    private Integer enterpriseId;
}

And on spring MVC controller:

public Resp query(@RequestBody @Valid PackQueryReq packQuery) {
   //...
}

I had the same issue with 2.5.0 (SNAPSHOT) spring boot project. I added the below dependency in the pom.xml file and it worked.

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

I had the same problem in Kotlin with old beans automatically converted from Java. They were missing the field target specifier , without which the javax.validation annotations had no effect.

A Kotlin snippet from the question code (with field to solve the problem):

@field:NotNull
@field:Size(max = 20)
@Column(name = "username")
var username:  String

I had to change the version of hibernate-validator. With 8.0.0 does not work, but with 6.1.5 does.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM