osworkflow配置有关问题(主要是propertyset的事务配置spring2方式)
osworkflow配置问题(主要是propertyset的事务配置spring2方式)
看了陈刚写的osworkflow开发指南和工作手册,下载了osworkflow_bundle2,按同样的方法搭建好了平台
写了一个简单的请假流程,测试正常
环境:Hibernate3.2+spring2.0+struts2.0+osworkflow2.8
但是:只要osworkflow流程配置中有使用 beanshell 就会出现错误
我是采用 aspectJ的配置方式 配置事务管理,现在就是这里spring中事务配置会出错,而陈刚的文档中是采用spring1.0的配置方式
web.xml我配置了opensessioninview
出错部分
Hibernate: select SEQ_WF_ENTRY.nextval from dual
[DEBUG] 15:50:31,922 [com.opensymphony.module.propertyset.hibernate3.HibernatePropertySet] - Setting up property set with hibernate provider passed in args.
[DEBUG] 15:50:32,281 [com.opensymphony.module.propertyset.hibernate3.HibernatePropertySetDAOImpl] - findByKey entityName:OSWorkflowEntry|entityId:45|key:dayCount
[DEBUG] 15:50:32,281 [com.opensymphony.module.propertyset.hibernate3.HibernatePropertySetDAOImpl] - getItem entityName:OSWorkflowEntry|entityId:45|key:dayCount
Hibernate: select propertyse0_.entity_name as entity1_5_0_, propertyse0_.entity_id as entity2_5_0_, propertyse0_.entity_key as entity3_5_0_, propertyse0_.key_type as key4_5_0_, propertyse0_.boolean_val as boolean5_5_0_, propertyse0_.double_val as double6_5_0_, propertyse0_.string_val as string7_5_0_, propertyse0_.long_val as long8_5_0_, propertyse0_.int_val as int9_5_0_, propertyse0_.date_val as date10_5_0_ from OS_PROPERTYENTRY propertyse0_ where propertyse0_.entity_name=? and propertyse0_.entity_id=? and propertyse0_.entity_key=?
com.opensymphony.workflow.WorkflowException: Evaluation error while running BSH function script: root cause: Could not save key 'dayCount':Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
at com.opensymphony.workflow.util.beanshell.BeanShellFunctionProvider.execute(BeanShellFunctionProvider.java:66)
at com.opensymphony.workflow.AbstractWorkflow.executeFunction(AbstractWorkflow.java:869)
at com.opensymphony.workflow.AbstractWorkflow.transitionWorkflow(AbstractWorkflow.java:1042)
at com.opensymphony.workflow.AbstractWorkflow.initialize(AbstractWorkflow.java:618)
at org.apache.jsp.test1_jsp._jspService(test1_jsp.java:120)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:413)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:99)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:738)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
Caused by: com.opensymphony.module.propertyset.PropertyException: Could not save key 'dayCount':Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
at com.opensymphony.module.propertyset.hibernate3.HibernatePropertySetDAOImpl.setImpl(HibernatePropertySetDAOImpl.java:61)
at com.opensymphony.module.propertyset.hibernate3.HibernatePropertySet.setImpl(HibernatePropertySet.java:198)
at com.opensymphony.module.propertyset.AbstractPropertySet.set(AbstractPropertySet.java:502)
at com.opensymphony.module.propertyset.AbstractPropertySet.setString(AbstractPropertySet.java:300)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at bsh.Reflect.invokeMethod(Unknown Source)
at bsh.Reflect.invokeObjectMethod(Unknown Source)
at bsh.Name.invokeMethod(Unknown Source)
at bsh.BSHMethodInvocation.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.Interpreter.eval(Unknown Source)
at bsh.Interpreter.eval(Unknown Source)
at bsh.Interpreter.eval(Unknown Source)
at com.opensymphony.workflow.util.beanshell.BeanShellFunctionProvider.execute(BeanShellFunctionProvider.java:60)
... 39 more
希望路过的朋友能指点一下,我非常感谢你的回复
附applicationContext部分配置
看了陈刚写的osworkflow开发指南和工作手册,下载了osworkflow_bundle2,按同样的方法搭建好了平台
写了一个简单的请假流程,测试正常
环境:Hibernate3.2+spring2.0+struts2.0+osworkflow2.8
但是:只要osworkflow流程配置中有使用 beanshell 就会出现错误
我是采用 aspectJ的配置方式 配置事务管理,现在就是这里spring中事务配置会出错,而陈刚的文档中是采用spring1.0的配置方式
web.xml我配置了opensessioninview
出错部分
引用
Hibernate: select SEQ_WF_ENTRY.nextval from dual
[DEBUG] 15:50:31,922 [com.opensymphony.module.propertyset.hibernate3.HibernatePropertySet] - Setting up property set with hibernate provider passed in args.
[DEBUG] 15:50:32,281 [com.opensymphony.module.propertyset.hibernate3.HibernatePropertySetDAOImpl] - findByKey entityName:OSWorkflowEntry|entityId:45|key:dayCount
[DEBUG] 15:50:32,281 [com.opensymphony.module.propertyset.hibernate3.HibernatePropertySetDAOImpl] - getItem entityName:OSWorkflowEntry|entityId:45|key:dayCount
Hibernate: select propertyse0_.entity_name as entity1_5_0_, propertyse0_.entity_id as entity2_5_0_, propertyse0_.entity_key as entity3_5_0_, propertyse0_.key_type as key4_5_0_, propertyse0_.boolean_val as boolean5_5_0_, propertyse0_.double_val as double6_5_0_, propertyse0_.string_val as string7_5_0_, propertyse0_.long_val as long8_5_0_, propertyse0_.int_val as int9_5_0_, propertyse0_.date_val as date10_5_0_ from OS_PROPERTYENTRY propertyse0_ where propertyse0_.entity_name=? and propertyse0_.entity_id=? and propertyse0_.entity_key=?
com.opensymphony.workflow.WorkflowException: Evaluation error while running BSH function script: root cause: Could not save key 'dayCount':Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
at com.opensymphony.workflow.util.beanshell.BeanShellFunctionProvider.execute(BeanShellFunctionProvider.java:66)
at com.opensymphony.workflow.AbstractWorkflow.executeFunction(AbstractWorkflow.java:869)
at com.opensymphony.workflow.AbstractWorkflow.transitionWorkflow(AbstractWorkflow.java:1042)
at com.opensymphony.workflow.AbstractWorkflow.initialize(AbstractWorkflow.java:618)
at org.apache.jsp.test1_jsp._jspService(test1_jsp.java:120)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:413)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:99)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:738)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
Caused by: com.opensymphony.module.propertyset.PropertyException: Could not save key 'dayCount':Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
at com.opensymphony.module.propertyset.hibernate3.HibernatePropertySetDAOImpl.setImpl(HibernatePropertySetDAOImpl.java:61)
at com.opensymphony.module.propertyset.hibernate3.HibernatePropertySet.setImpl(HibernatePropertySet.java:198)
at com.opensymphony.module.propertyset.AbstractPropertySet.set(AbstractPropertySet.java:502)
at com.opensymphony.module.propertyset.AbstractPropertySet.setString(AbstractPropertySet.java:300)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at bsh.Reflect.invokeMethod(Unknown Source)
at bsh.Reflect.invokeObjectMethod(Unknown Source)
at bsh.Name.invokeMethod(Unknown Source)
at bsh.BSHMethodInvocation.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.Interpreter.eval(Unknown Source)
at bsh.Interpreter.eval(Unknown Source)
at bsh.Interpreter.eval(Unknown Source)
at com.opensymphony.workflow.util.beanshell.BeanShellFunctionProvider.execute(BeanShellFunctionProvider.java:60)
... 39 more
希望路过的朋友能指点一下,我非常感谢你的回复
附applicationContext部分配置
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="lobHandler" ref="oracleLobHandler" /> <property name="hibernateProperties" ref="hibernateProperties" /> <property name="annotatedClasses"> <list> <value>com.zy.model.Announces</value> </list> </property> <!-- property name="mappingDirectoryLocations" --> <property name="mappingResources"> <list> <value>com/opensymphony/workflow/spi/hibernate3/HibernateCurrentStep.hbm.xml</value> <value>com/opensymphony/workflow/spi/hibernate3/HibernateCurrentStepPrev.hbm.xml</value> <value>com/opensymphony/workflow/spi/hibernate3/HibernateHistoryStep.hbm.xml</value> <value>com/opensymphony/workflow/spi/hibernate3/HibernateHistoryStepPrev.hbm.xml</value> <value>com/opensymphony/workflow/spi/hibernate3/HibernateWorkflowEntry.hbm.xml</value> <value>com/opensymphony/module/propertyset/hibernate3/PropertySetItem.hbm.xml</value> </list> </property> </bean> <!-- =========定义事务拦截器(aspectJ的配置方式)====================================================== --> <tx:annotation-driven /> <aop:aspectj-autoproxy/> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="get*" read-only="true" /> <tx:method name="find*" read-only="true" /> <tx:method name="load*" read-only="true" /> <tx:method name="save*" /> <tx:method name="create*" /> <tx:method name="remove*" /> <tx:method name="update*" /> <tx:method name="del*" /> <tx:method name="set*" /> <tx:method name="*" /> </tx:attributes> </tx:advice> <aop:config proxy-target-class="true"> <aop:advisor pointcut="execution(* com.zy.dao.hibernate.*HibernateDAO.*(..))" advice-ref="txAdvice" /> <aop:advisor pointcut="execution(* com.zy.service.*Service.*(..))" advice-ref="txAdvice" /> <aop:advisor pointcut="execution(* com.opensymphony.module.propertyset.hibernate3.*.*(..))" advice-ref="txAdvice" /> </aop:config> <!-- osworkflow --> <bean id="propertySetDelegate" class="com.opensymphony.workflow.spi.hibernate3.DefaultHibernatePropertySetDelegate"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> <bean id="workflowStore" class="com.opensymphony.workflow.spi.hibernate3.SpringHibernateWorkflowStore"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> <property name="propertySetDelegate"> <ref bean="propertySetDelegate"/> </property> <property name="cacheable"> <value>true</value> </property> </bean> <bean id="workflowFactory" class="com.opensymphony.workflow.spi.hibernate.SpringWorkflowFactory" init-method="init"> <property name="resource"> <value>workflowdef/workflows.xml</value> </property> <property name="reload"><value>true</value></property> </bean> <bean id="workflowConfiguration" class="com.opensymphony.workflow.config.SpringConfiguration"> <property name="store"> <ref local="workflowStore"/> </property> <property name="factory"> <ref local="workflowFactory"/> </property> </bean> <bean id="workflowTypeResolver" class="com.opensymphony.workflow.util.SpringTypeResolver"></bean> <bean id="propertySetDAO" class="com.opensymphony.module.propertyset.hibernate3.HibernatePropertySetDAOImpl"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- End WorkFlow -->
1 楼
Jamsa
2008-03-27
楼主问题解决了吗?我也遇到了这个问题,OpenSessionInView+Spring2事务配置
2 楼
huayuanmeng
2008-05-20
我也遇到这样的问题!
3 楼
kris811
2008-11-26
解决Hibernate的Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.问题
一般这个错误是事务引起的,如果确定事务没有问题,还是有这个错,可以重写OpenSessionInViewFilter的2个方法
一般这个错误是事务引起的,如果确定事务没有问题,还是有这个错,可以重写OpenSessionInViewFilter的2个方法
public class OpenSessionInViewFilter extends org.springframework.orm.hibernate3.support.OpenSessionInViewFilter { /** * we do a different flushmode than in the codebase * here */ protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException { Session session = SessionFactoryUtils.getSession(sessionFactory, true); session.setFlushMode(FlushMode.COMMIT); return session; } /** * we do an explicit flush here just in case * we do not have an automated flush */ protected void closeSession(Session session, SessionFactory factory) { session.flush(); super.closeSession(session, factory); } }