传递的不是类,而是类的实例:对象。
Hello h = new Hello();
h.GetBookName(new Book());

解决方案 »

  1.   

    /**这有何难,我用的是axis,相信他将来必成为j2ee的标准**/  public static void main(String[] args) {
      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();
      }
     }
      

  2.   

    先谢过冷月无声!
    请问QName qn = new QName("urn:BeanService", "TestData") 和call.setOperationName(new QName("urn:TestService", "setData"))中的"urn:BeanService"和"urn:TestService"具体表示什么含义?
      

  3.   

    "TestService" 是我给我的webservice 起的名字,就是一个类:
    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;
     }
      
     
    }
      

  4.   

    urn:BeanService  就是说当你要传自定义类型到服务端的时候就这样写。
    我传的是一个javabean。
      

  5.   

    这个urn:BeanService 在server-config.wsdd 中定义,相信你既然做webservice,应该自己已有完整的例子,我的server-config.wsdd 的片段:
     <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"/>
      

  6.   

    http://kb.csdn.net/java/Articles/200506/73d6aea4-0d38-4e21-a188-473790c9ef57.html
      

  7.   

    还是不行啊!
    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)
      

  8.   

    回冷月无声:
        在你的示例中的类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() ;
    }
    }
      

  9.   

    xfire必将替代axis, axis 2生成的web services不支持vb.delphi低版本的开发工具,xfire的执行速度远高于axis,具体的测试在我的blog里,xfire从设计之初就考虑了支持spring,axis还要自己处理spring注入。