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

时间:2020-05-20 16:08:30

标签: hibernate spring-boot validation jpa

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

任何帮助将不胜感激

我正在尝试使用JPA开发基本的Spring Boot应用程序。我已经完成了大部分项目,并且项目还包括表单验证。每当我尝试添加新的Person时,它都运行良好,并且可以获得正确的验证消息同样,从valitador那里,我也可以毫无问题地更新人员,但是每当我错误地输入更新表格时,验证程序就会导致此错误

错误

Wed May 20 18:49:01 EET 2020
There was an unexpected error (type=Internal Server Error, status=500).
Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction
org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:543)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:744)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:712)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:631)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:385)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)
    at sen3004.app6.service.App6Service$$EnhancerBySpringCGLIB$$88491962.update(<generated>)
    at sen3004.app6.web.App6Controller.update(App6Controller.java:78)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:888)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:108)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)
Caused by: javax.persistence.RollbackException: Error while committing the transaction
    at org.hibernate.internal.ExceptionConverterImpl.convertCommitException(ExceptionConverterImpl.java:81)
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:104)
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:534)
    ... 64 more
Caused by: javax.validation.ConstraintViolationException: Validation failed for classes [sen3004.app6.model.Person] during update time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
    ConstraintViolationImpl{interpolatedMessage='boyut '3' ile '50' arasında olmalı', propertyPath=firstName, rootBeanClass=class sen3004.app6.model.Person, messageTemplate='{javax.validation.constraints.Size.message}'}
]
    at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:140)
    at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreUpdate(BeanValidationEventListener.java:88)
    at org.hibernate.action.internal.EntityUpdateAction.preUpdate(EntityUpdateAction.java:252)
    at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:122)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
    at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478)
    at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:348)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:108)
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1344)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:435)
    at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3221)
    at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2389)
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:447)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281)
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101)
    ... 65 more

我在互联网上看了一些解决方案,但对我却不起作用。在这里工作的战士要添加新人

Add New Person

我需要解决问题,当我尝试更新此人时(出现错误),它应该给我同样的错误

这是我的控制人

package sen3004.app6.web;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import sen3004.app6.model.Person;
import sen3004.app6.service.App6Service;

@Controller
public class App6Controller {

    @Autowired
    App6Service service;

    @RequestMapping(value = {"/", "index.html"}, method = RequestMethod.GET)
    public String getIndex() {
        return "index";
    }


    @RequestMapping(value = {"/display-form", "create.html"}, method = RequestMethod.GET)
    public ModelAndView displayForm() {
        ModelAndView mv = new ModelAndView("form");
        mv.addObject("person", new Person());

        return mv;
    }

    @RequestMapping(value = "/send", method = RequestMethod.POST)
    public ModelAndView processForm(@Valid @ModelAttribute Person person, BindingResult result) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("person", person);

        if (result.hasErrors())
            mv.setViewName("form");
        else {
            mv.setViewName("result");
            service.create(person);
            mv.addObject("people", service.findAll());
        }

        return mv;
    }

    @RequestMapping(value = {"/list-people", "list.html"}, method = RequestMethod.GET)
    public ModelAndView list() {
        ModelAndView mv = new ModelAndView("result");
        mv.addObject("people", service.findAll());

        return mv;
    }

    @RequestMapping(value = {"/edit/{id}"}, method = RequestMethod.GET)
    public ModelAndView editList(@PathVariable long id) {
        ModelAndView mv = new ModelAndView("update");
        mv.addObject("person", service.findById(id));
        return mv;
    }

    @RequestMapping(value = "/update/{id}", method = RequestMethod.POST)
    public ModelAndView update(@Valid @ModelAttribute Person person,
                               BindingResult result,
                               @PathVariable long id
                               ) {
        ModelAndView mv = new ModelAndView();
        if (result.hasErrors()) {
            person.setId(id);
            mv.setViewName("update");
        }
        service.update(person);
        mv.addObject("people", service.findAll());
        mv.setViewName("result");


        return mv;
    }

    @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET)
    public ModelAndView delete(@PathVariable long id) {
        ModelAndView mv = new ModelAndView("result");
        service.delete(id);
        mv.addObject("people", service.findAll());

        return mv;
    }

}

这是我的IPerson类和服务类

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);

}

App6Service.java

package sen3004.app6.service;

import java.util.List;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import sen3004.app6.dao.App6Repository;
import sen3004.app6.model.Person;

@Service
@Transactional
public class App6Service implements IPerson {

    @Autowired
    App6Repository repository;

    @Override
    public List<Person> findAll() {
        return repository.findAll();
    }

    @Override
    public Person findById(long id) {
        return repository.findById(id);
    }

    @Override
    public void create(Person person) {
        repository.create(person);
    }

    @Override
    public void delete(long id) {
        repository.delete(id);
    }

    @Override
    public void update(Person person) {
        repository.update(person);
    }

}

App6Repository.java

package sen3004.app6.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;

import sen3004.app6.model.Person;
import sen3004.app6.service.IPerson;

@Repository
public class App6Repository implements IPerson {

    @PersistenceContext
    private EntityManager entityManager;

    public List<Person> findAll(){
        return entityManager.createQuery("from Person", Person.class).getResultList();
    }

    public Person findById(long id){
        return entityManager.find(Person.class, id);
    }

    @Override
    public void update(Person person) {
        entityManager.merge(person);

    }

    @Override
    public void create(Person person) {
        entityManager.persist(person); 
    }

    @Override
    public void delete(long id) {
        entityManager.remove(entityManager.getReference(Person.class, id));
    } 
}

型号 Person.java

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

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

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>

form.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.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>

application.properties

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

2 个答案:

答案 0 :(得分:3)

您可以更改方法

@RequestMapping(value = "/update/{id}", method = RequestMethod.POST)
    public ModelAndView update(@Valid @ModelAttribute Person person,
        BindingResult result,
        @PathVariable long id
        ) {
        ModelAndView mv = new ModelAndView();
        if (result.hasErrors()) {
            person.setId(id);
            mv.setViewName("update");
        }
        service.update(person);
        mv.addObject("people", service.findAll());
        mv.setViewName("result");


        return mv;
    }
}

与此

@RequestMapping(value = "/update/{id}", method = RequestMethod.POST)
    public ModelAndView update(@Valid @ModelAttribute Person person,
        BindingResult result,
        @PathVariable long id
        ) {
        ModelAndView mv = new ModelAndView();
        if (result.hasErrors()) {
            person.setId(id);
            mv.setViewName("update");
            return mv; // ADD THIS RETURN HERE.
        }
        service.update(person);
        mv.addObject("people", service.findAll());
        mv.setViewName("result");


        return mv;
    }
}

答案 1 :(得分:1)

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