Tuesday, January 20, 2015

How to Create a field in Salesforce Using java

Hi ,

To add custom field to a custom object use below code. You must use Partner and metadata API's to create the custm field.

//To following code creates a metadata connection
import com.sforce.soap.metadata.*;
import com.sforce.soap.partner.LoginResult;
import com.sforce.soap.partner.PartnerConnection;
import com.sforce.ws.ConnectionException;
import com.sforce.ws.ConnectorConfig;
/**
* Login utility.
*/
public class MetadataLoginUtil {
public static MetadataConnection login() throws ConnectionException {
final String USERNAME = "username@gmail.com";
// This is only a sample. Hard coding passwords in source files is a bad practice.
final String PASSWORD = "Password+SecurityToken";
final String URL = "https://login.salesforce.com/services/Soap/u/31.0";

//Quick Start Step 3: Walk through the Java Sample Code
final LoginResult loginResult = loginToSalesforce(USERNAME, PASSWORD, URL);
//System.out.println(loginResult);
return createMetadataConnection(loginResult);
}
private static MetadataConnection createMetadataConnection(
final LoginResult loginResult) throws ConnectionException {
final ConnectorConfig config = new ConnectorConfig();
config.setServiceEndpoint(loginResult.getMetadataServerUrl());
config.setSessionId(loginResult.getSessionId());
return new MetadataConnection(config);
}
private static LoginResult loginToSalesforce(
final String username,
final String password,
final String loginUrl) throws ConnectionException {
final ConnectorConfig config = new ConnectorConfig();
config.setAuthEndpoint(loginUrl);
config.setServiceEndpoint(loginUrl);
config.setManualLogin(true);
return (new PartnerConnection(config)).login(username, password);
}

}

//The following code creates a custom field using metadata conncetion and createMetadata() method.

import java.util.ArrayList;
import java.util.concurrent.ForkJoinPool.ManagedBlocker;
import com.sforce.async.Error;
import com.sforce.soap.metadata.*;
import com.sforce.soap.metadata.FieldType;
import com.sforce.soap.metadata.Package;
import com.sforce.soap.metadata.SaveResult;
import com.sforce.soap.partner.*;
import com.sforce.ws.ConnectionException;
import com.sforce.ws.ConnectorConfig;
import com.sforce.ws.wsdl.SfdcApiType;
/**
* Login utility.
*/
public class PartnerLoginUtil {

public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
try {
PartnerLoginUtil p= new PartnerLoginUtil( );
p.createCustomExtField("CustomObjectName");

} catch (ConnectionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private void createCustomExtField(String name) {
// TODO Auto-generated method stub
CustomField cs = new CustomField();
cs.setFullName(name+".CustExtField__c");
cs.setLabel("CustExtField");
cs.setType(FieldType.Number);
cs.setExternalId(true);
cs.setPrecision(10);
cs.setScale(8);
try {
MetadataConnection metadataConnection = MetadataLoginUtil.login();
SaveResult[] results = metadataConnection
.updateMetadata(new Metadata[] {cs});

for (SaveResult r : results) {
if (r.isSuccess()) {
System.out.println("Created component: " + r.getFullName());
} else {
System.out
.println("Errors were encountered while creating "
+ r.getFullName());
for (com.sforce.soap.metadata.Error e : r.getErrors()) {
System.out.println("Error message: " + e.getMessage());
System.out.println("Status code: " + e.getStatusCode());
}
}
}
} catch (ConnectionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}


Regards,
Naveen
http://www.autorabit.com

2 comments:

  1. Hello Navin,
    do we need to pass password and security token directly without encoding?
    I am getting issue with it.

    ReplyDelete
    Replies
    1. [LoginFault [ApiFault exceptionCode='INVALID_LOGIN'
      exceptionMessage='Invalid username, password, security token; or user locked out.'
      ]
      ]

      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
      at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
      at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
      at java.lang.Class.newInstance(Class.java:442)
      at com.sforce.ws.bind.TypeMapper.readSingle(TypeMapper.java:673)
      at com.sforce.ws.bind.TypeMapper.readObject(TypeMapper.java:556)
      at com.sforce.ws.transport.SoapConnection.parseDetail(SoapConnection.java:236)
      at com.sforce.ws.transport.SoapConnection.createException(SoapConnection.java:210)
      at com.sforce.ws.transport.SoapConnection.receive(SoapConnection.java:156)
      at com.sforce.ws.transport.SoapConnection.send(SoapConnection.java:99)
      at com.sforce.soap.partner.PartnerConnection.login(PartnerConnection.java:955)
      at fields.MetadataLoginUtil.loginToSalesforce(MetadataLoginUtil.java:39)
      at fields.MetadataLoginUtil.login(MetadataLoginUtil.java:20)
      at fields.PartnerLoginUtil.createCustomExtField(PartnerLoginUtil.java:43)
      at fields.PartnerLoginUtil.main(PartnerLoginUtil.java:24)

      Delete