按照上一篇文章的配置,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