activiti designer源码的研究(三) 之servicetask调用除Java之后的其他语言发布的webservice

按照上一篇文章的配置,ServiceTask已经可以调用带有@webParam和@webResult发布的webservice了,但是怎么调用这些不带这些参数的发布的webservice了,因为其他语言并没有@webParam这些参数,请看下面的例子:

Counter.java

<span style="font-size:14px;">@WebService
public interface Counter {

  /**
   * Increase the counter in 1
   */
  void inc();

  /**
   * Returns the current count
   *
   * @return the count
   */
  @WebResult(name="count")
  int getCount();

  /**
   * Resets the counter to 0
   */
  void reset();

  /**
   * Sets the counter to value
   *
   * @param value the value of the new counter
   */
  void setTo(@WebParam(name="value") int value);

 <em> String prettyPrintCount(String prefix, String suffix);

 <strong> </strong>String prettyPrintCountTwo(String suffixTwo, String prefixTwo);</em>
}</span>

发布之后,wsdl文件如下(关键内容):

<xs:complexType name="prettyPrintCountTwo">
  <xs:sequence>
     <xs:element minOccurs="0" name="arg0" type="xs:string"/>
     <xs:element minOccurs="0" name="arg1" type="xs:string"/>
  </xs:sequence>
</xs:complexType>
<xs:complexType name="prettyPrintCountTwoResponse">
  <xs:sequence>
     <xs:element minOccurs="0" name="return" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

我们会发现prettyPrintCountTwo方法的第一个参数名默认为arg0,第二个参数名默认为arg1

返回值的默认名为return

于是我在bpmn20.xml中进行了下面的配置

<span style="font-size:18px;"><serviceTask id="servicetask3" name="Service Task" implementation="##WebService" operationRef="tns:prettyPrintCountTwoOperation">
      <dataInputAssociation>
        <sourceRef>PrettyPrintResult</sourceRef>
        <targetRef>arg0</targetRef>
      </dataInputAssociation>
      <dataInputAssociation>
        <sourceRef>PrefixTwoVariable</sourceRef>
        <targetRef>arg1</targetRef>
      </dataInputAssociation>
      <dataOutputAssociation>
        <sourceRef>return</sourceRef>
        <targetRef>PrettyPrintTwoResult</targetRef>
      </dataOutputAssociation>
    </serviceTask></span>

部署之后,然后运行,会发现会报如下错误

<span style="font-size:18px;">junit.framework.ComparisonFailure: expected:<The counter has the value -1. Good news 0 append What news> but was:<null>
	at junit.framework.Assert.assertEquals(Assert.java:100)
	at junit.framework.Assert.assertEquals(Assert.java:107)
	at junit.framework.TestCase.assertEquals(TestCase.java:269)
	at org.activiti.engine.test.bpmn.servicetask.WebServiceSimplisticTwoTest.testWebServiceInvocationWithSimplisticDataFlow(WebServiceSimplisticTwoTest.java:46)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at junit.framework.TestCase.runTest(TestCase.java:176)
	at org.activiti.engine.impl.test.PvmTestCase.runTest(PvmTestCase.java:65)
	at junit.framework.TestCase.runBare(TestCase.java:141)
	at org.activiti.engine.impl.test.AbstractActivitiTestCase.runBare(AbstractActivitiTestCase.java:102)
	at junit.framework.TestResult$1.protect(TestResult.java:122)
	at junit.framework.TestResult.runProtected(TestResult.java:142)
	at junit.framework.TestResult.run(TestResult.java:125)
	at junit.framework.TestCase.run(TestCase.java:129)
	at junit.framework.TestSuite.runTest(TestSuite.java:255)
	at junit.framework.TestSuite.run(TestSuite.java:250)
	at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
</span>

会发现return并不存在,明明在wsdl中是return,怎么会不存在了?

于是我在activiti-cxf的CxfWSDLImport中测试SimpleStructureDefinition中存的是什么东西,结果发现return读入之后变成了_return,所以只要把return改为_return就OK了

时间: 2024-10-10 14:00:01

activiti designer源码的研究(三) 之servicetask调用除Java之后的其他语言发布的webservice的相关文章

activiti designer源码的研究(一) 采用Axis2调用Webservice

最近由于项目的需要,需要对eclipse中的Eclipse Activiti designer插件进行扩充,使其能够调用的webservice,但是遇到了classNotFoundException,我的方法如下: <1> 在org.activiti.designer.gui中添加了调用webserviced的类 <2> 在org.activiti.designer.lib中添加了axis2的jar <3> 在org.activiti.designer.lib的mani

【原】SDWebImage源码阅读(三)

[原]SDWebImage源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1.SDWebImageDownloader中的downloadImageWithURL 我们来到SDWebImageDownloader.m文件中,找到downloadImageWithURL函数.发现代码不是很长,那就一行行读.毕竟这个函数大概做什么我们是知道的.这个函数大概就是创建了一个SDWebImageSownloader的异步下载器,根据给定的URL下载image. 先映入眼帘的

Android网络通信Volley框架源码浅析(三)

尊重原创 http://write.blog.csdn.net/postedit/26002961 通过前面浅析(一)和浅析(二)的分析,相信大家对于Volley有了初步的认识,但是如果想更深入的理解,还需要靠大家多多看源码. 这篇文章中我们主要来研究一下使用Volley框架请求大量图片的原理,在Android的应用中,通过http请求获取的数据主要有三类: 1.json 2.xml 3.Image 其中json和xml的获取其实原理很简单,使用Volley获取感觉有点大财小用了,了解Volle

Java集合源码分析(三)LinkedList

LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈.队列和双端队列来使用. LinkedList同样是非线程安全的,只在单线程下适合使用. LinkedList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了Cloneable接口,能被克隆. LinkedList源码 以下是linkedList源码(加入简单代码注释): /* * @(#)LinkedList.java 1.6

【原】AFNetworking源码阅读(三)

[原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data task.但是对于NSURLSession部分却没有提及.主要是精力有限,准备在这一部分把NSURLSession的知识好好梳理一遍.一切先从上一篇中的addDelegateForDataTask:函数说起,然后再介绍AFURLSessionManagerTaskDelegate,最后结合AFURLSes

hbase源码系列(三)Client如何找到正确的Region Server

客户端在进行put.delete.get等操作的时候,它都需要数据到底存在哪个Region Server上面,这个定位的操作是通过HConnection.locateRegion方法来完成的. loc = hConnection.locateRegion(this.tableName, row.getRow()); 这里我们首先要讲hbase的两张元数据表-ROOT-和.META.表,它们一个保存着region的分部信息,一个保存着region的详细信息.在<hbase实战>这本书里面详细写了

【雷电】源码分析(三)-- 游戏背景

Android系统手机屏幕的左上角为坐标系,同时y轴方向与笛卡尔坐标系的y轴方向想反.通过提供的api如getLeft , getTop, getBottom, getRight可以获得控件在parent中的相对位置.同时,也可以获得控件在屏幕中的绝对位置,详细用法可参考android应用程序中获取view的位置 当我们编写一些自定义的滑动控件时,会用到一些api如scrollTo(),scrollBy(),getScrollX(), getScrollY().由于常常会对函数getScroll

jquery1.7.2的源码分析(三)$.Deferred

例子的详细讲解 Filter Resolve 上面的的代码是怎么运行的呢 点击button的先执行 $.Deferred(),得到具有很多方法的defer defer.resolve( 5 ); var doneList = jQuery.Callbacks( "once memory" ), failList = jQuery.Callbacks( "once memory" ), progressList = jQuery.Callbacks( "me

RAMCloud源码分析(三)

RAMCloud源码分析三 概述 mmap系统调用 1 mmap原理 2 mmap使用 HashTable Segment 内存管理 1 Log Metadata 2 Two-level Cleaning 3 Parallel Cleaning 4 Avoiding Cleaner Deadlock 总结 作者:tuyunshan RAMCloud技术交流QQ群:295905581 RAMCloud源码分析(三) 1. 概述 这一部分主要是针对RAMCloud系统中Server进行分析,而本节的