Git Product home page Git Product logo

force-rest-api's People

Contributors

dependabot[bot] avatar faf0-addepar avatar hf-kklein avatar ian-sfdc avatar jesperfj avatar meccup avatar rgoers avatar ryanbrainard avatar steventamm avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

force-rest-api's Issues

Redirect not working

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.

asRawJson() option in ResourceRepresentation

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.

updateSObject: "The Id field should not be specified in the sobject data"

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

Unrecognized field "email_verified"

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.

Support for Salesforce Platform Events

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.

Force REST API - giving below exception

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

Auth with user/password/loginendpoint credentials not possible

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")
);

Jodatime Serialization

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

why don't you add the query all?

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);
    }
}`

Return http responses instead of void calls

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.

ApiVersion enum does not contain new Versions

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.

Add support for JWT Bearer Flow

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?

compilation failure

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```

No easy way to get id after "createOrUpdate"

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.

ForceApi with autorenew enabled can/will create new ApiSession but does not provide access to it

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; }

"No content to map due to end-of-input"

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]

BUG with get knowledgeArticles

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

Document: https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_knowledge_support_artlist.htm

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!

How to generate Jackson object from wsdl?

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 {
}

Add proxy settings in ApiConfig

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

Possibility to reconfigure the json mapper?

Hi,

The following line in the ForceApi class is causing us some trouble:
jsonMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

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!

Ability to convert lead into account?

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!

Add formula to DescribeSObject.Field

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

Request to make ForceApi extendable

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?

Support for jdk 10

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?

Missing refresh token on response

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)

Provide support for Rest Resource calls.

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.

Test failure on v46

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?

UnrecognizedPropertyException

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 8, mvn install -DskipTests is failing.

Environment

JDK: 1.8

Issue

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.

Resolution

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?

Add support for Headers

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.

DescribeSObject.Field.referenceTo not being populated

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)

Timeouts are not handled

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?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.