spring-boot hibernate 关闭验证

Posted

技术标签:

【中文标题】spring-boot hibernate 关闭验证【英文标题】:spring-boot hibernate turn off validation 【发布时间】:2017-05-15 04:54:44 【问题描述】:

我遇到了与How to disable Hibernate validation in a Spring Boot project 相同的问题并做了同样的事情。在 application.yml 我有:

jsf:
  PROJECT_STAGE: Development
  primefaces:
    theme: overcast
logging:
  level:
    root: debug


spring:
  datasource:
    initialize: false
    password: heslo
    username: MoneyTracker
    url: jdbc:postgresql://localhost:5432/MT-test
  jpa:
    properties:
      javax:
        persistence:
          validation:
            mode: none
    hibernate:
      ddl-auto: update

所以验证模式应该设置为无,但看起来不是。在日志中我可以看到:

2016-12-30 23:39:44.166  INFO 63192 --- [on(2)-127.0.0.1] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default'
2016-12-30 23:39:44.215 DEBUG 63192 --- [on(2)-127.0.0.1] o.hibernate.jpa.internal.util.LogHelper  : PersistenceUnitInfo [
        name: default
        persistence provider classname: null
        classloader: ParallelWebappClassLoader
  context: ROOT
  delegate: false
----------> Parent Classloader:
java.net.URLClassLoader@6d21714c

        excludeUnlistedClasses: true
        JTA datasource: null
        Non JTA datasource: org.apache.tomcat.jdbc.pool.DataSource@6798b962ConnectionPool[defaultAutoCommit=null; defaultReadOnly=null; defaultTransactionIsolation=-1; defaultCatalog=null; driverClassName=org.postgresql.Driver; maxAct
ive=100; maxIdle=100; minIdle=10; initialSize=10; maxWait=30000; testOnBorrow=true; testOnReturn=false; timeBetweenEvictionRunsMillis=5000; numTestsPerEvictionRun=0; minEvictableIdleTimeMillis=60000; testWhileIdle=false; testOnConnect=
false; password=********; url=jdbc:postgresql://localhost:5432/MT-test; username=MoneyTracker; validationQuery=SELECT 1; validationQueryTimeout=-1; validatorClassName=null; validationInterval=3000; accessToUnderlyingConnectionAllowed=t
rue; removeAbandoned=false; removeAbandonedTimeout=60; logAbandoned=false; connectionProperties=null; initSQL=null; jdbcInterceptors=null; jmxEnabled=true; fairQueue=true; useEquals=true; abandonWhenPercentageFull=0; maxAge=0; useLock=
false; dataSource=null; dataSourceJNDI=null; suspectTimeout=0; alternateUsernameAllowed=false; commitOnReturn=false; rollbackOnReturn=false; useDisposableConnectionFacade=true; logValidationErrors=false; propagateInterruptState=false; 
ignoreExceptionOnPreLoad=false; 
        Transaction type: RESOURCE_LOCAL
        PU root URL: file:/Users/romanrakus/Tomcats/apache-tomcat-8.5.4/webapps/ROOT/WEB-INF/lib/database-1.0-SNAPSHOT.jar
        Shared Cache Mode: UNSPECIFIED
        Validation Mode: AUTO
        Jar files URLs []
        Managed classes names [
                cz.romanrakus.moneytracker.db.entities.Person
                cz.romanrakus.moneytracker.db.entities.PersonRole
                cz.romanrakus.moneytracker.db.entities.SpendingType
                cz.romanrakus.moneytracker.db.entities.PredefinedCsvImport
                cz.romanrakus.moneytracker.db.entities.Spending]
        Mapping files names []
        Properties []

所有设置均已正确加载,但验证模式未正确加载。我做错了吗?

还有关于加载验证模式属性的日志行:

2016-12-30 23:50:01.534 DEBUG 63192 --- [on(7)-127.0.0.1] org.springframework.jndi.JndiTemplate    : Looking up JNDI object with name [java:comp/env/spring.jpa.properties.javax.persistence.validation.mode]
2016-12-30 23:50:01.534 DEBUG 63192 --- [on(7)-127.0.0.1] o.s.jndi.JndiLocatorDelegate             : Converted JNDI name [java:comp/env/spring.jpa.properties.javax.persistence.validation.mode] not found - trying original name [spring.jpa.properties.javax.persistence.validation.mode]. javax.naming.NameNotFoundException: Name [spring.jpa.properties.javax.persistence.validation.mode] is not bound in this Context. Unable to find [spring.jpa.properties.javax.persistence.validation.mode].
2016-12-30 23:50:01.534 DEBUG 63192 --- [on(7)-127.0.0.1] org.springframework.jndi.JndiTemplate    : Looking up JNDI object with name [spring.jpa.properties.javax.persistence.validation.mode]
2016-12-30 23:50:01.534 DEBUG 63192 --- [on(7)-127.0.0.1] o.s.jndi.JndiPropertySource              : JNDI lookup for name [spring.jpa.properties.javax.persistence.validation.mode] threw NamingException with message: Name [spring.jpa.properties.javax.persistence.validation.mode] is not bound in this Context. Unable to find [spring.jpa.properties.javax.persistence.validation.mode].. Returning null.
2016-12-30 23:50:01.534 DEBUG 63192 --- [on(7)-127.0.0.1] o.s.c.e.PropertySourcesPropertyResolver  : Found key 'spring.jpa.properties.javax.persistence.validation.mode' in [applicationConfigurationProperties] with type [String]

为什么验证模式仍设置为 AUTO?我还能做些什么来让验证器类从 spring 注入 bean?

更新

在调试过程中,我发现验证模式已正确解析和设置(即使在日志中还有其他内容)。但是应用程序仍然使用休眠验证器而不是弹簧验证器。我还发现属性javax.persistence.validation.factory 包含对我名为validator 的Bean 的引用。但仍然没有运气:(

我正在使用WebSecurityConfigurerAdapter,我不知道它是否重要。

【问题讨论】:

我认为你的山药无效。该属性的键是“javax.validation.persistent.mode”,但您已经在那里创建了 4 个嵌套对象(键中的每个单词一个)。它绝对不会设置具有该 ID 的属性。 @StephaneNic​​oll 感谢您的评论。正确的属性名称是javax.persistence.validation.mode。当我尝试将嵌套对象更改为点分表示法的一个对象时,它没有任何变化。仍然是AUTO 验证模式。我也尝试设置一些无效值(如invalid),它不会以异常开始(org.hibernate.HibernateException: Unknown validation mode in javax.persistence.validation.mode: invalid)。所以嵌套符号和点符号的工作原理是一样的。 原来我遇到了非常不同的问题。我不得不将验证器(弹簧约束验证器)添加到 JSF。适合我的解决方案是***.com/a/21279420/5788897 【参考方案1】:

原来我遇到了非常不同的问题。我不得不将验证器(弹簧约束验证器)添加到 JSF。适合我的解决方案是***.com/a/21279420/5788897

【讨论】:

以上是关于spring-boot hibernate 关闭验证的主要内容,如果未能解决你的问题,请参考以下文章

grails 3(spring-boot) - 如何配置hibernate二级缓存

深入JVM分析spring-boot应用hibernate-validator

我遇到了使用 spring-boot 2.0.2.RELEASE 进行 Hibernate/lucene 搜索的问题

如何通过使用 JPA + Hibernate 和 Spring-boot 在一个数据库中使用多个模式?

当加载 spring-boot 和 spring-data-jpa 时,Hibernate 无法加载 JPA 2.1 Converter

spring-boot logback sql语句怎么打印