完整工作流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后的项目源码再上传一份供参考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值