4

我正在尝试建立与我的 Apex-Webservice 的连接,但每次都失败。我的 Webserce 非常简单:

global class AtlassianService 
{
    webService static String hello(String Name) 
    {
        return 'Hello '+Name+' ! :D';
    }
}

要生成客户端我就是这样,这里描述:

java –classpath pathToJAR/wsc-22.jar com.sforce.ws.tools.wsdlc pathToWsdl/WsdlFilename​ pathToOutputJar/OutputJarFilename

访问网络服务:

SoapConnection soap = Connector.newConnection("mail@XXXXXX.com", "XXXX");

System.out.println(soap.hello("WORLD")); // Invalid Session ( => SessionID is null)

如果我使用 PartnerConnection 获取有效的 SessionID 一切正常:

ConnectorConfig config = new ConnectorConfig();
config.setUsername(username);
config.setPassword(password);
config.setAuthEndpoint("https://login.salesforce.com/services/Soap/u/24.0");

new PartnerConnection(config);

SoapConnection soap = Connector.newConnection(null, null);
soap.setSessionHeader(config.getSessionId());

System.out.println(soap.hello("WORLD"));

任何人都知道为什么第一个示例失败?

问候塞巴斯蒂安

4

2 回答 2

8

我假设发生这种情况是因为您的 AtlassianService wsdl 不包含在 Salesforce 中进行身份验证的登录方法,然后 WSC 生成的代理类无法拥有实际执行登录的代码。

我试图做一些与您的问题非常相似的事情(但使用 Enterprise API)。我找到的解决方案是:

  1. 使用 WSC for Enterprise.wsdl (enterprise.jar) 生成代理类
  2. 使用 WSC 为 MyWebservice.wsdl (mywebservice.jar) 生成代理类
  3. 创建与企业的连接,并获取SessionId
  4. 将请求中的 SessionId 设置为 MyWebservice
  5. 执行 MyWebservice 方法调用。

像这样:

import com.sforce.soap.MyWebservice.SoapConnection;
import com.sforce.soap.MyWebservice.Connector;

import com.sforce.ws.ConnectionException;
import com.sforce.ws.ConnectorConfig;
import com.sforce.soap.enterprise.*;


public class CallWS {


  static final String USERNAME = "username";
  static final String PASSWORD = "pass+securitytoken";

  static SoapConnection MyWebserviceWSconnection;
  static EnterpriseConnection enterpriseConnection;

  public static void main(String[] args) {

    ConnectorConfig config = new ConnectorConfig();
    config.setUsername(USERNAME);
    config.setPassword(PASSWORD);


    try {

      //create a connection to Enterprise API -- authentication occurs
      enterpriseConnection = com.sforce.soap.enterprise.Connector.newConnection(config);    
      // display some current settings
      System.out.println("Auth EndPoint: "+config.getAuthEndpoint());
      System.out.println("Service EndPoint: "+config.getServiceEndpoint());
      System.out.println("Username: "+config.getUsername());
      System.out.println("SessionId: "+config.getSessionId());


      //create new connection to exportData webservice -- no authentication information is included
      MyWebserviceWSconnection = Connector.newConnection("","");
      //include session Id (obtained from enterprise api) in exportData webservice
      MyWebserviceWSconnection.setSessionHeader(config.getSessionId());


      String result = MyWebserviceWSconnection.receiveData("test");
      System.out.println("Result: "+result);


    } catch (ConnectionException e1) {
        e1.printStackTrace();
    }  
  }
}
于 2012-08-19T20:40:56.663 回答
0

如果发生错误,wsc 的每个操作调用都会引发 ConnectionException 或其具体子类型之一。所以你应该收到一条错误消息,可能有助于解决问题。为了调试wsc发送和接收的soap消息,在初始化ConnectorConfig之后添加以下行:

conf.setPrettyPrintXml(true);
conf.setTraceMessage(true);

这将漂亮地打印在您的客户端和 Web 服务之间交换的整个 xml。响应也可能会帮助您找到问题的原因。

希望这可以帮助。h9nry

于 2012-06-28T07:10:31.790 回答