【问题标题】:Access Salesforce Apex Soap Webservice from Java从 Java 访问 Salesforce Apex Soap Web 服务
【发布时间】:2012-06-26 09:43:07
【问题描述】:

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

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

生成Client的方法我就是这样,描述here

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"));

有人知道为什么第一个示例失败了吗?

问候塞巴斯蒂安

【问题讨论】:

    标签: java web-services soap salesforce apex-code


    【解决方案1】:

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

    我试图做一些与您的问题非常相似的事情(但使用企业 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();
        }  
      }
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

      希望这会有所帮助。 h9nry

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-15
        • 2014-09-06
        • 1970-01-01
        • 2014-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多