xfire插件自動生成客戶端代碼後,調用時報錯(已解決)

使用eclipes的xfire插件,生成了Webservice的客戶端代碼
在調用時,報錯,具體代碼如下
調用client的TestClient代碼
Java代碼
HelloWordServiceClient service=new HelloWordServiceClient();
HelloWordServicePortType type=service.getHelloWordServiceHttpPort();
System.out.println(type.sayHello("123"));

HelloWordServiceClient service=new HelloWordServiceClient();
HelloWordServicePortType type=service.getHelloWordServiceHttpPort();
System.out.println(type.sayHello("123"));


HelloWordServiceClient 類中的create0方法中報錯,代碼如下,錯誤行已在代碼中標出:
Java代碼
/**
*
*以下爲出錯的方法
*/

private void create0() {
TransportManager tm = (org.codehaus.xfire.XFireFactory.newInstance().getXFire().getTransportManager());
HashMap props = new HashMap();
props.put("annotations.allow.interface", true);
AnnotationServiceFactory asf = new AnnotationServiceFactory(new Jsr181WebAnnotations(), tm, new AegisBindingProvider(new JaxbTypeRegistry()));
asf.setBindingCreationEnabled(false);
service0 = asf.create((com.tongtech.bjvsp.client.HelloWordServicePortType.class), props);//此處出錯,提示HelloWordServicePortType不能爲抽象類
{
AbstractSoapBinding soapBinding = asf.createSoap11Binding(service0, new QName("http://webservicedemo.rubyeye.net", "HelloWordServicePortTypeLocalBinding"), "urn:xfire:transport:local");
}
{
AbstractSoapBinding soapBinding = asf.createSoap11Binding(service0, new QName("http://webservicedemo.rubyeye.net", "HelloWordServiceHttpBinding"), "http://schemas.xmlsoap.org/soap/http");
}
}

/**
*
*以下爲出錯的方法
*/

private void create0() {
TransportManager tm = (org.codehaus.xfire.XFireFactory.newInstance().getXFire().getTransportManager());
HashMap props = new HashMap();
props.put("annotations.allow.interface", true);
AnnotationServiceFactory asf = new AnnotationServiceFactory(new Jsr181WebAnnotations(), tm, new AegisBindingProvider(new JaxbTypeRegistry()));
asf.setBindingCreationEnabled(false);
service0 = asf.create((com.tongtech.bjvsp.client.HelloWordServicePortType.class), props);//此處出錯,提示HelloWordServicePortType不能爲抽象類
{
AbstractSoapBinding soapBinding = asf.createSoap11Binding(service0, new QName("http://webservicedemo.rubyeye.net", "HelloWordServicePortTypeLocalBinding"), "urn:xfire:transport:local");
}
{
AbstractSoapBinding soapBinding = asf.createSoap11Binding(service0, new QName("http://webservicedemo.rubyeye.net", "HelloWordServiceHttpBinding"), "http://schemas.xmlsoap.org/soap/http");
}
}


報錯信息如下:
Exception in thread "main" org.codehaus.xfire.annotations.AnnotationException: Service class cannot be abstract: com.tongtech.bjvsp.client.HelloWordServicePortType
at org.codehaus.xfire.annotations.AnnotationServiceFactory.assertValidImplementationClass(AnnotationServiceFactory.java:268)
at org.codehaus.xfire.annotations.AnnotationServiceFactory.create(AnnotationServiceFactory.java:177)
at org.codehaus.xfire.service.binding.ObjectServiceFactory.create(ObjectServiceFactory.java:284)
at com.tongtech.bjvsp.client.HelloWordServiceClient.create0(HelloWordServiceClient.java:59)
at com.tongtech.bjvsp.client.HelloWordServiceClient.<init>(HelloWordServiceClient.java:26)
at com.tongtech.bjvsp.testclient.TestClient.main(TestClient.java:14)

由於客戶端的代碼是自動生成,所以不知哪裏有問題,還是我在寫服務器端代碼時出了錯?
因爲是根據wsdl生成的客戶端代碼,因此我認爲服務端應該不存在問題。
本人對於xfire不是十分熟悉,希望指點一二,謝謝
自己已解決(問題爲xfire版本衝突),具體是這樣的
xfire通過eclipse的software的find and install自動從網上找到最新版本的eclipse的xfire插件(http://dist.codehaus.org/xfire/update/).安裝完畢後,使用其Code generation from WSDL document生成stub。其客戶端生成後,需要選擇生成後的置放路徑。由於我之前在本地使用xfire建立客戶端,xfire建立時導入了xfire1.1的jar包,當我再建立客戶端試圖測試訪問本地webservice服務器端時,也將客戶端的生成代碼以及運行客戶端所需要的jar包一同導入到同一工程中了,即自己建立的服務器端的工程中。此時,客戶端運行所導入的xfire1.2.6和服務器端的xfire1.2.5版本不一致,導致以上問題。只是xfire提示的不是很明確

解決辦法:

1.先建立一個java project,建立src和lib文件夾
2.使用xfire客戶端生成工具生成stub,選擇將生成代碼置放到新建的工程中src下
3.不知爲什麼,xfire客戶端生成工具生成時不能即時運行,提示缺少jar包,因此,再將commons-codec-1.3.jar和commons-httpclient-3.0.jar只放到lib中並在工程中引用
4.建立clientTest類,調用,測試成功。。
TestStubClient.java源碼如下

Java代碼
package com.tongtech.bjvsp.stubClient;

import com.tongtech.webservice.client.HelloWordServiceClient;
import com.tongtech.webservice.client.HelloWordServicePortType;

public class TestStubClient {

public static void main(String []args)
{
HelloWordServiceClient service=new HelloWordServiceClient();
HelloWordServicePortType portType=service.getHelloWordServiceHttpPort();
System.out.println(portType.sayHello("111"));
}
}

package com.tongtech.bjvsp.stubClient;

import com.tongtech.webservice.client.HelloWordServiceClient;
import com.tongtech.webservice.client.HelloWordServicePortType;

public class TestStubClient {

public static void main(String []args)
{
HelloWordServiceClient service=new HelloWordServiceClient();
HelloWordServicePortType portType=service.getHelloWordServiceHttpPort();
System.out.println(portType.sayHello("111"));
}
}


運行後,顯示結果。至此,訪問WebService服務成功!!

使用ANT腳本方式生成stub也是一種辦法,具體操作見我的另一篇blog
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章