从Java访问Salesforce Apex Soap Web服务

从Java访问Salesforce Apex Soap Web服务,java,web-services,soap,salesforce,apex-code,Java,Web Services,Soap,Salesforce,Apex Code,我正在尝试建立与Apex Web服务的连接,但每次都失败。我的网站很简单: global class AtlassianService { webService static String hello(String Name) { return 'Hello '+Name+' ! :D'; } } 要生成客户端,我只需按照以下方式进行操作: 访问Web服务: SoapConnection soap = Connector.newConnection(

我正在尝试建立与Apex Web服务的连接,但每次都失败。我的网站很简单:

global class AtlassianService 
{
    webService static String hello(String Name) 
    {
        return 'Hello '+Name+' ! :D';
    }
}
要生成客户端,我只需按照以下方式进行操作:

访问Web服务:

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"));
有人知道第一个例子失败的原因吗


问候Sebastian

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

conf.setPrettyPrintXml(true);
conf.setTraceMessage(true);
这将很好地打印客户端和Web服务之间交换的整个xml。解决方法也可能帮助您找到问题的原因

希望这有帮助。
h9nry

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

我试图做一些与您的问题非常类似的事情(但使用企业API)。我找到的解决办法是:

  • 使用WSC for Enterprise.wsdl(Enterprise.jar)生成代理类
  • 使用WSC为MyWebservice.wsdl(MyWebservice.jar)生成代理类
  • 创建与enterprise的连接,并获取SessionId
  • 将请求中的SessionId设置为MyWebservice
  • 执行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();
        }  
      }
    }
    
    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();
        }  
      }
    }