jesperfj / force-rest-api Goto Github PK
View Code? Open in Web Editor NEWJava library for Force.com REST API
Java library for Force.com REST API
Currently, if we Query the Sobjects, the size of the result is 2000 which is the default batch size.
However, we can change this batch by using header as mentioned here: https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/headers_queryoptions.htm
Need an interface to support the above.
Work around is to log into SFDC and open up a Contact record.
In the http client, follow redirects is turned on:
conn.setInstanceFollowRedirects(true);
This, however has no effect, since later in the file, every response code not in code < 300 && code >= 200)
; (302 = redirect) causes an error.
In addition to asList()
and asMap()
and the custom as(Class<T>)
it would be nice to expose asRawJson()
method or similar. This way one could receive the raw JSON from the endpoint, and deserialize in other/custom ways. Perhaps there's a clean way to do this which I am not seeing, if so any insight in that direction is appreciated. Thank you for the work on this library.
Hi,
I'm using the example code to update an object. The object has an id and some properties, just like this:
@JsonIgnoreProperties(ignoreUnknown=true)
public static class MyObject {
@JsonProperty(value="Id")
private String id;
@JsonProperty(value="some_property__c")
private String some_property__c;
public String getId() {return id;}
public void setId(String Id) {this.id = Id;}
public String getSome_property__c() {return some_property_c;}
public void setSome_property__c(String some_propery__c) {this.some_property__c = some_property__c;}
}
When I try to change the property, my program fails:
final String query = "SELECT id, some_property__c FROM sometable";
QueryResult<MyObject> result = api.query(query, MyObject.class);
for (MyObject mo : result.getRecords()) {
mo.setSome_property__c("some value");
api.updateSObject("sometable", mo.getId(), mo);
}
The error message of the API with HTTP status code 400 (bad request) ist:
[
{
"message": "The Id field should not be specified in the sobject data.",
"errorCode": "INVALID_FIELD"
}
]
The Java error is:
INFO com.force.api.http.Http - Bad response code: 400 on request: POST https://myinstance.my.salesforce.com/services/data/v39.0/sobjects/sometable/thealphanumerickey?_HttpMethod=PATCH
Accept: application/json
Content-Type: application/json
Authorization: Bearer ...
{"Id":"thealphanumerickey","some_property__c":"some value"}
And in fact, as soon as I modify the request body, so that it does not contain the id, it works fine.
API version is 39.0
java.lang.RuntimeException: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "email_verified" (Class com.force.api.Identity), not marked as ignorable
Think this is a new field that was added for Spring 14 release.
The ForceAPI createSObject method is able to successfully create a custom Salesforce event but it fails processing the response with:
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "statusCode" (class com.force.api.ApiError), not marked as ignorable (3 known properties: "fields", "apiErrorCode", "message"])
at [Source: (sun.net.www.protocol.http.HttpURLConnection$HttpInputStream); line: 1, column: 159] (through reference chain: com.force.api.CreateResponse["errors"]->java.lang.Object[][0]->com.force.api.ApiError["statusCode"])
at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61) ~[jackson-databind-2.10.1.jar!/:2.10.1]
at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:840) ~[jackson-databind-2.10.1.jar!/:2.10.1]
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1192) ~[jackson-databind-2.10.1.jar!/:2.10.1]
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1592) ~[jackson-databind-2.10.1.jar!/:2.10.1]
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1570) ~[jackson-databind-2.10.1.jar!/:2.10.1]
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:294) ~[jackson-databind-2.10.1.jar!/:2.10.1]
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151) ~[jackson-databind-2.10.1.jar!/:2.10.1]
at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:195) ~[jackson-databind-2.10.1.jar!/:2.10.1]
at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:21) ~[jackson-databind-2.10.1.jar!/:2.10.1]
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129) ~[jackson-databind-2.10.1.jar!/:2.10.1]
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288) ~[jackson-databind-2.10.1.jar!/:2.10.1]
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151) ~[jackson-databind-2.10.1.jar!/:2.10.1]
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202) ~[jackson-databind-2.10.1.jar!/:2.10.1]
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3242) ~[jackson-databind-2.10.1.jar!/:2.10.1]
at com.force.api.ForceApi.createSObject(ForceApi.java:207) ~[force-rest-api-0.0.41.jar!/:?]
This is because Salesforce returns a statusCode attribute in the response instead of the apiErrorCode attribute that is returned when creating "normal" objects.
java.lang.RuntimeException: com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
at [Source: UNKNOWN; line: 1, column: 1]
java.lang.RuntimeException: com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
at [Source: UNKNOWN; line: 1, column: 1]
at com.force.api.Auth.oauthLoginPasswordFlow(Auth.java:47)
at com.force.api.Auth.authenticate(Auth.java:208)
at com.force.api.ForceApi.(ForceApi.java:68)
at com.aws.datasync.SalesforceConnector.main(SalesforceConnector.java:23)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
at [Source: UNKNOWN; line: 1, column: 1]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3607)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3547)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2648)
at com.force.api.Auth.oauthLoginPasswordFlow(Auth.java:32)
... 3 more
soaploginPasswordFlow(config) does not support an already set loginendpoint because it is adding hardwired "/services/Soap/u/33.0"
to an already complete endpoint: .setLoginEndpoint("https://login.salesforce.com/services/Soap/c/28.0/0Dxxxxxxxxxp4")
ForceApi api = new ForceApi(new ApiConfig()
.setApiVersion(ApiVersion.V28)
.setUsername("[email protected]")
.setPassword("gzui678(&GHHJGF")
.setLoginEndpoint("https://login.salesforce.com/services/Soap/c/28.0/0Dxxxxxxxxxp4")
);
Would it be possible to allow ApiConfig to add serialization mappers to the static instance of Jackson's ObjectMapper use in ForceApi? Or even better, could we pass in our own ObjectMapper so we can customize serialization? My use case is that I use JodaTime DateTime objects, which won't serialize properly to the Salesforce format unless I can configure Jackson to use the JodaModule.
If this is something you're interested in doing, I can whip up a PR
Would be great to have -sources.jar and -javadoc.jar in the maven repository. Should just be a small configuration tweak to the pom.xml.
QueryAll
At ForceApi.java:
public QueryResult<Map> queryAll(String query) { return queryAll(query, Map.class); }
`public <T> QueryResult<T> queryAll(String query, Class<T> clazz) {
try {
return queryAny(uriBase() + "/queryAll/?q=" + URLEncoder.encode(query, "UTF-8"), clazz);
} catch (UnsupportedEncodingException e) {
throw new ResourceException(e);
}
}`
Hello,
I was wondering why there is no return value for http responses on some methods:
public void updateSObject(...
whereas this similar method has one (even though its a simple Enum value):
public CreateOrUpdateResult createOrUpdateSObject(...
I would want to monitor what happens to my http call, but as it is, its lost in the void.
Thanks.
Salesforce added v38.0 in the Winter '17 release and v39.0 in the Spring '17.
I have tested locally that adding these options to the ApiVersion
enum seems to be the only action required to enable interaction with these releases and have had no issues taking advantage of new API features.
Due to the fairly high rate of version updates (3 times a year) as well as the consistency of versioning, it might be worth adding logic that calculates out the version number based on an input of [WINTER, SPRING, SUMMER], YEAR
to reduce maintenance, with the calculations as follows:
Winter: 3(YEAR - 2004) - 1
Spring: 3(YEAR - 2004)
Summer: 3(YEAR - 2004) + 1
An input of WINTER, 2017
would, therefore, return version 38.
This library does not support the required and best practice authentication mechanism of the "JWT Bearer Flow" https://help.salesforce.com/s/articleView?id=sf.remoteaccess_oauth_jwt_flow.htm&language=en_US&type=5 .
This is the standard way of doing machine to machine OAuth. You have support for setRefreshToken()
but this isn't helpful as the standard JWT bearer flow Oauth is what you need to to in order to get a token in the first place. Semi-related, the Ruby restforce gem has similar confusion and missing features around JWT bearer flow.
FWIW here's what it looks like in a Postman pre-request script to get a proper access token with Salesorce, where you build a JWT with claims, sign it with the private key (part of the JWT bearer flow), and gets back an access token that's valid for a few hours:
var navigator = {};
var window = {};
const jwt_header = {
"alg": "RS256",
"typ": "JWT"
};
const jwt_claims = {
"iss": pm.collectionVariables.get("SALESFORCE_CONSUMER_KEY"),
"sub": pm.collectionVariables.get("SALESFORCE_USERNAME"),
"aud": "https://test.salesforce.com",
"exp": Date.now() + 10000
};
const private_key = atob(pm.collectionVariables.get("SALESFORCE_PRIVATE_KEY"));
pm.sendRequest({
url: 'http://kjur.github.io/jsrsasign/jsrsasign-latest-all-min.js',
method: 'GET'
}, function (err, res) {
eval(res.text());
const signedJwt = KJUR.jws.JWS.sign('RS256', JSON.stringify(jwt_header), JSON.stringify(jwt_claims), private_key);
// console.log('Assertion to send to Salesforce:', signedJwt);
pm.sendRequest({
url: pm.collectionVariables.get("SALESFORCE_TOKEN_URL"),
method: 'POST',
header: {
'Accept': 'application/json',
'Content-Type': 'application/x-www-form-urlencoded',
},
body: {
mode: 'urlencoded',
urlencoded: [
{ key: "grant_type", value: "urn:ietf:params:oauth:grant-type:jwt-bearer", disabled: false },
{ key: "assertion", value: signedJwt, disabled: false}
]
}
}, function (err, res) {
console.log('Auth err:', err, ' Auth res', res.json());
pm.environment.set("instance_url", res.json().instance_url);
pm.environment.set("authorization", res.json().access_token);
});
});
It looks like this library may be abandonware, are there any forks which add this required auth mechanism?
Pulled down the project to start working on adding a timeout to HTTP requests, got this failure when trying to compile master
by running mvn install -X -DskipTests
:
[ERROR] /dev_exclusions/force-rest-api/src/main/java/com/force/api/ForceApi.java:[330,81] error: method traverse in interface TreeNode cannot be applied to given types;
[ERROR] actual and formal argument lists differ in length
[ERROR] /dev_exclusions/force-rest-api/src/main/java/com/force/api/ForceApi.java:[387,109] error: method traverse in interface TreeNode cannot be applied to given types;
[ERROR] actual and formal argument lists differ in length
[ERROR] /dev_exclusions/force-rest-api/src/main/java/com/force/api/ForceApi.java:[391,57] error: method traverse in interface TreeNode cannot be applied to given types;
[ERROR] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project force-rest-api: Compilation failure
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:213)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:309)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:194)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:107)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:993)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:345)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:191)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: org.apache.maven.plugin.CompilationFailureException: Compilation failure
at org.apache.maven.plugin.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:656)
at org.apache.maven.plugin.CompilerMojo.execute(CompilerMojo.java:128)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
... 20 more```
The CreateOrUpdateResult exposes just a Status which does'nt help. Will fork and try a few ways to make "upsert" work. Probably include the ResourceRepresentation as part of the Result so that you can fetch and do a As() from the Result but that feels inconsistent with create and update where you give a straight up ResourceRepresentation.
I had a situation where I was persisting an accessToken and refreshToken to database after doing an oauth login. The initial accessToken provided quickly expires (hour or so) and so internally the autorenew was fetching a new accessToken but I had no way of accessing it. Every time thereafter I would still instantiate ForceApi using the old, invalid access token and good refresh token and every single time ForceApi would then need to use the refreshToken to create a new accessToken.
This actually caused a further problem in my case because when forceApi was able to communicate I assumed my access token was good and was then using it in my own custom query request (i.e. a url endpoint not supported by this great api - btw, it is great; thanks for the good work).
Something like this should do it:
/** * Need access to ApiSession in case autorenew has been used and a new accessToken issued. * That accessToken may be used externally or used for future creation of ForceApi objects. * @return current ApiSession in use */ public ApiSession getApiSession(){ return this.session; }
Hi, thanks for this library, i am trying to connect force API, my code is here
ForceApi api = new ForceApi(new ApiConfig()
.setUsername("username")
.setPassword("password")
.setClientId("client_id")
.setClientSecret("client_secret"));
result is
Exception in thread "main" java.lang.RuntimeException: com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
at [Source: UNKNOWN; line: 1, column: 1]
i did not save the created object id (the response from the create function).
now i need to update the object as some values were incorrect.
is there any way we can somehow update the data.
It seems like in ForceAPI.java line 502 variable autoRenew
would always be false, even my ForceApi Object have autoRenew
as true.
Some chars in passwords or username like & will end up triggering a 500 in the login flow.
I'll open a PR with a fix.
Hi,
I have been using this tutorial
And I couldn't obtain the refresh token nor the authorization code...
How can I get them?
Hello,
I tried with /services/data/v40.0/support/knowledgeArticles via force-rest-api v40.0 and I get this issue:
[{"errorCode":"MISSING_ARGUMENT","message":"Language has to be specified in HTTP header."}]
I search in Google and I know how to fix it: we need add header:
Accept-language: en-US,en;q=0.9,vi;q=0.8
I need its go to maven, b/c i include this client to my project via maven. Could u pls review and fix it and release to maven 0.0.41 ? tks!
I haven't run the test suite in like forever and now it is failing with a Javascript problem when going through the OAuth flow using HTMLUnit. Here's the output:
You have mentioned that, we need to have Objects with proper Jackson deserialization annotations, How can we create jaxb/jackson object from the enterprise wsdl.
When i use wsc jar [https://github.com/forcedotcom/wsc] to generate the objects, the objects are totally different (soap related). Writing all these objects will be a huge task - is there any best solution to generate these like the way you have mentioned.
Here is the code you have mentioned.
This assumes you have an Account class defined with proper Jackson deserialization annotations. For example:
@JsonIgnoreProperties(ignoreUnknown=true)
public class Account {
}
I use this library in an application with a proxy and it is not working. Even using the following property in my Java code.
System.setProperty ("http.proxyHost", "...");
System.setProperty ("http.proxyPort", "...");
Is it possible to add the possibility to set up a proxy in the class "ApiConfig" so that it is used in methods "openConnection" Class "HttpURLConnection"?
The code is present in this fork: https://github.com/alexsapps/force-rest-api/tree/improvementsMarch2015
Thank you
Hi,
The following line in the ForceApi
class is causing us some trouble:
jsonMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
The problem we are having is that when an attribute currently has a value, but then that value was cleared, we receive that new value as "null" from our source system, but it never reaches Salesforce because this null value is ignored by the JSON serialization in ForceApi.
Was there a specific reason why this is the non-changeable default? Would it maybe be a good extension to make this configurable?
We'd be happy to create a pull request for this, were just wondering what the best way might be. Would it be too granular to introduce a boolean option in the configuration that says includeNonNull
, with default value true
? (In that case the jsonMapper couldn't be a static field anymore, would have to be an instance field that gets initialised in the constructor)
Thanks!
Hi! I wasn't sure what was the best way to contact you.
Is there a way to convert a lead into an account through the client? If so, would you be able to add it to the readme as an example?
Thanks!
Hi,
We are using the ForceAPI
library and would like to to retrieve the calculated formula of a field.
As described here: https://developer.salesforce.com/docs/atlas.en-us.246.0.api.meta/api/sforce_api_calls_describesobjects_describesobjectresult.htm
Salesforce supplies formula
which is:
The formula specified for this field. If no formula is specified for this field, it is not returned.
Can you add it the the DescribeSObject.Field
as you already have calculated
fields which (If I understand correctly) indicated whether this field have a formula or not.
Thank you
I would like to extend ForceApi to call custom salesforce apex rest api's.
Could you please change session and apiRequest access modifiers to protected?
Hi,
we're using ForceAPI to make calls to an environment that uses JDK9 at the moment, but now we're thinking of moving to JDK10. I couldn't find anything in the docs, is there anything we need to be aware of before we do that?
I was checking the maven repo for this api here https://mvnrepository.com/artifact/com.frejo/force-rest-api
And latest version 0.0.41 is not published. Can we take your code and start use it my tweaking it or will there be any licence issues.
Thanks
Jana
I keep getting this error no matter what I do.
java.io.IOException: Missing refresh token on response
at com.force.sdk.oauth.connector.ForceOAuthConnector.createTokenInternal(ForceOAuthConnector.java:196)
at com.force.sdk.oauth.connector.ForceOAuthConnector.getAccessToken(ForceOAuthConnector.java:145)
at com.force.sdk.springsecurity.OAuthAuthenticationProvider.authenticate(OAuthAuthenticationProvider.java:78)
at org.springframework.security.authentication.ProviderManager.doAuthentication(ProviderManager.java:130)
Love the library. Would just be great if you could allow for Rest Resource calls. The ForceApi.uriBase() gets in the way of targeting /services/apexrest. If we could either get a request function which doesn't add this to the .url, or make the fields protected so we could extend the class and overwrite our function, it would be awesome! I'm currently just copying over the entire class, but that doesn't look as neat.
According to https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/intro_understanding_web_server_oauth_flow.htm the instance_url
and id
are returned when a request is made for an access token in exchange for an authorization code (your Auth.completeOAuthWebServerFlow
method that returns an ApiSession). Is it possible to add those fields to ApiSession? Would you accept a PR that does this? Thanks!
I saw in the wiki, there have one Spec include the search function, but in code didn't found this.
When going from v45 to v46, com.force.api.BasicCRUDTest.basicCRUDTest fails. v46 returns code 200 where v45 returns expected code (201 or 204). What changed in Salesforce REST API between 45 and 46?
Hello,
I followed the instructions in the README file in order to make a call to get an Account object and I received the following error. Is this a bug or am I doing something wrong?
2017-09-20 20:31:35,559 ERROR [http-nio-8080-exec-10] GrailsExceptionResolver - UnrecognizedPropertyException occurred when processing request: [GET] /api/test/testSalesforce
Unrecognized field "attributes" (class com.test.Account), not marked as ignorable (6 known properties: "tffAccountNumber", "metaClass", "externalId", "id", "name", "annualRevenue"])
at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@68b2688d; line: 1, column: 16] (through reference chain: com.test.Account["attributes"]). Stacktrace follows:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "attributes" (class com.test.Account), not marked as ignorable (6 known properties: "tffAccountNumber", "metaClass", "externalId", "id", "name", "annualRevenue"])
at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@68b2688d; line: 1, column: 16] (through reference chain: com.test.Account["attributes"])
at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:51)
at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:817)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:954)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1324)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1302)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:249)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:136)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3562)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2648)
at com.force.api.ResourceRepresentation.as(ResourceRepresentation.java:31)
at com.test.TestController$$EQVncaRc.testSalesforce(TestController.groovy:116)
at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:198)
at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
at net.bull.javamelody.JspWrapper.invoke(JspWrapper.java:150)
at net.bull.javamelody.JdbcWrapper$DelegatingInvocationHandler.invoke(JdbcWrapper.java:286)
at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:201)
at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:178)
at grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.java:53)
at grails.plugin.springsecurity.rest.RestAuthenticationFilter.doFilter(RestAuthenticationFilter.groovy:139)
at grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter.doFilter(RequestHolderAuthenticationFilter.java:53)
at grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.java:62)
at grails.plugin.springsecurity.rest.RestLogoutFilter.doFilter(RestLogoutFilter.groovy:80)
at com.AssetFilter.doFilter(AssetFilter.groovy:55)
at com.security.XssFilter.doFilterInternal(XssFilter.groovy:17)
at grails.plugin.databasesession.SessionProxyFilter.doFilterInternal(SessionProxyFilter.java:60)
JDK: 1.8
After cloning the project and running mvn install -DskipTests
, it is failing with the error class file for org.eclipse.jetty.util.component.aggregatelifecycle not found
while compiling the file EndToEndOAuthFlowExample.java
at line 131.
After adding the dependency https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-util/8.1.14.v20131031 to pom.xml
, the issue was resolved.
Is there anything I am missing here?
Bad response code: 400 on request:
POST https://login.salesforce.com/services/oauth2/token
There should be a flexibility to add new ApiVersion without changing the whole code.
Is there any way to upload files like is shown in:
Any plans to add this in the future?
There are some HTTP headers that can be passed when creating objects in salesforce.
Ref Assignment Rule Header for one such header.
Currently ForceAPI#createSObject does not accept any of these custom headers.
Proposed fix would be to have another create method which would take a collection of headers to be applied on the request. Let me know if this sounds good, and I would be more than happy to submit a PR with the change.
Didn't get a chance to dig into this, but com.force.apiDescribeSObject.Field.referenceTo is not getting populated when it should by Jackson. Assuming this has something to do with with being a collection field. Here's a test showing the behavior:
@Test
public void testDescribeSObject() {
DescribeSObject ds = api.describeSObject("Contact");
assertEquals("Contact", ds.getName());
assertNotNull(ds.getAllFields());
assertNotNull(ds.getAllFields().iterator().next().getSoapType());
assertDescribedRelationship(ds, "AccountId", "Account");
}
private void assertDescribedRelationship(DescribeSObject ds, String fieldName, String relationshipName) {
for (DescribeSObject.Field f : ds.getFields()) {
if (f.getName().equals(fieldName)) {
assertEquals(relationshipName, f.getReferenceToEntity().get(0));
return;
}
}
fail(fieldName + " not found");
}
Stacktrace:
ava.lang.NullPointerException
at com.force.api.DescribeTest.assertDescribedRelationship(DescribeTest.java:40)
at com.force.api.DescribeTest.testDescribeSObject(DescribeTest.java:34)
In our application, we started seeing requests to Salesforce time out, which led to problems with blocked threads and our application basically "hanging" after a while.
Digging into the code, it looks as if there is no explicit timeout set with the HTTP clients used. For now, we fixed out problem by wrapping the call into a Hystrix command (which then indeed showed that our problem was timeouts). We just wanted to raise this problem here, as others might run into it as well. Maybe it would be a good extension to allow users to configure a timeout for the calls?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.