还是不行啊! WebService端:package Hello; public class Hello { private String myValue; public String GetBookName() { return "Bookname: " + this.myValue ; } public void SetBookName(Book a) { this.myValue =a.getName() ; } }package Hello; public class Book { private String name; public String getName() { return name; } public void setName(String string) { name = string; } } 客户端调用代码如下: Book a =new Book(); a.setName("Book1" );
String resultData = (String)call.invoke(new Object[] {}); System.out.println( resultData ); 执行至call.invoke(params); 时出错,好象还是与“urn:BeanService"有关:Exception in thread "main" AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException faultSubcode: faultString: org.xml.sax.SAXException: Deserializing parameter 'arg0': could not find deserializer for type {urn:BeanService}Book faultActor: faultNode: faultDetail: {http://xml.apache.org/axis/}hostname:PanYongorg.xml.sax.SAXException: Deserializing parameter 'arg0': could not find deserializer for type {urn:BeanService}Book at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222) at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129) at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source) at javax.xml.parsers.SAXParser.parse(Unknown Source) at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227) at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696) at org.apache.axis.Message.getSOAPEnvelope(Message.java:435) at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62) at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206) at org.apache.axis.client.Call.invokeEngine(Call.java:2784) at org.apache.axis.client.Call.invoke(Call.java:2767) at org.apache.axis.client.Call.invoke(Call.java:2443) at org.apache.axis.client.Call.invoke(Call.java:2366) at org.apache.axis.client.Call.invoke(Call.java:1812) at Hello.TestClient_wsdd.main(TestClient_wsdd.java:62)
回冷月无声: 在你的示例中的类TestData必须为static的,实际上在call.setOperationName(new QName("urn:TestService", "setData"));和call.setOperationName(new QName("urn:TestService", "getData"));时已经实例化两个TestService,但是由于其TestData为Static,所以才可以实现,如果TestData不是为Static,譬如在我这个类中,作为数据存储的myValue不是静态的,则该怎么实现呢?毕竟Static还是少用还好哦,呵呵!public class Hello { private String myValue; public String GetBook() { return this.myValue ; } public void SetBook(Book a) { this.myValue =a.getName() ; } }
try {
// data
TestData data = new TestData();
data.setName("didoleo");
data.setScore(1234);
data.setSign(true);
// init server
String endpoint = "http://localhost:7001/axis/services/TestService";
Service service = new Service();
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(endpoint);
QName qn = new QName("urn:BeanService", "TestData"); /**这里我定义了自定义类型 TestData **/
call.registerTypeMapping(TestData.class, qn,
new BeanSerializerFactory(TestData.class, qn),
new BeanDeserializerFactory(TestData.class, qn));
//set data
call.setOperationName(new QName("urn:TestService", "setData"));/**这里我调用了 webservice 中的一个方法 setData ,他的参数就是我刚提到的TestData**/
Object[] params = new Object[] { data };
System.out.println("---- start set data ----");
System.out.println("set name to: " + data.getName());
System.out.println("set score to: " + data.getScore());
System.out.println("set sign to: " + data.isSign());
call.invoke(params);
System.out.println("---- end set data ----");
// get data
call.setOperationName(new QName("urn:TestService", "getData"));
call.setReturnType(qn, TestData.class);
TestData resultData = (TestData)call.invoke(new Object[] {});
System.out.println();
System.out.println();
System.out.println("---- get data ----");
System.out.println("name: " + resultData.getName());
System.out.println("score: " + resultData.getScore());
System.out.println("sign: " + resultData.isSign());
System.out.println("--------- end --------");
} catch (Exception e) {
e.printStackTrace();
}
}
请问QName qn = new QName("urn:BeanService", "TestData") 和call.setOperationName(new QName("urn:TestService", "setData"))中的"urn:BeanService"和"urn:TestService"具体表示什么含义?
package com.didoleo.axis.service;import com.didoleo.axis.domain.TestData;/**
* @axis.service scope = "Request" urn = "TestService"
*/
public class TestService {
private static TestData data = new TestData();
/**
* @param data
* @axis.method
*/
public void setData(TestData data) {
TestService.data = data;
}
/**
* @return TestData
* @axis.method
*/
public TestData getData() {
int score=data.getScore();
data.setScore(10000+score);
return data;
}
public int getSum(int[] intarr){
int result=0;
for(int i=0;i<intarr.length;i++){
result+=intarr[i];
}
return result;
}
}
我传的是一个javabean。
<service name="TestService" provider="java:RPC">
<parameter name="allowedMethods" value="setData getData "/>
<parameter name="scope" value="Request"/>
<parameter name="className" value="com.didoleo.axis.service.TestService"/>
</service><beanMapping languageSpecificType="java:com.didoleo.axis.domain.TestData" qname="ns1:TestData" xmlns:ns1="urn:BeanService"/>
WebService端:package Hello;
public class Hello
{
private String myValue;
public String GetBookName()
{
return "Bookname: " + this.myValue ;
}
public void SetBookName(Book a)
{
this.myValue =a.getName() ;
}
}package Hello;
public class Book
{
private String name; public String getName() {
return name;
} public void setName(String string) {
name = string;
}
}
客户端调用代码如下:
Book a =new Book();
a.setName("Book1" );
String endpoint="http://localhost:8080/Hello/services/Hello";Service service=new Service();
Call call=(Call)service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));QName qn = new QName("urn:BeanService", "Book");
call.registerTypeMapping(Book.class, qn,
new BeanSerializerFactory(Book.class, qn),
new BeanDeserializerFactory(Book.class, qn));call.setOperationName(new QName("urn:Hello","SetBookName")); Object[] params = new Object[] {a}; call.invoke(params); //此句出错
call.setOperationName(new QName( "urn:Hello","GetBookName"));
String resultData = (String)call.invoke(new Object[] {});
System.out.println( resultData ); 执行至call.invoke(params); 时出错,好象还是与“urn:BeanService"有关:Exception in thread "main" AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: org.xml.sax.SAXException: Deserializing parameter 'arg0': could not find deserializer for type {urn:BeanService}Book
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}hostname:PanYongorg.xml.sax.SAXException: Deserializing parameter 'arg0': could not find deserializer for type {urn:BeanService}Book
at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)
at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)
at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke(Call.java:2443)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at Hello.TestClient_wsdd.main(TestClient_wsdd.java:62)
在你的示例中的类TestData必须为static的,实际上在call.setOperationName(new QName("urn:TestService", "setData"));和call.setOperationName(new QName("urn:TestService", "getData"));时已经实例化两个TestService,但是由于其TestData为Static,所以才可以实现,如果TestData不是为Static,譬如在我这个类中,作为数据存储的myValue不是静态的,则该怎么实现呢?毕竟Static还是少用还好哦,呵呵!public class Hello
{
private String myValue;
public String GetBook()
{
return this.myValue ;
}
public void SetBook(Book a)
{
this.myValue =a.getName() ;
}
}