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

mry*_*nus 5 validation hibernate jpa spring-boot

首先对我的语言感到抱歉,英语不是我的母语

\n\n

任何帮助将不胜感激

\n\n

我正在尝试使用 JPA 开发基本的 Spring Boot 应用程序。我已经完成了项目的大部分内容,并且项目还包括表单验证。每当我尝试添加新的 Person 时,它都运行良好,我可以获得正确的验证来自验证器的消息,我也可以毫无问题地更新此人,但每当我在更新表单中出错时,验证器都会导致此错误

\n\n

错误

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

我在互联网上查看了一些解决方案,但它对我不起作用。这里是添加新人员的工作验证者

\n\n

添加新人

\n\n

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

\n\n

这是我的控制器

\n\n
package sen3004.app6.web;\n\nimport javax.validation.Valid;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.validation.BindingResult;\nimport org.springframework.web.bind.annotation.ModelAttribute;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport sen3004.app6.model.Person;\nimport sen3004.app6.service.App6Service;\n\n@Controller\npublic class App6Controller {\n\n    @Autowired\n    App6Service service;\n\n    @RequestMapping(value = {"/", "index.html"}, method = RequestMethod.GET)\n    public String getIndex() {\n        return "index";\n    }\n\n\n    @RequestMapping(value = {"/display-form", "create.html"}, method = RequestMethod.GET)\n    public ModelAndView displayForm() {\n        ModelAndView mv = new ModelAndView("form");\n        mv.addObject("person", new Person());\n\n        return mv;\n    }\n\n    @RequestMapping(value = "/send", method = RequestMethod.POST)\n    public ModelAndView processForm(@Valid @ModelAttribute Person person, BindingResult result) {\n        ModelAndView mv = new ModelAndView();\n        mv.addObject("person", person);\n\n        if (result.hasErrors())\n            mv.setViewName("form");\n        else {\n            mv.setViewName("result");\n            service.create(person);\n            mv.addObject("people", service.findAll());\n        }\n\n        return mv;\n    }\n\n    @RequestMapping(value = {"/list-people", "list.html"}, method = RequestMethod.GET)\n    public ModelAndView list() {\n        ModelAndView mv = new ModelAndView("result");\n        mv.addObject("people", service.findAll());\n\n        return mv;\n    }\n\n    @RequestMapping(value = {"/edit/{id}"}, method = RequestMethod.GET)\n    public ModelAndView editList(@PathVariable long id) {\n        ModelAndView mv = new ModelAndView("update");\n        mv.addObject("person", service.findById(id));\n        return mv;\n    }\n\n    @RequestMapping(value = "/update/{id}", method = RequestMethod.POST)\n    public ModelAndView update(@Valid @ModelAttribute Person person,\n                               BindingResult result,\n                               @PathVariable long id\n                               ) {\n        ModelAndView mv = new ModelAndView();\n        if (result.hasErrors()) {\n            person.setId(id);\n            mv.setViewName("update");\n        }\n        service.update(person);\n        mv.addObject("people", service.findAll());\n        mv.setViewName("result");\n\n\n        return mv;\n    }\n\n    @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET)\n    public ModelAndView delete(@PathVariable long id) {\n        ModelAndView mv = new ModelAndView("result");\n        service.delete(id);\n        mv.addObject("people", service.findAll());\n\n        return mv;\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的 IPerson 类和服务类

\n\n
IPerson.java\n\npackage sen3004.app6.service;\n\nimport java.util.List;\n\nimport sen3004.app6.model.Person;\n\npublic interface IPerson {\n    public List<Person> findAll();\n\n    public Person findById(long id);\n\n    public void create(Person person);\n\n    public void delete(long id);\n\n    public void update(Person person);\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

App6Service.java

\n\n
package sen3004.app6.service;\n\nimport java.util.List;\n\nimport javax.transaction.Transactional;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport sen3004.app6.dao.App6Repository;\nimport sen3004.app6.model.Person;\n\n@Service\n@Transactional\npublic class App6Service implements IPerson {\n\n    @Autowired\n    App6Repository repository;\n\n    @Override\n    public List<Person> findAll() {\n        return repository.findAll();\n    }\n\n    @Override\n    public Person findById(long id) {\n        return repository.findById(id);\n    }\n\n    @Override\n    public void create(Person person) {\n        repository.create(person);\n    }\n\n    @Override\n    public void delete(long id) {\n        repository.delete(id);\n    }\n\n    @Override\n    public void update(Person person) {\n        repository.update(person);\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

App6Repository.java

\n\n
package sen3004.app6.dao;\n\nimport java.util.List;\n\nimport javax.persistence.EntityManager;\nimport javax.persistence.PersistenceContext;\n\nimport org.springframework.stereotype.Repository;\n\nimport sen3004.app6.model.Person;\nimport sen3004.app6.service.IPerson;\n\n@Repository\npublic class App6Repository implements IPerson {\n\n    @PersistenceContext\n    private EntityManager entityManager;\n\n    public List<Person> findAll(){\n        return entityManager.createQuery("from Person", Person.class).getResultList();\n    }\n\n    public Person findById(long id){\n        return entityManager.find(Person.class, id);\n    }\n\n    @Override\n    public void update(Person person) {\n        entityManager.merge(person);\n\n    }\n\n    @Override\n    public void create(Person person) {\n        entityManager.persist(person); \n    }\n\n    @Override\n    public void delete(long id) {\n        entityManager.remove(entityManager.getReference(Person.class, id));\n    } \n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

模型\nPerson.java

\n\n
package sen3004.app6.model;\n\nimport java.time.LocalDate;\n\nimport javax.persistence.*;\nimport javax.validation.constraints.*;\n\nimport org.springframework.format.annotation.DateTimeFormat;\n\n@Entity\n@Table(name = "person")\npublic class Person {\n\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    private long id;\n    @Size(min = 3, max = 50)\n    @Column(name = "fname")\n    private String firstName;\n    @Size(min = 3, max = 50)\n    @Column(name = "lname")\n    private String lastName;\n    @Past\n    @DateTimeFormat(pattern = "dd-MM-yyyy")\n    @Column(name = "dob")\n    private LocalDate dateOfBirth;\n    @Min(value = 12)\n    @Column(name = "age")\n    private int age;\n    @Email\n    @Column(name = "email")\n    private String email;\n    @Pattern(regexp = "[0-9\\\\s]{12}")\n    @Column(name = "phone")\n    private String phone;\n\n    public long getId() {\n        return id;\n    }\n\n    public void setId(long id) {\n        this.id = id;\n    }\n\n    public String getFirstName() {\n        return firstName;\n    }\n\n    public void setFirstName(String firstName) {\n        this.firstName = firstName;\n    }\n\n    public String getLastName() {\n        return lastName;\n    }\n\n    public void setLastName(String lastName) {\n        this.lastName = lastName;\n    }\n\n    public LocalDate getDateOfBirth() {\n        return dateOfBirth;\n    }\n\n    public void setDateOfBirth(LocalDate dateOfBirth) {\n        this.dateOfBirth = dateOfBirth;\n    }\n\n    public int getAge() {\n        return age;\n    }\n\n    public void setAge(int age) {\n        this.age = age;\n    }\n\n    public String getEmail() {\n        return email;\n    }\n\n    public void setEmail(String email) {\n        this.email = email;\n    }\n\n    public String getPhone() {\n        return phone;\n    }\n\n    public void setPhone(String phone) {\n        this.phone = phone;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

app6application.java

\n\n
package sen3004.app6;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class App6Application {\n\n    public static void main(String[] args) {\n        SpringApplication.run(App6Application.class, args);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

消息.属性

\n\n
Size.person.firstName=Value must contain at least 3, at most 50 characters.\nSize.person.lastName=Value must contain at least 3, at most 50 characters.\nPast.person.dateOfBirth=Value must be a past date.\ntypeMismatch.person.dateOfBirth=Value must be a valid date (dd-mm-yyyy).\nMin.person.age=Our patients must have completed the age of 12 as per the age policy!\nEmail.person.email=You must give valid Email!\nPattern.person.phone=Phone number that given is invalid! For ex.: 9053839052094\ngreeting=Hello! Welcome to Our Site!\nlang.change=Change The Language\nlang.eng=English\nlang.tr=Turkish\nmsg.addperson =Add Person\nmsg.firstname=First Name\nmsg.lastname=Last Name\nmsg.dateOfBirth=Date Of Birth\nmsg.age=Age\nmsg.email=Email\nmsg.phone=Phone\nmsg.persons=Persons\nmsg.noperson=No Person Found!\nmsg.id=ID\nmsg.updateperson=Update Person\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新.jsp

\n\n
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>\n<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>\n<%@ taglib prefix="s" uri="http://www.springframework.org/tags" %>\n<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>\n<!DOCTYPE html>\n<html>\n<head>\n    <meta charset="utf-8">\n    <meta http-equiv="x-ua-compatible" content="ie=edge">\n    <title><s:message code="msg.updateperson"/></title>\n    <meta name=