Voici un méthode que j'avais posté il y a quelques temps sur les forum de
Salesforce pour générer des classes Java à partir du fichier enterprise.wsdl et axis 2 sous windows. J'utilise wsdl2java pour générer les classes.
Ajoutez Java et Axis à votre path, par exemple:
JAVA_HOME = C:\Program Files\Java\jdk1.6.0_07
AXIS2_HOME = Q:\SalesForce\WSDL2JAVA_Generation\axis2-1.4.1-bin\axis2-1.4.1
puis, créez un répertoire pour placer vos données. Dans ce répertoire vous pouvez mettre un sous-répertoire pour placer votre WSDL. Puis lancez cette commande:
%AXIS2_HOME%/bin/wsdl2java -t -uri wsdl/enterprise.wsdl -l java -d xmlbeans -p com.salesforce.webservice -sn SforceService -o generated/Salesforce
bien entendu:
- "wsdl/enterprise.wsdl" est le chemin relatif de mon WSDL
- "com.salesforce.webservice" est le nom du package qui contiendra les classes générées
- "generated/Salesforce" est le sous-répertoire qui contiendra les classes du package
Dans mon exemple, a un sous-rpertoire Salesforce est créé dans le répertoire "generated". Il contient:
- [src] qui contient les classes générées
- [resources] qui contient les ressources nécessaires à la connexion avec Salesforce
- [test] qui contient des classes de tests
Empaquetez le contenu du répertoire resources (pas le répertoire lui-même) dans un fichier .jar.
Compilez les classes contenues dans src, et empaquetez-les dans un fichier du nom de salesforce.jar (par exemple).
Ensuite, il vous faut intégrer resources.jar, salesforce.jar et les bibliothèques Axis2 à votre classpath. Pour cela, chacun sa méthode, moi j'utilise Eclipse (pour générer salesforce.jar aussi).
Et voici mon implémentation java:
Voici le constructeur pour mon objet de session Salesforce:
public static final String PROD_SERVER = "https://www.salesforce.com/services/Soap/c/16.0";
public static final String SANDBOX_SERVER = "https://test.salesforce.com/services/Soap/c/16.0";
public Exception exception;
private Login login;
private SessionHeader sessionHeader;
private SessionHeaderDocument sessionHeaderDocument;
private String endpoint;
private String UserName, PassWord;
private int Progress;
private String ProgressText;
private String server;
private SforceServiceStub stub;
/**
* This constructor initializes a connexion with Saleforce using user name
* and password.
*
* @param UN
* Salesforce User Name
* @param PW
* Salesforce User Password
* @throws Exception
*/
public Salesforce_session(final String UN, final char[] PW) throws Exception
{
UserName = UN;
PassWord = String.valueOf(PW);
try
{
setProgress(0, "Loging");
if (UN.endsWith(".sand"))
{
endpoint = SANDBOX_SERVER;
} else
{
endpoint = PROD_SERVER;
}
stub = new SforceServiceStub(endpoint);
LoginDocument loginDocument = LoginDocument.Factory.newInstance();
login = Login.Factory.newInstance();
login.setUsername(UserName);
login.setPassword(PassWord);
loginDocument.setLogin(login);
LoginResponseDocument loginResponseDocument = stub.login(loginDocument, null);
LoginResponse loginResponse = loginResponseDocument.getLoginResponse();
LoginResult loginResult = loginResponse.getResult();
sessionHeader = SessionHeader.Factory.newInstance();
sessionHeader.setSessionId(loginResult.getSessionId());
sessionHeaderDocument = SessionHeaderDocument.Factory.newInstance();
sessionHeaderDocument.setSessionHeader(sessionHeader);
setProgress(10, "Loading service");
fireMyEvent(new MyEvent("Loading Service..."));
stub = new SforceServiceStub(loginResult.getServerUrl());
Options options = stub._getServiceClient().getOptions();
fireMyEvent(new MyEvent("Setting Gzip Compression IN..."));
options.setProperty(HTTPConstants.MC_ACCEPT_GZIP, Boolean.TRUE);
options.setProperty(HTTPConstants.MC_GZIP_REQUEST, Boolean.TRUE);
fireMyEvent(new MyEvent("Connexion established"));
} catch (AxisFault e)
{
exception = e;
} catch (RemoteException e)
{
exception = e;
} catch (InvalidIdFault e)
{
exception = e;
} catch (UnexpectedErrorFault e)
{
exception = e;
} catch (diva.salesforce.webservice.LoginFault e)
{
exception = e;
} catch (ExceptionInInitializerError e)
{
exception = (Exception) e.getException();
}
}
ainsi que ma méthode de requètes:
/**
* Use this method to send SOQL queries to salesforce.
*
* @param querystr
* the SOQL query to send to salesforce.
* @return Query Result
* @throws RemoteException
* @throws InvalidSObjectFault
* @throws MalformedQueryFault
* @throws InvalidIdFault
* @throws InvalidFieldFault
* @throws UnexpectedErrorFault
* @throws InvalidQueryLocatorFault
*/
public QueryResult Query(final String querystr) throws RemoteException, InvalidSObjectFault, MalformedQueryFault,
InvalidIdFault, InvalidFieldFault, UnexpectedErrorFault, InvalidQueryLocatorFault
{
Query query;
QueryDocument queryDocument;
QueryResponseDocument queryResponseDocument;
QueryResponse queryResponse;
QueryResult queryResult = null;
query = Query.Factory.newInstance();
query.setQueryString(querystr);
queryDocument = QueryDocument.Factory.newInstance();
queryDocument.setQuery(query);
queryResponseDocument = stub.query(queryDocument, sessionHeaderDocument, null, null, null);
queryResponse = queryResponseDocument.getQueryResponse();
queryResult = queryResponse.getResult();
return queryResult;
}
pareil pour l'insertion en base:
/**
* Use this method to insert several {@link SObject} in salesforce.
*
* @param sObjectsArray
* @return a {@link SaveResult} array for each inserted objects
* @throws RemoteException
* @throws InvalidSObjectFault
* @throws InvalidIdFault
* @throws InvalidFieldFault
* @throws UnexpectedErrorFault
*/
public SaveResult[] Insert(SObject[] sObjectsArray) throws RemoteException, InvalidSObjectFault, InvalidIdFault,
InvalidFieldFault, UnexpectedErrorFault
{
SaveResult[] saveResultArray = null;
// Invoke the create call
CreateDocument createDocument = CreateDocument.Factory.newInstance();
Create create = createDocument.addNewCreate();
create.setSObjectsArray(sObjectsArray);
CreateResponseDocument createResponseDocument = stub.create(createDocument, sessionHeaderDocument, null, null,
null, null, null, null);
CreateResponse createResponse = createResponseDocument.getCreateResponse();
saveResultArray = createResponse.getResultArray();
return saveResultArray;
}
et la mise-à-jour de champs:
/**
* Use this method to update several {@link SObject} in salesforce.
*
* @param sObjectsArray
* @return
* @throws RemoteException
* @throws InvalidSObjectFault
* @throws InvalidIdFault
* @throws InvalidFieldFault
* @throws UnexpectedErrorFault
*/
public SaveResult[] Update(SObject[] sObjectsArray) throws RemoteException, InvalidSObjectFault, InvalidIdFault,
InvalidFieldFault, UnexpectedErrorFault
{
SaveResult[] updateResultArray = null;
// Invoke the update call
UpdateDocument updateDocument = UpdateDocument.Factory.newInstance();
Update update = updateDocument.addNewUpdate();
update.setSObjectsArray(sObjectsArray);
UpdateResponseDocument updateResponseDocument = stub.update(updateDocument, sessionHeaderDocument, null, null,
null, null, null, null);
UpdateResponse updateResponse = updateResponseDocument.getUpdateResponse();
updateResultArray = updateResponse.getResultArray();
return updateResultArray;
}
ou la suppression de champs:
/**
* This method take an array of object ids to delete ins salesforce. Deleted
* object can be retrieved in the recycle bin.
*
* @param sObjectsIdArray
* @return
* @throws RemoteException
* @throws UnexpectedErrorFault
*/
public DeleteResult[] Delete(String[] sObjectsIdArray) throws RemoteException, UnexpectedErrorFault
{
DeleteResult[] deleteResultArray = null;
// Invoke the delete call
DeleteDocument deleteDocument = DeleteDocument.Factory.newInstance();
com.sforce.soap.enterprise.DeleteDocument.Delete delete = deleteDocument.addNewDelete();
delete.setIdsArray(sObjectsIdArray);
DeleteResponseDocument deleteResponseDocument = stub.delete(deleteDocument, sessionHeaderDocument, null, null,
null, null, null);
DeleteResponse deleteResponse = deleteResponseDocument.getDeleteResponse();
deleteResultArray = deleteResponse.getResultArray();
return deleteResultArray;
}
Comme vous pouvez le voir, c'est un peu le même bateau pour chaque méthode.
En espérant vous avoir aidé. Mon post original sur le forum communautaire de Salesforce: http://community.salesforce.com/sforce/board/message?board.id=JAVA_development&message.id=6728#M6728
N'hésitez pas à consulter le site de
Salfesforce pour plus d'informations sur les évolutions de la solution :
www.salesforce.com/fr