title: LocalValidatorFactoryBean causing Spring MVC Internal Server Error
body: <p>I am using JSR-303 bean validation in a Spring MVC project. Everything works fine when I have a JSR-303 provider on the classpath, and leave all other validation settings in their default modes. I'd like to use spring managed beans in my custom validators, so I have added the following config to the org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean declaration:</p>
  
  <pre><code>&lt;property name="jpaPropertyMap"&gt;
      &lt;map&gt;
          &lt;entry key="javax.persistence.validation.factory" value-ref="validator" /&gt;
          &lt;/map&gt;
  &lt;/property&gt;
  </code></pre>
  
  <p>
  When this config is used, it seems like beans annotated with @Valid are still validated within MVC controllers, but instead of MVC then catching the validation failures and presenting them on the form, a HTTP 500 error is caused and I get the following stacktrace from tomcat:</p>
  
  <pre><code>javax.validation.ConstraintViolationException: Validation failed for classes [xxx.model.WebPage] during update time for groups [javax.validation.groups.Default, ]
  List of constraint violations:[
      ConstraintViolationImpl{interpolatedMessage='may not be empty', propertyPath=title, rootBeanClass=class xxx.model.WebPage, messageTemplate='{org.hibernate.validator.constraints.NotEmpty.message}'}
      ConstraintViolationImpl{interpolatedMessage='{SiteUnique.default}', propertyPath=urlAlias, rootBeanClass=class xxx.model.WebPage, messageTemplate='{SiteUnique.default}'}
  ]
      org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:161)
      org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreUpdate(BeanValidationEventListener.java:102)
      org.hibernate.action.EntityUpdateAction.preUpdate(EntityUpdateAction.java:237)
      org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:86)
      org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
      org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265)
      org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:185)
      org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
      org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:64)
      org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:1185)
      org.hibernate.impl.SessionImpl.list(SessionImpl.java:1261)
      org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
      org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:246)
      xxx.model.constraints.SiteUniqueValidator.isValid(SiteUniqueValidator.java:97)
      org.hibernate.validator.engine.ConstraintTree.validateSingleConstraint(ConstraintTree.java:278)
      org.hibernate.validator.engine.ConstraintTree.validateConstraints(ConstraintTree.java:153)
      org.hibernate.validator.engine.ConstraintTree.validateConstraints(ConstraintTree.java:117)
      org.hibernate.validator.metadata.MetaConstraint.validateConstraint(MetaConstraint.java:84)
      org.hibernate.validator.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:452)
      org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:397)
      org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:361)
      org.hibernate.validator.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:313)
      org.hibernate.validator.engine.ValidatorImpl.validate(ValidatorImpl.java:139)
      org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:86)
      org.springframework.validation.DataBinder.validate(DataBinder.java:711)
      org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doBind(HandlerMethodInvoker.java:807)
      org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:359)
      org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171)
      org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
      org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
      org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
      org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
      org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669)
      org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:585)
      javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
      javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
      org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
      org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
      net.sf.ehcache.constructs.web.filter.CachingFilter.buildPage(CachingFilter.java:302)
      net.sf.ehcache.constructs.web.filter.SimpleCachingHeadersPageCachingFilter.buildPage(SimpleCachingHeadersPageCachingFilter.java:120)
      xxx.commons.filters.PageCachingFilter.buildPageInfo(PageCachingFilter.java:64)
      net.sf.ehcache.constructs.web.filter.CachingFilter.doFilter(CachingFilter.java:216)
      net.sf.ehcache.constructs.web.filter.Filter.doFilter(Filter.java:86)
      org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:74)
      org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
      xxx.commons.filters.HttpHeadFilter.doFilter(HttpHeadFilter.java:47)
      org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:369)
      org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
      org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
      org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
      org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97)
      org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
      org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35)
      org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
      org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187)
      org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
      org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
      org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
      org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
      org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
      org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:168)
      org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
      org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
  </code></pre>
  
  <p>Does anyone know why Spring can't process validation errors without displaying an exception when the javax.persistence.validation.factory property is set?</p>