2012-06-26 65 views
4

我試圖建立一個連接到我的Apex-Webservice,但每次都失敗。我Webserce很簡單:從Java訪問Salesforce Apex Soap Webservice

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

生成客戶端我現在的樣子,被描述here

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

在訪問webservice:

SoapConnection soap = Connector.newConnection("[email protected]", "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")); 

有人有一個想法,爲什麼第一個例子失敗?

問候塞巴斯蒂安

回答

0

自來水公司的每一個操作調用拋出一個ConnectionException或它的一個具體的子類型在一個錯誤的情況。所以你應該得到一個可能有助於解決問題的錯誤消息。爲了調試由WSC發送和接收的SOAP消息中添加以下代碼行的ConnectorConfig初始化後:

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

這將漂亮地打印整個XML客戶端和web服務之間交換。 resoponse也可能幫助你找到問題的原因。

希望這會有所幫助。 h9nry

8

我假設發生這種情況是因爲您的AtlassianService wsdl不包含在Salesforce中進行身份驗證的登錄方法,然後由WSC生成的代理類無法讓代碼實際執行登錄。

我試圖做一些非常類似於你的問題(但與企業API)。我找到的解決方案是:

  1. 生成使用WSC的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(); 
    } 
    } 
}