2012-06-26 61 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(); 
    } 
    } 
}