`

完整工作流JBPM项目实战全过程教程4----关于Spring整合jbpm时页面显示流程图出错处理

阅读更多

     在原来项目的基础上来实现流程图动态显示的功能,发现利用JBPM自己写的标签会报错,原因是项目是用Spring整合JBPM的,当引用标签的时候,标签中的处理函数调用JbpmContext就会发生Hibernate 方言错误。

     那如何来处理该错误呢?google了一下,发现了一篇不错的文章,就讲到了这个问题。

    下面我就把关键的部分引用过来,当然为了支持原创,我把地址附上

 http://hi.baidu.com/xiaolangs/blog/item/ea0625fb1d3ff061034f5685.html

                  在JSP页面中显示JBPM流程图

下载jbpm-starters-kit-3.1.x工具包。在包中有.java文件,\jbpm.3\src\java.webapp\org\jbpm\webapp\tag\ProcessImageTag.java与他的\WEB-INF\jbpm.tld,还有文件\jbpm.3\src\java.webapp\org\jbpm\webapp\servlet\ProcessImageServlet.java,在JBPM的例子里,这三个文件共同完成JBPM流程图的显示。

要使两个文件发生作用,必须得在web.xml里配置,配置方法:
<!-- jBPM FileServlet -->
<servlet>
    <servlet-name>ProcessImageServlet</servlet-name>
    <servlet-class>org.jbpm.webapp.servlet.ProcessImageServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ProcessImageServlet</servlet-name>
    <url-pattern>/processimage</url-pattern>
</servlet-mapping>

在页面中使用:<jbpm:processimage task="${taskBean.taskInstanceId}"/> 就会把流程图显示在当前位置。

在实际环境中可能会出现的问题与必要的修改

问题一
如果你是用spring整合的jbpm,那么在两个类里的取JbpmContext方法会出错。
JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext(); //这个是会出问题的。
修改:

1).ProcessImageTag.java的private void initialize()方法里。
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(pageContext.getServletContext());
      JbpmTemplate jbpmTemplate = (JbpmTemplate) wac.getBean("jbpmTemplate");
      jbpmTemplate.execute(new JbpmCallback() {
          public Object doInJbpm(JbpmContext context) {
              if (taskInstanceId > 0) {
                  TaskInstance taskInstance = context.getTaskMgmtSession().loadTaskInstance(taskInstanceId);
                  currentToken = taskInstance.getToken();
              }
              else
              {
                  if (tokenInstanceId > 0)
                      currentToken = context.getGraphSession().loadToken(tokenInstanceId);
              }
              return null;
          }
      });

2).
public class ProcessImageServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private ProcessDefinition processDefinition;
    private byte[] bytes;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        final long processDefinitionId = Long.parseLong( request.getParameter( "definitionId" ) );

        WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext());
        JbpmTemplate jbpmTemplate = (JbpmTemplate) wac.getBean("jbpmTemplate");
        jbpmTemplate.execute(new JbpmCallback() {
            public Object doInJbpm(JbpmContext context) {
                processDefinition = context.getGraphSession().loadProcessDefinition(processDefinitionId);
                bytes = processDefinition.getFileDefinition().getBytes("processimage.jpg");
                return null;
            }
        });

        OutputStream out = response.getOutputStream();
        out.write(bytes);
        out.flush();
    }
}

问题二
如果你的流程是用中文字符,且数据库字符集为utf-8,再数据库中为正确的utf-8内容,也可能会乱码错误。
如:我的数据库里的gpd.xml


出错的类:ProcessImageTag.java
出错行:result[0] = Integer.valueOf(node.attribute("x").getValue());
如果此地为nullpoint错误,是因为上下文的Element root中的字符为乱码。
修改:
原代码:Element rootDiagramElement = DocumentHelper.parseText(new String(gpdBytes)).getRootElement();
修改后:Element rootDiagramElement = DocumentHelper.parseText(new String(gpdBytes, "utf-8")).getRootElement();

说明:有个地方要注意,<jbpm:processimage task="${taskBean.taskInstanceId}"/> 显示图片是以当前的路径为基础的。style="background-image:url(processimage?definitionId=1)",也就是说当页面为:http://localhost/jbpm/workflow/showTaskInstance.jsp时,你所访问的流程图地址为:http://localhost/jbpm/workflow/processimage?definitionId=1,这个地址是错误的,实际地址为:http://localhost/jbpm/processimage?definitionId=1,要正确显示需修改ProcessImageTag.java
原代码:background-image:url(" + imageLink + ");
修改后:background-image:url(" + ((HttpServletRequest) pageContext.getRequest()).getContextPath() + "/" + imageLink + ");

OK,恭喜你成功显示JBPM流程图。

 

 

    嘿嘿,还真管用,流程图显示OK了。后续我会把DIY后的项目源码再上传一份供参考。

5
0
分享到:
评论
4 楼 ZQX123456 2012-10-30  
代码呢、请给个源码吧?
3 楼 yjai_1987 2009-11-03  
我也在关注这个jbpm的流程图显示于操作,我也用这个做了,但是在传图上去时就报错,希望在你看到这个的时间,能把你那个跑通了的项目传一份给我,我的Emil是yjai_1987@yahoo.com.cn
在此谢谢.
2 楼 zoutuo 2009-06-26  
严重: Servlet.service() for servlet jsp threw exception
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'jbpmTemplate' is defined


请问这个在哪里配置???
1 楼 flyfan 2008-11-06  
一直在关注,给个图就更好了,断续期待,加油

相关推荐

    Java四大主流开源工作流引擎分析Shark,osworkflow,jbpm,jflow

    笔者主持的开源工作流引擎AgileFlow就是基于ww2+spring+hibernate架构实现的。写到这里我想是不是它可以和struts2进行完美整合?! Jflow是从ccflow演化而来的国产工作流引擎,富有太多的业务场景设置。 Ccflow是...

    JBPM4工作流应用开始指南.rar

    BPM4工作流应用开发指南 《jBPM4工作流应用开发指南》是2010年电子工业出版社出版的图书,作者是胡奇。 完全解析jBPM4应用开发技术 9位工作流业内专家联袂推荐 随着在现代企业管理中对于信息化、流程化的深度挖掘,...

    JBPM基于Spring系统工作流平台整合(一)

    1-版本以及系统配置jbpm版本3.2.3...jBPM默认使用的是内存数据库hsqldb|---deploy用来部署你的应用的包和资源|---designer这里是Eclipse插件,这样你就可以在图形界面来定义你的业务流程|---

    jbpm7示例(jbpm-7.3.0.Final-examples)

    jBPM可以与Drools项目相结合,以支持将这些范例集成到一起的统一环境,您可以将业务逻辑作为过程,规则和事件的组合进行建模。 工作是MAVEN+eclipse jBPM jars也可以在中央maven仓库中使用 (也可以在JBoss maven...

    jbpm4.4学习笔记

    4.6 JBPM在MyEclipse画流程图时出现乱码: 14 5 核心API 14 5.1ProcessEngine 14 5.2RepositoryService 15 5.3ExecutionService 16 5.4TaskService 16 5.5ProcessDefinition 16 5.6ProcessInstance 16 5.7Execution ...

    工作流督-办管理

    Jbpm 有直观的流程语言来表示商业流程图的术语比如,任务,异步通讯的等待状态,定时器,自动操作等等.把这些操作绑在一起,, Jbpm 就有了最强大和易扩展性的控制流机制. Jbpm 只有最小的倚赖性可以很容易的作为java库来...

    基于jbpm与activiti的工作流平台技术架构介绍

    宏天BPM X3软件平台是一个易于部署和使用的新一代业务流程管理平台,能够以最快的速度帮助您梳理、设计、执行、监控分析和优化业务流程,从业务和IT相结合的完美视角为用户组建长期而久远的卓越BPM流程管 理架构。...

    jbpm sample(完整,不带LIB)

    本工程基于以下框架实现工作流的实例. struts+spring+hibernate3.0+jbpm3.1.4,可以tomcat下运行,可通过图形模式发布工程,配置了在网页显示jbpm流程图的标签文件。

    最新工作流引擎Activiti7基础与进阶

    Activiti 是目前使用最为常用的工作流引擎,工作流业务在企业中应用非常广泛,目前企业中多使用Activiti6版本,Activiti7是目前的最新版本。Activiti7不但提高的工作流引擎的效率,提供了新封装的新API,还提供了和...

    javaee三大框架整合宅急送项目lib包

    通过 window.showModalDialog() 查看流程图页面 (弹出窗口,显示页面 url地址不能修改 ) function showPng(pid){ //alert("查看" + pid + "对应流程图"); window.showModalDialog("${pageContext.request....

    Activiti6.0教程例子下载

    由于本人之前没有工作流及JBPM的相关基础,刚开始学习Activiti的时候可以说是无比痛苦的,根本不知道从何下手,这里也建议大家先进行工作流及BPMN2.0规范的学习,有了一定的基础后,再着手学习Activiti。 1.3.2. ...

    Joffice2.1操作手册

    它以基于流行的JEE开源技术整合,以JBPM4.4流程引擎为基础,采用了WebService、XML、J2EE、Spring组件的灵活配置,并且与Microsoft Office实现了有机整合。完善了用户管理和安全的权限管理,支持POP3/POP3,SMTP/...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    1.5. Seam 页面流:猜数字范例........................................................................................................................................ 40 1.5.1. 理解代码....................

Global site tag (gtag.js) - Google Analytics