Hibernate 原因:javax.validation.ConstraintViolationException:类的验证失败

Hibernate 原因:javax.validation.ConstraintViolationException:类的验证失败,hibernate,spring-boot,validation,jpa,Hibernate,Spring Boot,Validation,Jpa,首先对不起我的语言,英语不是我的母语 任何帮助都将不胜感激 我正在尝试用JPA开发基本的Spring Boot应用程序。我已经完成了大部分项目,项目还包括表单验证。每当我尝试添加新人时,它工作正常,我也可以从valitador获得正确的验证消息,我可以毫无问题地更新此人,但每当我错误地更新表单时,验证器就会导致此错误 错误 这是我的个人课和服务课 IPerson.java package sen3004.app6.service; import java.util.List; import

首先对不起我的语言,英语不是我的母语

任何帮助都将不胜感激

我正在尝试用JPA开发基本的Spring Boot应用程序。我已经完成了大部分项目,项目还包括表单验证。每当我尝试添加新人时,它工作正常,我也可以从valitador获得正确的验证消息,我可以毫无问题地更新此人,但每当我错误地更新表单时,验证器就会导致此错误

错误

这是我的个人课和服务课

IPerson.java

package sen3004.app6.service;

import java.util.List;

import sen3004.app6.model.Person;

public interface IPerson {
    public List<Person> findAll();

    public Person findById(long id);

    public void create(Person person);

    public void delete(long id);

    public void update(Person person);

}
app6application.java

package sen3004.app6;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App6Application {

    public static void main(String[] args) {
        SpringApplication.run(App6Application.class, args);
    }
}
messages.properties

Size.person.firstName=Value must contain at least 3, at most 50 characters.
Size.person.lastName=Value must contain at least 3, at most 50 characters.
Past.person.dateOfBirth=Value must be a past date.
typeMismatch.person.dateOfBirth=Value must be a valid date (dd-mm-yyyy).
Min.person.age=Our patients must have completed the age of 12 as per the age policy!
Email.person.email=You must give valid Email!
Pattern.person.phone=Phone number that given is invalid! For ex.: 9053839052094
greeting=Hello! Welcome to Our Site!
lang.change=Change The Language
lang.eng=English
lang.tr=Turkish
msg.addperson =Add Person
msg.firstname=First Name
msg.lastname=Last Name
msg.dateOfBirth=Date Of Birth
msg.age=Age
msg.email=Email
msg.phone=Phone
msg.persons=Persons
msg.noperson=No Person Found!
msg.id=ID
msg.updateperson=Update Person
management.endpoints.web.exposure.include=*

info.app.name=App6
info.app.desc=Spring Boot and JPA

logging.level.org.springframework.web=DEBUG

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

spring.datasource.schema=classpath:/sql/schema.sql
spring.datasource.data=classpath:/sql/data.sql

spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.show_sql=true
#spring.jpa.properties.hibernate.format_sql=true
update.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="s" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <title><s:message code="msg.updateperson"/></title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"
          integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.4.1/css/all.css"
          integrity="sha384-5sAR7xN1Nv6T6+dT2mhtzEpVJvfS3NScPQTrOxhwjIuvcA67KV2R5Jz6kr4abQsz" crossorigin="anonymous">
</head>
<body>
<div class="container my-5">
    <h3><s:message code="msg.updateperson"/></h3>
    <div class="card">
        <div class="card-body">
            <div class="col-md-8">
                <form:form method="post" action="/update/${person.id}" modelAttribute="person">
                    <div class="row">
                        <div class="form-group col-md-6">
                            <label for="firstName" class="col-form-label"><s:message code="msg.firstname"/></label>
                            <sf:input path="firstName" class="form-control" id="firstName"/>
                            <span class="text-danger"><form:errors path="firstName"/></span>
                        </div>
                        <div class="form-group col-md-6">
                            <label for="lastName" class="col-form-label"><s:message code="msg.lastname"/></label>
                            <sf:input path="lastName" class="form-control" id="lastName"/>
                            <span class="text-danger"><form:errors path="lastName"/></span>
                        </div>
                        <div class="form-group col-md-6">
                            <label for="dateOfBirth" class="col-form-label"><s:message code="msg.dateOfBirth"/></label>
                            <sf:input path="dateOfBirth" class="form-control" id="dateOfBirth"/>
                            <span class="text-danger"><form:errors path="dateOfBirth"/></span>
                        </div>
                        <div class="form-group col-md-6">
                            <label for="age" class="col-form-label"><s:message code="msg.age"/></label>
                            <sf:input path="age" class="form-control" id="age"/>
                            <span class="text-danger"><form:errors path="age"/></span>
                        </div>
                        <div class="form-group col-md-6">
                            <label for="email" class="col-form-label"><s:message code="msg.email"/></label>
                            <sf:input path="email" class="form-control" id="email"/>
                            <span class="text-danger"><form:errors path="email"/></span>
                        </div>
                        <div class="form-group col-md-6">
                            <label for="phone" class="col-form-label"><s:message code="msg.phone"/></label>
                            <sf:input path="phone" class="form-control" id="phone"/>
                            <span class="text-danger"><form:errors path="phone"/></span>
                        </div>
                        <div class="form-group col-md-8">
                            <input type="submit" class="btn btn-primary" value="Submit">
                        </div>
                    </div>
                </form:form>
                <p>You can view a list of existing people <a href="/list.html">here</a>.</p>
            </div>
        </div>
    </div>
</div>

</body>
</html>

根据App6Controller中的共享代码片段,在方法更新中,更新操作验证错误期间未检查任何条件,因此hibernate validator在保存操作期间引发错误。如果没有错误,请执行更新操作。

您可以更改方法吗

@RequestMappingvalue=/update/{id},method=RequestMethod.POST 公共模型和视图update@Valid@modeldattribute-Person, 绑定结果结果, @路径变量长id { ModelAndView mv=新的ModelAndView; 如果result.hasErrors{ person.setIdid; mv.setViewNameupdate; } 服务更新人员; mv.addObjectpeople,service.findAll; mv.setViewNameresult; 返回mv; } } 用这个

@RequestMappingvalue=/update/{id},method=RequestMethod.POST 公共模型和视图update@Valid@modeldattribute-Person, 绑定结果结果, @路径变量长id { ModelAndView mv=新的ModelAndView; 如果result.hasErrors{ person.setIdid; mv.setViewNameupdate; return mv;//在此处添加此return。 } 服务更新人员; mv.addObjectpeople,service.findAll; mv.setViewNameresult; 返回mv; } }
在日志中,您可以看到引发异常ConstraintViolationImpl{interpolatedMessage='boyut'3'ile'50'arasında olmalı',propertyPath=firstName,rootBeanClass=class sen3004.app6.model.Person,messageTemplate={javax.validation.constraints.Size.message}}的约束你能给出创建person firstname,lastname的确切数据吗?…我不明白,但如果我给出正确的数据,更新功能可以正常工作谢谢,这保存了我的项目!
package sen3004.app6.model;

import java.time.LocalDate;

import javax.persistence.*;
import javax.validation.constraints.*;

import org.springframework.format.annotation.DateTimeFormat;

@Entity
@Table(name = "person")
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    @Size(min = 3, max = 50)
    @Column(name = "fname")
    private String firstName;
    @Size(min = 3, max = 50)
    @Column(name = "lname")
    private String lastName;
    @Past
    @DateTimeFormat(pattern = "dd-MM-yyyy")
    @Column(name = "dob")
    private LocalDate dateOfBirth;
    @Min(value = 12)
    @Column(name = "age")
    private int age;
    @Email
    @Column(name = "email")
    private String email;
    @Pattern(regexp = "[0-9\\s]{12}")
    @Column(name = "phone")
    private String phone;

    public long getId() {
        return id;
    }

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

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public LocalDate getDateOfBirth() {
        return dateOfBirth;
    }

    public void setDateOfBirth(LocalDate dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }

    public int getAge() {
        return age;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}
package sen3004.app6;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App6Application {

    public static void main(String[] args) {
        SpringApplication.run(App6Application.class, args);
    }
}
Size.person.firstName=Value must contain at least 3, at most 50 characters.
Size.person.lastName=Value must contain at least 3, at most 50 characters.
Past.person.dateOfBirth=Value must be a past date.
typeMismatch.person.dateOfBirth=Value must be a valid date (dd-mm-yyyy).
Min.person.age=Our patients must have completed the age of 12 as per the age policy!
Email.person.email=You must give valid Email!
Pattern.person.phone=Phone number that given is invalid! For ex.: 9053839052094
greeting=Hello! Welcome to Our Site!
lang.change=Change The Language
lang.eng=English
lang.tr=Turkish
msg.addperson =Add Person
msg.firstname=First Name
msg.lastname=Last Name
msg.dateOfBirth=Date Of Birth
msg.age=Age
msg.email=Email
msg.phone=Phone
msg.persons=Persons
msg.noperson=No Person Found!
msg.id=ID
msg.updateperson=Update Person
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="s" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <title><s:message code="msg.updateperson"/></title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"
          integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.4.1/css/all.css"
          integrity="sha384-5sAR7xN1Nv6T6+dT2mhtzEpVJvfS3NScPQTrOxhwjIuvcA67KV2R5Jz6kr4abQsz" crossorigin="anonymous">
</head>
<body>
<div class="container my-5">
    <h3><s:message code="msg.updateperson"/></h3>
    <div class="card">
        <div class="card-body">
            <div class="col-md-8">
                <form:form method="post" action="/update/${person.id}" modelAttribute="person">
                    <div class="row">
                        <div class="form-group col-md-6">
                            <label for="firstName" class="col-form-label"><s:message code="msg.firstname"/></label>
                            <sf:input path="firstName" class="form-control" id="firstName"/>
                            <span class="text-danger"><form:errors path="firstName"/></span>
                        </div>
                        <div class="form-group col-md-6">
                            <label for="lastName" class="col-form-label"><s:message code="msg.lastname"/></label>
                            <sf:input path="lastName" class="form-control" id="lastName"/>
                            <span class="text-danger"><form:errors path="lastName"/></span>
                        </div>
                        <div class="form-group col-md-6">
                            <label for="dateOfBirth" class="col-form-label"><s:message code="msg.dateOfBirth"/></label>
                            <sf:input path="dateOfBirth" class="form-control" id="dateOfBirth"/>
                            <span class="text-danger"><form:errors path="dateOfBirth"/></span>
                        </div>
                        <div class="form-group col-md-6">
                            <label for="age" class="col-form-label"><s:message code="msg.age"/></label>
                            <sf:input path="age" class="form-control" id="age"/>
                            <span class="text-danger"><form:errors path="age"/></span>
                        </div>
                        <div class="form-group col-md-6">
                            <label for="email" class="col-form-label"><s:message code="msg.email"/></label>
                            <sf:input path="email" class="form-control" id="email"/>
                            <span class="text-danger"><form:errors path="email"/></span>
                        </div>
                        <div class="form-group col-md-6">
                            <label for="phone" class="col-form-label"><s:message code="msg.phone"/></label>
                            <sf:input path="phone" class="form-control" id="phone"/>
                            <span class="text-danger"><form:errors path="phone"/></span>
                        </div>
                        <div class="form-group col-md-8">
                            <input type="submit" class="btn btn-primary" value="Submit">
                        </div>
                    </div>
                </form:form>
                <p>You can view a list of existing people <a href="/list.html">here</a>.</p>
            </div>
        </div>
    </div>
</div>

</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="s" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <title><s:message code="msg.addperson"/></title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"
          integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.4.1/css/all.css"
          integrity="sha384-5sAR7xN1Nv6T6+dT2mhtzEpVJvfS3NScPQTrOxhwjIuvcA67KV2R5Jz6kr4abQsz" crossorigin="anonymous">
</head>
<body>
<div class="container my-5">
    <h3><s:message code="msg.addperson"/></h3>
    <div class="card">
        <div class="card-body">
            <div class="col-md-8">
                <form:form method="post" action="/send" modelAttribute="person">
                    <div class="row">
                        <div class="form-group col-md-6">
                            <label for="firstName" class="col-form-label"><s:message code="msg.firstname"/></label>
                            <sf:input path="firstName" class="form-control" id="firstName"/>
                            <span class="text-danger"><form:errors path="firstName"/></span>
                        </div>
                        <div class="form-group col-md-6">
                            <label for="lastName" class="col-form-label"><s:message code="msg.lastname"/></label>
                            <sf:input path="lastName" class="form-control" id="lastName"/>
                            <span class="text-danger"><form:errors path="lastName"/></span>
                        </div>
                        <div class="form-group col-md-6">
                            <label for="dateOfBirth" class="col-form-label"><s:message code="msg.dateOfBirth"/></label>
                            <sf:input path="dateOfBirth" class="form-control" id="dateOfBirth"/>
                            <span class="text-danger"><form:errors path="dateOfBirth"/></span>
                        </div>
                        <div class="form-group col-md-6">
                            <label for="age" class="col-form-label"><s:message code="msg.age"/></label>
                            <sf:input path="age" class="form-control" id="age"/>
                            <span class="text-danger"><form:errors path="age"/></span>
                        </div>
                        <div class="form-group col-md-6">
                            <label for="email" class="col-form-label"><s:message code="msg.email"/></label>
                            <sf:input path="email" class="form-control" id="email"/>
                            <span class="text-danger"><form:errors path="email"/></span>
                        </div>
                        <div class="form-group col-md-6">
                            <label for="phone" class="col-form-label"><s:message code="msg.phone"/></label>
                            <sf:input path="phone" class="form-control" id="phone"/>
                            <span class="text-danger"><form:errors path="phone"/></span>
                        </div>
                        <div class="form-group col-md-8">
                            <input type="submit" class="btn btn-primary" value="Submit">
                        </div>
                    </div>
                </form:form>
                <p>You can view a list of existing people <a href="/list.html">here</a>.</p>
            </div>
        </div>
    </div>
</div>

</body>
</html>
management.endpoints.web.exposure.include=*

info.app.name=App6
info.app.desc=Spring Boot and JPA

logging.level.org.springframework.web=DEBUG

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

spring.datasource.schema=classpath:/sql/schema.sql
spring.datasource.data=classpath:/sql/data.sql

spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.show_sql=true
#spring.jpa.properties.hibernate.format_sql=true