Tuesday, June 4, 2013

Integrate Custom Apex WebService with Java Using Force.com Web Services Connector (WSC)

This blog post will describe that how to create an Apex web service and integrate it with Java App using Force.com Web Services Connector (WSC).

Below is an example of how to integrate Apex webservice with Force.com SOAP API  and Java Apps using Eclipse IDE.

To get started, we'll run through the following steps:

1) Create an Apex webService class

Apex Code:
/********************************************************************************/
global class SuperClass{
    global class RequestClass{
        webService String accountName;
    }
    global class ResponseClass{
        webService String responseResultID;
        webService String responseResultName;
        webService String responseResultRecordType;
    }
    webService static ResponseClass behaviourOfWebService(RequestClass reqClass){
        Account acct = new Account();
        acct.Name = reqClass.accountName;
        insert acct;
        ResponseClass resClass = new ResponseClass();
        resClass.responseResultID = acct.Id;
        resClass.responseResultName = acct.Name;
        resClass.responseResultRecordType = acct.RecordTypeId;
        return resClass;
    }
}
/********************************************************************************/

2) You need to install "Java JDK (6 or 7)" in your machine.
3) Second you need to check whether "Java JDK (6 or 7)" has installed successfully or not?

Just type in the command prompt:
java -version

You will the result same as below:
It will show you:
java version "1.6.0_35"
Java(TM) SE Runtime Environment (build 1.6.0_35-b10-428-10M3811)
Java HotSpot(TM) 64-Bit Server VM (build 20.10-b01-428, mixed mode)

Note: If you get error then change your command prompt directory to the Java bin directory and test it again.

For Example:
C:\Program Files\Java\jdk1.6.0_45\bin> java -version

4) Download the "Enterprise WSDL" or "Partner WSDL" from your salesforce.com organization.

Log in into salesforce.com organization -> User Name ->  Setup -> App Setup section -> Develop -> API -> click on Generate Enterprise or Partner WSDL -> Save file with extension ".wsdl" as "enterprise.wsdl" or "partner.wsdl".

5) Download the Apex class "SuperClass" wsdl.

Log in into salesforce.com organization -> User Name ->  Setup -> App Setup section -> Develop -> Apex Classes-> click on SuperClass -> click Generate WSDL -> Save file with extension ".wsdl" as "mywebservice.wsdl".

6) Download the Web Services Connector (WSC) "wsc-20.jar" file from the URL "http://code.google.com/p/sfdc-wsc/downloads/list".

7) Now create JAR (Java ARchive) files for "enterprise.wsdl", "partner.wsdl" and "mywebservice.wsdl" files.

8) Copy the "tools.jar" file from the path where you have installed "Java JDK (6 or 7)".

For Example:
"C:\Program Files\Java\jdk1.6.0_45\lib\tools.jar" and paste it in your "E:\" drive. I am doing this just for safe side so we will not have any conflicts.

Note: 
(a) "tools.jar" and "wsc-20.jar" file both must be in the same directory otherwise, you will get an error "classpath: java.io.FileNotFoundException".
(b) Just for safe side I would recommend that your "E:\" drive must have "tools.jar", "wsc-20.jar", "enterprise.wsdl", "partner.wsdl" and "mywebservice.wsdl".

9) Execute the following commands in Command Prompt to generate JAR File "JAR file (Java ARchive)" for "enterprise.wsdl" or "partner.wsdl" and "mywebservice.jar".

For Example:
java -classpath wsc-XX.jar com.sforce.ws.tools.wsdlc enterprise.wsdl enterprise.jar

Real Example:
Generate enterprise.jar
java -classpath E:\tools.jar;E:\wsc-20.jar com.sforce.ws.tools.wsdlc E:\enterprise.wsdl E:\enterprise.jar

Generate partner.jar
java -classpath E:\tools.jar;E:\wsc-20.jar com.sforce.ws.tools.wsdlc E:\partner.wsdl E:\partner.jar

Generate mywebservice.jar
java -classpath E:\tools.jar;E:\wsc-20.jar com.sforce.ws.tools.wsdlc E:\mywebservice.jar.wsdl E:\mywebservice.jar

Now these commands will generate "enterprise.wsdl" or "partner.wsdl" and "mywebservice.jar".

Generate Java Code in Eclipse (Creating an Enterprise WSDL Application)

Now that your environment is ready to go, it's time to build a test application to see how things are working. Most developers build client applications with the enterprise WSDL, so we’ll start with that one first.
In Eclipse, complete the following steps to build a Java application based on the enterprise WSDL.
  1. Create a new Java project named “WSC - Enterprise” (click File | New | Java Project).
  2. Add the wsc-XX.jar and enterprise.jar to the project (click Project | Properties | Java Build Path | Libraries or External Libraries, then add the JARs to the project.
  3. Add a new folder, wsc, to the src folder in your app (right-click src in Package Explorer, then click New | Folder).
  4. Create a new class src/wsc/CallWS.java and paste in the code from the code listing that follows.
  5. Replace the stub user credentials in the code with your own user name and password with security token for the appropriate static members, then save your source code.
  6. Run the application.
Your Project in Eclipse IDE will look like below screenshot:
















Java Code:
/********************************************************************************/
package wsc;

import com.sforce.soap.SuperClass.SoapConnection;
import com.sforce.soap.SuperClass.Connector;
import com.sforce.soap.SuperClass.RequestClass;
import com.sforce.soap.SuperClass.ResponseClass;

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


public class CallWS {


  static final String USERNAME = "Your User Name";
  static final String PASSWORD = "You User Password + Your Security Token";

  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());
      
      RequestClass reqClass = new RequestClass();
      reqClass.setAccountName("Account Created By Java Program");
      
      ResponseClass resClass = new ResponseClass();
      resClass = MyWebserviceWSconnection.behaviourOfWebService(reqClass);
      System.out.println("Record ID ---"+resClass.getResponseResultID());
      System.out.println("Record Name ---"+resClass.getResponseResultName());
      System.out.println("Record Record Type ---"+resClass.getResponseResultRecordType());

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


    } catch (ConnectionException e1) {
        e1.printStackTrace();
    }  
  }
}
/********************************************************************************/

Helpful Links:
http://wiki.developerforce.com/page/Introduction_to_the_Force.com_Web_Services_Connector
http://code.google.com/p/sfdc-wsc/downloads/list

http://boards.developerforce.com/t5/Java-Development/Trying-to-call-a-simple-Apex-Web-Service-method-from-Java/td-p/206407
http://boards.developerforce.com/t5/General-Development/How-to-Call-WebService-Method-in-Java/td-p/261755
http://kperisetla.blogspot.com/2011/09/creating-custom-apex-web-service-in.html
http://forums.crmsuccess.com/t5/forums/forumtopicprintpage/board-id/JAVA_development/message-id/5930/print-single-message/false
http://boards.developerforce.com/t5/Java-Development/Problem-Calling-Apex-WebService-from-Java/td-p/206637
http://stackoverflow.com/questions/11204614/access-salesforce-apex-soap-webservice-from-java