◎筱米加步枪◎.Blog

Happy coding

JBPM4.3出现Session closed错误解决方法

项目组临近发布版本了,但由于运行过程中出现“Session closed”的错误,发布延迟了两天。

问题已经解决了,虽然不是我解决的,还是记录备忘下:

解决方法:

在EnvironmentFactory对象执行openEnvironment()后获取EnvironmentImpl对象,在操作完最后EnvironmentImpl需要close掉(通常放在finally块中执行)。

代码模版:

		EnvironmentFactory environmentFactory = (EnvironmentFactory)processEngine;
		EnvironmentImpl env = null;
		try {
			env = environmentFactory.openEnvironment();
			//...执行其他相关操作
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			//EnvironmentImpl需要close掉
			if (env != null)
			    env.close();
		}

 

开发简单请假流程DEMO时知识和错误汇总

搞了将近一周,才把这个请假流程给搞定,在这期间遇到的问题N多,其实很感慨的说Struts2的组件超难用的,组件连把布局都加进去了,超郁闷的,不过为了熟悉下struts2还是硬着头皮用了。有涉及到的技术是Struts2+Jbpm4.3.总结下,遇到的问题以及解决方案,以及一些小知识。

①.Struts2部分。

 

  1.Struts2的组件:下拉单选框,存放ValueName是通过list属性。

   list="#{Value1:Name1,Value2:Name2...}" 

     例如:<struts:select name="identity"

           list="#{'personnel':'员工','manager':'经理','boss':'老板'}" />

 

  2.struts.xml配置中,action结点下的result配置,如果result是指向另外一个Action,需指定属性 

   type="redirectAction"

    例如:

    <result name="manager" type="redirectAction">/showTask.action</result>

 

  3.Struts2中的requestresponse以及Session获取方式:

private ActionContext context = ActionContext.getContext();

//获取Request

private HttpServletRequest request = (HttpServletRequest) context.get(ServletActionContext.HTTP_REQUEST);

//获取Response

private HttpServletResponse response = (HttpServletResponse) context.get(ServletActionContext.HTTP_RESPONSE);

//获取Session

private Map<String,Object> session = context.getSession();

 

   4.表单的属性名会通过set方法传入到action中的属性名,action处理的结果通过相应的get方法来传入到页面上。就不用像以前Struts1那样通过ActionForm来传递了

   5.struts2的标签获取session中的值,

   如:<struts:property value="#session.loginUser.name"/>

 

   6.访问出错:No result defined for action XXX and result success

       解决方法:package结点添加属性 namespace="/"

 

   7.jsp页面上用流的方式输出图片,出现

    getOutputStream() has already been called for this response异常

       解决方法:

            在流输出后加入以下两行代码:

 

 

out.clear();

out = pageContext.pushBody();

 

 

 ②.Spring (做其他DEMO单元测试时问题)

    1.org.springframework.orm.hibernate3.HibernateSystemException: Unknown entity

      原因:在配置文件中没有找到对于的PO对象,加入类似于如下代码即可:

 

<!-- 我记得以前指定名字叫packagesToScan就可的,现在要指定annotatedClasses -->

<property name="annotatedClasses">

<list>

<value>com.shine.jpbm4.po.WfBusiness</value>

<value>com.shine.jpbm4.po.WfStep</value>

<value>com.shine.jpbm4.po.WorkflowBusiInfo</value>

</list>

</property>

    2.使用Springbean属性拷贝工具类,不允许名字一样,而类型却不一样

 

 

 ③.Jbpm4.3 部分

    1.TaskService进行completeTask(taskId,variables)时出现

    No unnamed transitions were found for the task for 'XXX'错误.

      原因JPDL文件定义中,每个transition都有指定对应的名字,如果指定了名字,在进行completeTask时必须指定transtion名字,其实也不 一定是transtion的名字,还有可能是其他类型结点的名字,我们统称为outCome

      解决方法:使用completeTask(taskId,outCome,vauables)方式进行提交任务。

   

    2.对上面的补充,可通过TaskService获取指定taskId的所有outComes

   方:taskService.getOutcomes(taskId);

 

    3.org.hibernate.HibernateException: instance not of expected entity type

        原因进行变量的传输的时候,实体要序列化,实体内部包含的实体也都必须序列化,即实现Serializable接口

   

    4.Jbpm乱码问题:

       当提交的表单POST方式提交的时候,遇到的乱码问题,因为JPDL.XML文件指定的是UTF-8编码,但是Tomcat处理提交数据默认是使用ISO-8859-1,因此需要设置提交requet的编码,以前都使用过滤器进行的,为了简单起见,直接指定requestUTF-8编码格式,request.setCharacterEncoding("UTF-8")

Jbpm4.3和Tomcat6.0兼容问题

最近在研究,想自己随便搞个请假流程,环境是Jbpm4.3 Tomcat6.0,出师不利,刚启动Tomcat就报如下错误:

javax.servlet.ServletException: java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.getExpressionFactory()Ljavax/el/ExpressionFactory;" the class loader (instance of org/apache/jasper/servlet/JasperLoader) of the current class, org/apache/jsp/index_jsp, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, javax/servlet/jsp/JspApplicationContext, have different Class objects for the type javax/el/ExpressionFactory used in the signature

百度之得原因:

原来Jbpm4.3 下的juel.jar, juel-engine.jar, juel-impl.jar包和Tomcat6.0中的el-api.jar包冲突了。

解决方法如下:

 1.将juel.jar, juel-engine.jar, juel-impl.jar拷贝到Tomcat6.0 的lib目录下

2.删除Tomat6.0中lib下的el-api.jar

3.要把项目中的juel.jar, juel-engine.jar, juel-impl.jar包去掉

OK~~再测试成功~~

Eclipse下安装GPD插件的方法

GPD(Graphical Process Designer )图形化流程定义,是一个插件,可安装与Eclipse中,用户可视化的开发流程定义的文件(*.jpdl.xml),其实就是编辑xml文件而已,只是他这个插件符合JPDL的规范,就类似于MyEclipse中的可以对Struts的配置文件进行可视化编辑一样。现在来讲讲安装GPD插件的具体步骤:

1.下载jpbm-4.3.zip 下载地址:sourceforge.net/projects/jbpm/files/

2.在Eclipse中 [ Help ]>> [ install new software ] 在弹出框中选择 [ add ] 按钮 在弹出的小框框中选择 [ Archive.. ] 按钮 添加刚才下载好的东西 :选择{jbpm_home}/install/src/gpd/jbpm-gpd-site.zip 在出现的组件中全选然后一路next直到finish即可,如图: