2016-07-04 58 views
0

我正在尝试将项目从grails 2.5.4升级到3.1.8,现在我陷入了以下错误。从Grails 2.5.4升级到3.1.8,GORM错误

org.springframework.dao.DataAccessResourceFailureException: Could not obtain current Hibernate Session; nested exception is org.hibernate.HibernateException: No Session found for current thread 
org.grails.orm.hibernate.GrailsHibernateTemplate.getSession(GrailsHibernateTemplate.java:227) 
org.grails.orm.hibernate.GrailsHibernateTemplate.doExecute(GrailsHibernateTemplate.java:183) 
org.grails.orm.hibernate.GrailsHibernateTemplate.execute(GrailsHibernateTemplate.java:140) 
org.grails.orm.hibernate.GrailsHibernateTemplate.execute(GrailsHibernateTemplate.java:110) 
org.grails.orm.hibernate.AbstractHibernateGormStaticApi.findWhere(AbstractHibernateGormStaticApi.groovy:335) 
org.grails.datastore.gorm.GormStaticApi.findWhere(GormStaticApi.groovy:658) 
org.grails.datastore.gorm.GormEntity$Trait$Helper.findWhere(GormEntity.groovy:841) 
org.grails.datastore.gorm.GormEntity$Trait$Helper$findWhere$4.call(Unknown Source) 
com.etherapia.portal.security.User.findWhere(User.groovy) 
com.etherapia.portal.security.User$findWhere$0.call(Unknown Source) 
grails.plugin.springsecurity.userdetails.GormUserDetailsService.$tt__loadUserByUsername(GormUserDetailsService.groovy:60) 
grails.plugin.springsecurity.userdetails.GormUserDetailsService$_loadUserByUsername_closure1.doCall(GormUserDetailsService.groovy) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
java.lang.reflect.Method.invoke(Method.java:498) 
org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1426) 
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) 
groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) 
org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294) 
groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1021) 
groovy.lang.Closure.call(Closure.java:426) 
groovy.lang.Closure.call(Closure.java:442) 
grails.transaction.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:96) 
org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133) 
grails.transaction.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:93) 
grails.plugin.springsecurity.userdetails.GormUserDetailsService.loadUserByUsername(GormUserDetailsService.groovy) 
grails.plugin.springsecurity.userdetails.GormUserDetailsService.loadUserByUsername(GormUserDetailsService.groovy:71) 
org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices.processAutoLoginCookie(TokenBasedRememberMeServices.java:123) 
org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices.autoLogin(AbstractRememberMeServices.java:113) 
org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:97) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:169) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:205) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.groovy:62) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:91) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
grails.plugin.springsecurity.web.SecurityRequestHolderFilter.doFilter(SecurityRequestHolderFilter.groovy:58) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213) 
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176) 
org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:75) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:103) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 

root cause 

org.hibernate.HibernateException: No Session found for current thread 
org.grails.orm.hibernate.GrailsSessionContext.currentSession(GrailsSessionContext.java:117) 
org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014) 
org.grails.orm.hibernate.SessionFactoryProxy.getCurrentSession(SessionFactoryProxy.java:148) 
org.grails.orm.hibernate.GrailsHibernateTemplate.getSession(GrailsHibernateTemplate.java:225) 
org.grails.orm.hibernate.GrailsHibernateTemplate.doExecute(GrailsHibernateTemplate.java:183) 
org.grails.orm.hibernate.GrailsHibernateTemplate.execute(GrailsHibernateTemplate.java:140) 
org.grails.orm.hibernate.GrailsHibernateTemplate.execute(GrailsHibernateTemplate.java:110) 
org.grails.orm.hibernate.AbstractHibernateGormStaticApi.findWhere(AbstractHibernateGormStaticApi.groovy:335) 
org.grails.datastore.gorm.GormStaticApi.findWhere(GormStaticApi.groovy:658) 
org.grails.datastore.gorm.GormEntity$Trait$Helper.findWhere(GormEntity.groovy:841) 
org.grails.datastore.gorm.GormEntity$Trait$Helper$findWhere$4.call(Unknown Source) 
com.etherapia.portal.security.User.findWhere(User.groovy) 
com.etherapia.portal.security.User$findWhere$0.call(Unknown Source) 
grails.plugin.springsecurity.userdetails.GormUserDetailsService.$tt__loadUserByUsername(GormUserDetailsService.groovy:60) 
grails.plugin.springsecurity.userdetails.GormUserDetailsService$_loadUserByUsername_closure1.doCall(GormUserDetailsService.groovy) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 

错误只显示在mozzila firefox中,而chroome加载页面没有资产。图像,css,js在chroome中未正确加载。

你知道哪里可能是一个问题?

+0

错误所在位置:com.etherapia.portal.security.User.findWhere(User.groovy) com.etherapia.portal.security.User $ findWhere $ 0.call(来源不明) grails.plugin (GormUserDetailsS​​ervice.groovy:60) grails.plugin.springsecurity.userdetails.GormUserDetailsS​​ervice $ _loadUserByUsername_closure1.doCall(GormUserDetailsS​​ervice.groovy)实际的错误是org.hibernate.HibernateException:没有找到当前会话线。也许你需要将它包装在@Transactional中 - 恐怕不是很多。 – Vahid

+0

你解决了你的问题吗?我面对同样的事情,没有休眠会话时应该有 –

+0

@ Chris.D是的,不幸的是我不记得如何。据我记得,我们回滚了我在升级过程中所做的一些更改。然后我们在第二次尝试升级时没有遇到错误,所以我们很高兴,但是我可能没有解决问题。从那以后,我升级了另一个项目,但我也没有遇到这个问题。我很抱歉,我无法帮助你。 :( –

回答

0

在spring security core插件的3.1.1版本中,生成异常的方法被标注为@Transactional(见下文)。也许你正在使用旧版本?

class GormUserDetailsService implements GrailsUserDetailsService { 

    protected Logger log = LoggerFactory.getLogger(getClass()) 

    /** 
    * Some Spring Security classes (e.g. RoleHierarchyVoter) expect at least one role, so 
    * we give a user with no granted roles this one which gets past that restriction but 
    * doesn't grant anything. 
    */ 
    static final GrantedAuthority NO_ROLE = new SimpleGrantedAuthority(SpringSecurityUtils.NO_ROLE) 

    /** Dependency injection for the application. */ 
    GrailsApplication grailsApplication 

    @Transactional(readOnly=true, noRollbackFor=[IllegalArgumentException, UsernameNotFoundException]) 
    UserDetails loadUserByUsername(String username, boolean loadRoles) throws UsernameNotFoundException { 

     def conf = SpringSecurityUtils.securityConfig 
     String userClassName = conf.userLookup.userDomainClassName 
     def dc = grailsApplication.getDomainClass(userClassName) 
     if (!dc) { 
      throw new IllegalArgumentException("The specified user domain class '$userClassName' is not a domain class") 
     } 

     Class<?> User = dc.clazz 

     def user = User.findWhere((conf.userLookup.usernamePropertyName): username) 
     if (!user) { 
      log.warn 'User not found: {}', username 
      throw new NoStackUsernameNotFoundException() 
     } 

     Collection<GrantedAuthority> authorities = loadAuthorities(user, username, loadRoles) 
     createUserDetails user, authorities 
    } 
... 
}