`

完整工作流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  
一直在关注,给个图就更好了,断续期待,加油

相关推荐

    完整工作流JBPM项目实战全过程教程2---项目详细讲解

    【标题】"完整工作流JBPM项目实战全过程教程2---项目详细讲解"涉及的主要知识点是JBPM(Java Business Process Management)工作流管理系统在实际项目中的应用。JBPM是一个开源的业务流程管理(BPM)和工作流系统,它...

    JBPM开发实战教程

    ### JBPM开发实战教程知识点详解 #### 一、JBPM简介与应用场景 ##### 1.1 JBPM概述 JBPM(JBoss Business Process Management)是一款开源的工作流引擎,基于Java技术,广泛应用于业务流程管理(BPM)领域。JBPM...

    jbpm工作流整合

    jbpm工作流整合是一个关键的主题,它涉及到企业级业务流程管理(BPM)系统的实施与集成。jbpm是一个开源的工作流管理系统,它提供了一套全面的工具和框架,用于设计、执行、监控和优化业务流程。这个压缩包可能包含...

    JBPM4与Spring整合例子代码

    在"风中叶老师讲的JBPM4与Spring整合例子代码"中,我们可以了解到如何将这两个强大的工具结合在一起,以实现企业级工作流的自动化处理。下面将深入探讨这一整合的关键知识点: 1. **Spring配置JBPM4**:首先,我们...

    工作流jbpm---学习文档+简单实例项目

    工作流jbpm是一种广泛应用于企业级应用中的流程自动化框架,它允许开发者定义、执行和管理业务流程。jbpm结合了模型驱动的架构(MDA)和业务流程执行语言(BPEL),为开发者提供了一个强大的工具来处理复杂的业务...

    请假工作流JBPM整合SSH2完整实例

    【标题】"请假工作流JBPM整合SSH2完整实例"涉及了多个IT领域的关键技术,主要集中在企业级应用开发上。JBPM(Java Business Process Management)是用于业务流程管理的开源框架,而SSH2则指的是Spring、Struts和...

    JBPM4.4+spring+ext整合

    JBPM(Java Business Process Management)是一个开源的工作流管理系统,主要用于处理业务流程自动化。版本4.4是JBPM的一个重要里程碑,它提供了强大的工作流设计、执行和监控能力。Spring框架则是Java开发中的核心...

    Spring与JBoss JBPM工作流集成开发指南

    Spring与JBoss JBPM工作流集成开发指南是关于JBPM与Spring框架集成的开发文档,涵盖了工作流的基本概念、设计要点、常见问题解答、参考资源等。下面是从该文件中生成的相关知识点: 一、工作流管理系统 工作流管理...

    jBPM4实战系列(二)jBPM4.4+ssh 整合配置及完整实例

    "jBPM4实战系列(二)jBPM4.4+ssh 整合配置及完整实例" 这个标题表明我们将会探讨一个关于jBPM4的具体实战项目,特别关注的是如何将jBPM4版本与SSH(Spring、Struts和Hibernate)框架整合,并提供了一个完整的实现示例...

    Jbpm4.4 整合Spring Hibernate4

    Jbpm4.4是一个流程管理系统,它结合了业务流程管理(BPM)和工作流服务,提供了强大的流程定义、执行和监控能力。在这个版本中,Jbpm与Spring框架和Hibernate ORM工具进行了整合,实现了更加灵活和高效的企业级应用...

    JBPM5.4工作流 Eclipse流程插件安装

    在中文环境中,关于JBPM5.4的资料相对较少,因此,这套教程将深入探讨如何在国内没有中文文档支持的情况下,通过翻译英文文档和实际项目应用来掌握JBPM5.4的使用,确保开发者能够顺利地进行工作流开发。 **1. 安装...

    工作流JBPM开发计划书

    ### 工作流JBPM开发计划书 #### 一、项目背景与目标 在当前数字化转型的大背景下,企业越来越依赖于高效的工作流程管理来提升业务效率和服务质量。JBPM(JBoss流程管理)作为一款开源的工作流引擎,因其灵活性、可...

    JBPM工作流全套学习资料

    【JBPM工作流全套学习资料】是一份详尽的学习资源,涵盖了JBPM工作...通过深入学习这些资料,开发者不仅可以掌握工作流设计和管理的基本技能,还能了解到如何在实际项目中灵活应用JBPM,以优化业务流程,提高组织效率。

    jbpm+spring的web简单借款工作流实例项目

    总结来说,"jbpm+spring的web简单借款工作流实例项目"是一个融合了流程管理、服务集成和Web交互的综合案例,涵盖了jbPM流程设计、Spring框架整合、数据库操作以及Web应用开发等多个方面,对于学习和实践企业级业务...

    企业OA 完整的jbpm工作流实例

    在这个名为"企业OA 完整的jbpm工作流实例"的项目中,开发者使用了Java SSH框架来构建了一个集成jbpm的工作流系统,特别适合初学者了解和学习工作流的实现。 SSH框架是Struts、Spring、Hibernate三个开源项目的首...

    jbpm.rar_jBPM User Guide chm_java 工作流_jbpm_jbpm-demo_工作流引擎

    总结,jBPM是Java开发者实施工作流管理的强大工具,它提供了一套完整的解决方案,从流程建模到执行,再到监控和优化,覆盖了业务流程管理的全过程。通过阅读《jBPM User Guide》和实践jbpm-demo,开发者可以深入了解...

    jbpm4.3 工作流实例 java

    【jbpm4.3 工作流实例与Java结合详解】 在信息技术领域,工作流管理系统(Workflow Management System,简称WfMS)是用于自动化业务流程的软件系统。jbpm(Business Process Management)是一款开源的工作流引擎,...

    jBPM工作流详解

    **jBPM工作流详解** jBPM,全称Java Business Process Management,是Red Hat公司开发的一款开源的工作流管理系统,它提供了对业务流程的建模、执行和监控能力。jBPM不仅支持传统的工作流标准,如BPMN 2.0,还集成...

    JBPM5.4 SSH 完整项目整合案例

    - **部署流程定义**:使用BPMN2.0工具(如jBPM Designer)设计流程图,导出为XML文件,然后通过Spring或Struts2的控制器部署到JBPM引擎。 **4. 运行与调试** - **启动服务器**:配置好项目后,可以在Eclipse或...

Global site tag (gtag.js) - Google Analytics