簡體   English   中英

Spring 中使用@Valid 的驗證表單不起作用

[英]Validation form in Spring using @Valid not work

我想驗證我的表單,但這不起作用。 我的實體 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 和表單 go 添加管理頁面:

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

addAdmin.jsp頁面公式:

    <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";
    }
}

當我嘗試發送空公式時,我應該收到錯誤消息result.hasErrors() not return error 和我的應用程序 go 到 else 並嘗試保存用戶。 為什么@Valid 不起作用?

將我的項目升級到 Spring Boot 2.3.0 后,我為同樣的問題苦苦掙扎了幾個小時,直到我意識到從#19550 開始,Web 和 WebFlux 啟動器在默認情況下不再依賴於驗證啟動器。 如果您的應用程序正在使用驗證功能,則需要在構建文件中手動添加回對spring-boot-starter-validation的依賴項。

您確定驗證不起作用嗎? 除非您已注冊StringTrimmerEditor ,否則您的字段實際上將是長度等於 0 的 String 實例,而不是提交表單時的null值,因此注釋會認為這些值是有效的。

如果要驗證 String 不為空(不是 null 也不是空字符串),請使用例如@NotBlank注釋。 此外,我自己也嘗試過, @Email注釋也通過空字符串,這意味着您的空表單現在實際上是有效的。

我在 Spring Boot 2.4.1 項目中遇到了同樣的問題。 您需要在 pom.xml 文件中添加此依賴項

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

我有同樣的錯誤(應用程序沒有驗證)。

我加了

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

並工作!

<mvc:annotation-driven/>

檢查上面的標簽是否在 dispatcher-servlet.xml 中聲明。 此標記將激活所有注釋。

今天(2018-04-22), hibernate-validator已經更新到了6.0.9.Final版本。 在我的測試中,我發現使用@Valid有效的嵌套對象可以工作 <= version 5.2.5.Final ,我不明白為什么最新的不能工作(也許將來有人可以解釋),這是我的代碼:

@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;
}

在 spring MVC 控制器上:

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

我在 2.5.0 (SNAPSHOT) spring boot 項目中遇到了同樣的問題。 我在 pom.xml 文件中添加了以下依賴項並且它起作用了。

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

我在Kotlin中遇到了同樣的問題,舊 bean 自動從 Java 轉換。 他們缺少field目標說明符,沒有它javax.validation注釋無效。

問題代碼中的 Kotlin 片段(帶有解決問題的field ):

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

我不得不更改 hibernate-validator 的版本。 8.0.0 不起作用,但 6.1.5 起作用。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM