Jasig CAS.如何使用jpatiketregistry启用事务



使用maven覆盖。我只配置了cas。属性 (db连接部分),ticketRegistry.xmlpom.xml还稍微修改了类jpatickeregistry 以获得更多的调试信息。从日志中可以看出,getTicket方法没有事务(postgres @Lob (oid)需要)。软件版本:tomcat 8.0.28 , psql (PostgreSQL) 9.4.4 , (Jasig)中科院 4.1.0

// @Transactional(readOnly=true) Spring AOP Declarative transaction is being used, so @Transactional(readOnly=true) it's just some old code.
@Override
public Ticket getTicket(final String ticketId) {
    return getProxiedTicketInstance(getRawTicket(ticketId));
}
/**
 * Gets the ticket from the database, as is.
 *
 * @param ticketId the ticket id
 * @return the raw ticket
 */
private Ticket getRawTicket(final String ticketId) {
    try {
        if(TransactionSynchronizationManager.isActualTransactionActive()) {
            logger.debug("Ticket getRawTicket - Active transaction found");
        } else {
            logger.error("Ticket getRawTicket No active transaction found");
        }
        if (ticketId.startsWith(this.ticketGrantingTicketPrefix)) {
            return entityManager.find(TicketGrantingTicketImpl.class, ticketId);
        }
        return entityManager.find(ServiceTicketImpl.class, ticketId);
    } catch (final Exception e) {
        logger.error("Error2 getting ticket from registry.", e);
        logger.error("Error getting ticket {} from registry.", ticketId, e);
    }
    return null;
}

pom.xml

      <dependency>
    <groupId>org.jasig.cas</groupId>
    <artifactId>cas-server-support-jdbc</artifactId>
    <version>${cas.version}</version>
  </dependency>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>${hibernate.core.version}</version>
    <scope>runtime</scope>
  </dependency>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>${hibernate.core.version}</version>
    <scope>runtime</scope>
  </dependency>
  <dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>${c3p0.version}</version>
  </dependency>
  <dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.4-1203-jdbc41</version>
  </dependency>
  <dependency>
    <groupId>org.hibernate.javax.persistence</groupId>
    <artifactId>hibernate-jpa-2.1-api</artifactId>
    <version>1.0.0.Final</version>
  </dependency>
</dependencies>
...
<properties>
<cas.version>4.1.0</cas.version>
<pac4j.version>1.7.1</pac4j.version>
<hibernate.core.version>4.3.10.Final</hibernate.core.version>
<c3p0.version>0.9.5.1</c3p0.version>
</properties>

catalina.out

2015-10-19 06:33:26,677 DEBUG [org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner] - <Acquired lock.  Proceeding with cleanup.>
2015-10-19 06:33:26,678 DEBUG [org.springframework.orm.jpa.JpaTransactionManager] - <Creating new transaction with name [org.jasig.cas.ticket.registry.JpaTicketRegistry.getTickets]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly>
2015-10-19 06:33:26,678 DEBUG [org.springframework.orm.jpa.JpaTransactionManager] - <Opened new EntityManager [org.hibernate.jpa.internal.EntityManagerImpl@1c6f308] for JPA transaction>
2015-10-19 06:33:26,680 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] - <Setting JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@30b2ed10 [wrapping: org.postgresql.jdbc4.Jdbc4Connection@5286a372]] read-only>
2015-10-19 06:33:26,680 DEBUG [org.springframework.orm.jpa.JpaTransactionManager] - <Exposing JPA transaction as JDBC transaction [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@449e31c9]>
Hibernate: select ticketgran0_.ID as ID1_2_, ticketgran0_.NUMBER_OF_TIMES_USED as NUMBER_O2_2_, ticketgran0_.CREATION_TIME as CREATION3_2_, ticketgran0_.EXPIRATION_POLICY as EXPIRATI4_2_, ticketgran0_.LAST_TIME_USED as LAST_TIM5_2_, ticketgran0_.PREVIOUS_LAST_TIME_USED as PREVIOUS6_2_, ticketgran0_.ticketGrantingTicket_ID as ticketG12_2_, ticketgran0_.AUTHENTICATION as AUTHENTI7_2_, ticketgran0_.EXPIRED as EXPIRED8_2_, ticketgran0_.PROXIED_BY as PROXIED_9_2_, ticketgran0_.SERVICES_GRANTED_ACCESS_TO as SERVICE10_2_, ticketgran0_.SUPPLEMENTAL_AUTHENTICATIONS as SUPPLEM11_2_ from TICKETGRANTINGTICKET ticketgran0_
Hibernate: select servicetic0_.ID as ID1_1_, servicetic0_.NUMBER_OF_TIMES_USED as NUMBER_O2_1_, servicetic0_.CREATION_TIME as CREATION3_1_, servicetic0_.EXPIRATION_POLICY as EXPIRATI4_1_, servicetic0_.LAST_TIME_USED as LAST_TIM5_1_, servicetic0_.PREVIOUS_LAST_TIME_USED as PREVIOUS6_1_, servicetic0_.ticketGrantingTicket_ID as ticketG10_1_, servicetic0_.FROM_NEW_LOGIN as FROM_NEW7_1_, servicetic0_.TICKET_ALREADY_GRANTED as TICKET_A8_1_, servicetic0_.SERVICE as SERVICE9_1_ from SERVICETICKET servicetic0_
2015-10-19 06:33:26,829 DEBUG [org.springframework.orm.jpa.JpaTransactionManager] - <Initiating transaction commit>
2015-10-19 06:33:26,829 DEBUG [org.springframework.orm.jpa.JpaTransactionManager] - <Committing JPA transaction on EntityManager [org.hibernate.jpa.internal.EntityManagerImpl@1c6f308]>
2015-10-19 06:33:26,829 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] - <Resetting read-only flag of JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@30b2ed10 [wrapping: org.postgresql.jdbc4.Jdbc4Connection@5286a372]]>
2015-10-19 06:33:26,829 DEBUG [org.springframework.orm.jpa.JpaTransactionManager] - <Closing JPA EntityManager [org.hibernate.jpa.internal.EntityManagerImpl@1c6f308] after transaction>
2015-10-19 06:33:26,829 DEBUG [org.springframework.orm.jpa.EntityManagerFactoryUtils] - <Closing JPA EntityManager>
2015-10-19 06:33:26,836 INFO [org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner] - <13 expired tickets found to be removed.>
2015-10-19 06:33:26,836 INFO [org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner] - <13 expired tickets found to be removed.>
2015-10-19 06:33:26,837 DEBUG [org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner] - <Cleaning up expired ticket-granting ticket [TGT-**********************************************O15x2xEhlF-myhost.com]>
2015-10-19 06:33:26,837 DEBUG [org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner] - <Cleaning up expired ticket-granting ticket [TGT-**********************************************O15x2xEhlF-myhost.com]>
2015-10-19 06:33:26,837 DEBUG [org.jasig.cas.CentralAuthenticationServiceImpl] - <Removing ticket [TGT-**********************************************O15x2xEhlF-myhost.com] from registry...>
2015-10-19 06:33:26,837 DEBUG [org.jasig.cas.CentralAuthenticationServiceImpl] - <Removing ticket [TGT-**********************************************O15x2xEhlF-myhost.com] from registry...>
2015-10-19 06:33:26,837 ERROR [org.jasig.cas.ticket.registry.JpaTicketRegistry] - <Ticket getRawTicket No active transaction found>
2015-10-19 06:33:26,837 ERROR [org.jasig.cas.ticket.registry.JpaTicketRegistry] - <Ticket getRawTicket No active transaction found>
2015-10-19 06:33:26,837 DEBUG [org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler] - <Creating new EntityManager for shared EntityManager invocation>
Hibernate: select ticketgran0_.ID as ID1_2_0_, ticketgran0_.NUMBER_OF_TIMES_USED as NUMBER_O2_2_0_, ticketgran0_.CREATION_TIME as CREATION3_2_0_, ticketgran0_.EXPIRATION_POLICY as EXPIRATI4_2_0_, ticketgran0_.LAST_TIME_USED as LAST_TIM5_2_0_, ticketgran0_.PREVIOUS_LAST_TIME_USED as PREVIOUS6_2_0_, ticketgran0_.ticketGrantingTicket_ID as ticketG12_2_0_, ticketgran0_.AUTHENTICATION as AUTHENTI7_2_0_, ticketgran0_.EXPIRED as EXPIRED8_2_0_, ticketgran0_.PROXIED_BY as PROXIED_9_2_0_, ticketgran0_.SERVICES_GRANTED_ACCESS_TO as SERVICE10_2_0_, ticketgran0_.SUPPLEMENTAL_AUTHENTICATIONS as SUPPLEM11_2_0_, ticketgran1_.ID as ID1_2_1_, ticketgran1_.NUMBER_OF_TIMES_USED as NUMBER_O2_2_1_, ticketgran1_.CREATION_TIME as CREATION3_2_1_, ticketgran1_.EXPIRATION_POLICY as EXPIRATI4_2_1_, ticketgran1_.LAST_TIME_USED as LAST_TIM5_2_1_, ticketgran1_.PREVIOUS_LAST_TIME_USED as PREVIOUS6_2_1_, ticketgran1_.ticketGrantingTicket_ID as ticketG12_2_1_, ticketgran1_.AUTHENTICATION as AUTHENTI7_2_1_, ticketgran1_.EXPIRED as EXPIRED8_2_1_, ticketgran1_.PROXIED_BY as PROXIED_9_2_1_, ticketgran1_.SERVICES_GRANTED_ACCESS_TO as SERVICE10_2_1_, ticketgran1_.SUPPLEMENTAL_AUTHENTICATIONS as SUPPLEM11_2_1_ from TICKETGRANTINGTICKET ticketgran0_ left outer join TICKETGRANTINGTICKET ticketgran1_ on ticketgran0_.ticketGrantingTicket_ID=ticketgran1_.ID where ticketgran0_.ID=?
19-Oct-2015 06:33:26.838 INFO [scheduler_Worker-1] org.hibernate.event.internal.DefaultLoadEventListener.onLoad HHH000327: Error performing load command : org.hibernate.HibernateException: org.postgresql.util.PSQLException: Large Objects may not be used in auto-commit mode.
2015-10-19 06:33:26,838 DEBUG [org.springframework.orm.jpa.EntityManagerFactoryUtils] - <Closing JPA EntityManager>
2015-10-19 06:33:26,839 ERROR [org.jasig.cas.ticket.registry.JpaTicketRegistry] - <Error2 getting ticket from registry.
javax.persistence.PersistenceException: org.hibernate.HibernateException: org.postgresql.util.PSQLException: Large Objects may not be used in auto-commit mode.

异常堆栈:

javax.persistence.PersistenceException: org.hibernate.HibernateException: org.postgresql.util.PSQLException: Large Objects may not be used in auto-commit mode.
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1694)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:1141)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:1068)
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:497)
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:344)
at com.sun.proxy.$Proxy52.find(Unknown Source)
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:497)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:291)
at com.sun.proxy.$Proxy52.find(Unknown Source)
at org.jasig.cas.ticket.registry.JpaTicketRegistry.getRawTicket(JpaTicketRegistry.java:161)
at org.jasig.cas.ticket.registry.JpaTicketRegistry.getTicket(JpaTicketRegistry.java:141)
at org.jasig.cas.ticket.registry.AbstractTicketRegistry.getTicket_aroundBody0(AbstractTicketRegistry.java:50)
at org.jasig.cas.ticket.registry.AbstractTicketRegistry$AjcClosure1.run(AbstractTicketRegistry.java:1)
at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149)
at org.jasig.inspektr.aspect.TraceLogAspect.traceMethod(TraceLogAspect.java:44)
at org.jasig.cas.ticket.registry.AbstractTicketRegistry.getTicket(AbstractTicketRegistry.java:48)
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:497)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy53.getTicket(Unknown Source)
at org.jasig.cas.CentralAuthenticationServiceImpl.getTicket_aroundBody12(CentralAuthenticationServiceImpl.java:517)
at org.jasig.cas.CentralAuthenticationServiceImpl$AjcClosure13.run_aroundBody0(CentralAuthenticationServiceImpl.java:1)
at org.jasig.cas.CentralAuthenticationServiceImpl$AjcClosure13$AjcClosure1.run(CentralAuthenticationServiceImpl.java:1)
at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149)
at org.jasig.inspektr.aspect.TraceLogAspect.traceMethod(TraceLogAspect.java:44)
at org.jasig.cas.CentralAuthenticationServiceImpl$AjcClosure13.run(CentralAuthenticationServiceImpl.java:1)
at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149)
at org.jasig.inspektr.aspect.TraceLogAspect.traceMethod(TraceLogAspect.java:44)
at org.jasig.cas.CentralAuthenticationServiceImpl.getTicket(CentralAuthenticationServiceImpl.java:516)
at org.jasig.cas.CentralAuthenticationServiceImpl.destroyTicketGrantingTicket_aroundBody0(CentralAuthenticationServiceImpl.java:229)
at org.jasig.cas.CentralAuthenticationServiceImpl$AjcClosure1.run_aroundBody0(CentralAuthenticationServiceImpl.java:1)
at org.jasig.cas.CentralAuthenticationServiceImpl$AjcClosure1$AjcClosure1.run_aroundBody0(CentralAuthenticationServiceImpl.java:1)
at org.jasig.cas.CentralAuthenticationServiceImpl$AjcClosure1$AjcClosure1$AjcClosure1.run(CentralAuthenticationServiceImpl.java:1)
at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149)
at org.jasig.inspektr.aspect.TraceLogAspect.traceMethod(TraceLogAspect.java:44)
at org.jasig.cas.CentralAuthenticationServiceImpl$AjcClosure1$AjcClosure1.run(CentralAuthenticationServiceImpl.java:1)
at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149)
at org.jasig.inspektr.aspect.TraceLogAspect.traceMethod(TraceLogAspect.java:44)
at org.jasig.cas.CentralAuthenticationServiceImpl$AjcClosure1.run(CentralAuthenticationServiceImpl.java:1)
at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149)
at org.jasig.inspektr.aspect.TraceLogAspect.traceMethod(TraceLogAspect.java:44)
at org.jasig.cas.CentralAuthenticationServiceImpl.destroyTicketGrantingTicket(CentralAuthenticationServiceImpl.java:228)
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:497)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)
at org.jasig.inspektr.audit.AuditTrailManagementAspect.handleAuditTrail(AuditTrailManagementAspect.java:128)
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:497)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:610)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:68)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at com.ryantenney.metrics.spring.MeteredMethodInterceptor.invoke(MeteredMethodInterceptor.java:45)
at com.ryantenney.metrics.spring.MeteredMethodInterceptor.invoke(MeteredMethodInterceptor.java:32)
at com.ryantenney.metrics.spring.AbstractMetricMethodInterceptor.invoke(AbstractMetricMethodInterceptor.java:59)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at com.ryantenney.metrics.spring.TimedMethodInterceptor.invoke(TimedMethodInterceptor.java:48)
at com.ryantenney.metrics.spring.TimedMethodInterceptor.invoke(TimedMethodInterceptor.java:34)
at com.ryantenney.metrics.spring.AbstractMetricMethodInterceptor.invoke(AbstractMetricMethodInterceptor.java:59)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy65.destroyTicketGrantingTicket(Unknown Source)
at org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner.clean_aroundBody0(DefaultTicketRegistryCleaner.java:118)
at org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner$AjcClosure1.run_aroundBody0(DefaultTicketRegistryCleaner.java:1)
at org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner$AjcClosure1$AjcClosure1.run(DefaultTicketRegistryCleaner.java:1)
at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149)
at org.jasig.inspektr.aspect.TraceLogAspect.traceMethod(TraceLogAspect.java:44)
at org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner$AjcClosure1.run(DefaultTicketRegistryCleaner.java:1)
at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149)
at org.jasig.inspektr.aspect.TraceLogAspect.traceMethod(TraceLogAspect.java:44)
at org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner.clean(DefaultTicketRegistryCleaner.java:96)
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:497)
at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:269)
at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:257)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:75)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)

UPD1 -尝试同样的配置,但mysql -没有运气- javax.persistence.TransactionRequiredException: no transactional EntityManager可用

2015-10-20 00:13:31,408 DEBUG [org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver] - <Resolving exception from handler [[FlowHandlerMapping.DefaultFlowHandler@7f77437d]]: org.springframework.webflow.execution.ActionExecutionException: Exception thrown executing org.jasig.cas.web.flow.GenerateServiceTicketAction@7dd5c8c0 in state 'generateServiceTicket' of flow 'login' -- action execution attributes were 'map[[empty]]'>
2015-10-20 00:13:31,409 DEBUG [org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver] - <Resolving exception from handler [[FlowHandlerMapping.DefaultFlowHandler@7f77437d]]: org.springframework.webflow.execution.ActionExecutionException: Exception thrown executing org.jasig.cas.web.flow.GenerateServiceTicketAction@7dd5c8c0 in state 'generateServiceTicket' of flow 'login' -- action execution attributes were 'map[[empty]]'>
2015-10-20 00:13:31,410 DEBUG [org.jasig.cas.web.FlowExecutionExceptionResolver] - <Ignoring the received exception due to a type mismatch
org.springframework.webflow.execution.ActionExecutionException: Exception thrown executing org.jasig.cas.web.flow.GenerateServiceTicketAction@7dd5c8c0 in state 'generateServiceTicket' of flow 'login' -- action execution attributes were 'map[[empty]]'
....
Caused by: javax.persistence.TransactionRequiredException: No transactional EntityManager available
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:275)
at com.sun.proxy.$Proxy52.merge(Unknown Source)
at org.jasig.cas.ticket.registry.JpaTicketRegistry.updateTicket(JpaTicketRegistry.java:61)
at org.jasig.cas.ticket.registry.AbstractDistributedTicketRegistry$TicketDelegator.updateTicket(AbstractDistributedTicketRegistry.java:101)
at org.jasig.cas.ticket.registry.AbstractDistributedTicketRegistry$TicketGrantingTicketDelegator.grantServiceTicket_aroundBody6(AbstractDistributedTicketRegistry.java:234)
at org.jasig.cas.ticket.registry.AbstractDistributedTicketRegistry$TicketGrantingTicketDelegator$AjcClosure7.run_aroundBody0(AbstractDistributedTicketRegistry.java:1)
at org.jasig.cas.ticket.registry.AbstractDistributedTicketRegistry$TicketGrantingTicketDelegator$AjcClosure7$AjcClosure1.run_aroundBody0(AbstractDistributedTicketRegistry.java:1)
at org.jasig.cas.ticket.registry.AbstractDistributedTicketRegistry$TicketGrantingTicketDelegator$AjcClosure7$AjcClosure1$AjcClosure1.run(AbstractDistributedTicketRegistry.java:1)
at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149)
at org.jasig.inspektr.aspect.TraceLogAspect.traceMethod(TraceLogAspect.java:44)

日志中清楚地提到了这个错误,即不能使用Auto-commit保存大型对象。我在我的配置中以这种方式禁用它们:

  <beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
                destroy-method="close">
        <beans:property name="driverClassName" value="org.postgresql.Driver"/>
        <beans:property name="url"
                        value="jdbc:postgresql://domain:port/db"/>
        <beans:property name="username" value="user"/>
        <beans:property name="password" value="password"/>
        <beans:property name="removeAbandoned" value="true"/>
        <beans:property name="removeAbandonedTimeout" value="20"/>
        <beans:property name="defaultAutoCommit" value="false"/>
    </beans:bean>

检查我拥有的最后一个属性并禁用它。享受。

事务装饰器在4.1中被移除,以支持aop切入点。x @ commit https://github.com/Jasig/cas/commit/a75af8ea2d14c1cb717ad4d8ace601f8db29f076

调试这个问题时最困难的部分是Postgres的错误消息很容易被误解(发送一个兔子洞)。它看到您没有活动事务,并且状态为以自动提交模式运行,这将导致调试hibernate.connection.autocommit。

添加一些额外的aop切入点和tx:通知项和事务应该按预期开始应用。

<tx:advice id="txAdviceTicketReg" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="add*" read-only="false"/>
        <tx:method name="delete*" read-only="false"/>
        <tx:method name="save*" read-only="false"/>
        <tx:method name="update*" read-only="false"/>
        <tx:method name="get*" read-only="true"/>
        <tx:method name="*" />
    </tx:attributes>
</tx:advice>
<aop:config>
    <aop:pointcut id="ticketRegistryOperations" expression="execution(* org.jasig.cas.ticket.registry.JpaTicketRegistry.*(..))"/>
    <aop:pointcut id="abstractTicketRegistryOperations" expression="execution(* org.jasig.cas.ticket.registry.AbstractTicketRegistry.*(..))"/>
    <aop:pointcut id="ticketRegistryLockingOperations" expression="execution(* org.jasig.cas.ticket.registry.support.JpaLockingStrategy.*(..))"/>
    <aop:advisor advice-ref="txAdviceTicketReg" pointcut-ref="ticketRegistryOperations"/>
    <aop:advisor advice-ref="txAdviceTicketReg" pointcut-ref="abstractTicketRegistryOperations"/>
    <aop:advisor advice-ref="txAdviceTicketReg" pointcut-ref="ticketRegistryLockingOperations"/>
</aop:config>

如果你需要找到额外的类来添加异常。添加下面的记录器条目来观察AOP正在做什么。

<Logger name="org.jasig.inspektr" level="trace" additivity="false">
    <AppenderRef ref="Console" />
</Logger>

看起来CAS文档中有过时的/误导性的说明:

Adjust the src/main/webapp/WEB-INF/spring-configuration/ticketRegistry.xml with the following

解决方案是:dataSourceentityManagerFactory configs必须在相同的上下文/文件中,其中定义了<context:component-scan>(在我的情况下src/main/webapp/WEB-INF/cas-servlet.xml)。

Thanks to Vítor Nóbrega comment/answer

最新更新