【问题标题】:Simple java client code for Web Service - something to do with QName?用于 Web 服务的简单 java 客户端代码 - 与 QName 有关吗?
【发布时间】:2010-09-17 02:52:15
【问题描述】:

当我到达调用我在 Tomcat/Axis 上运行的真正 BASIC Web 服务的行时,我收到以下错误。

Element or attribute do not match QName production: QName::=(NCName':')?NCName

我的 QName 有什么问题吗?- 我什至找不到任何有用的信息。

我的客户端代码如下:

import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

    public class TestClient {

    public static void main(String [] args)
    {
        try{
            String endpoint = "http://localhost:8080/TestWebService/services/DoesMagic";  

            Service service = new Service();
            Call call = (Call) service.createCall();

            call.setTargetEndpointAddress( new java.net.URL(endpoint) );
            call.setOperationName( new QName("http://testPackage.fc.com/, doBasicStuff") );

            String ret = (String) call.invoke( new Object[] {"some kind of message"} );

            System.out.println(ret);

        }catch(Exception e){
            System.err.println(e.toString());
        }
    }
}

我的网络服务代码非常基础——只是一个简单的类,它返回您的输入字符串和一些连续文本:

public String doBasicStuff(String message)
    {
        return "This is your message: " + message;

    }

【问题讨论】:

  • 您是否有理由不将 wsdl2java 与 Axis 一起使用来为 Web 服务及其方法生成代理类?我不知道您是否只是在编写一些示例/测试代码,但通常您不需要自己使用 Call 对象或 invoke() 方法。 wsd2ljava 可能会为您节省大量时间。

标签: java web-services client rpc


【解决方案1】:

正如异常所说,您错误地调用了 QName 构造函数:

new QName("http://testPackage.fc.com/, doBasicStuff")

不正确。我认为您必须传递两个字符串,一个包含名称空间,一个包含本地名称。文档通常会包含有关如何使用该类的说明。

【讨论】:

    【解决方案2】:

    会不会是您的 QName 中的拼写错误?:

    new QName("http://testPackage.fc.com/", "doBasicStuff")
    

    代替:

    new QName("http://testPackage.fc.com/, doBasicStuff")
    

    【讨论】:

      【解决方案3】:

      您应该使用以下之一:

      public QName(String localPart)     or
      public QName(final String namespaceURI, final String localPart)
      

      但是 新 QName("http://testPackage.fc.com/, doBasicStuff") 是错误的,因为两个值都在同一个字符串“.., ..”中

      问候

      【讨论】:

        【解决方案4】:

        new QName("soapenc:string", "doBasicStuff")

        【讨论】:

          【解决方案5】:

          只需输入您的情况下必须的方法名称即可 call.setOperationName("doBasicStuff");

          【讨论】:

            猜你喜欢
            • 2010-10-08
            • 1970-01-01
            • 2014-09-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多