关于Force.com Web Service Connector的坑

经常做Java与Salesforce集成的同学一定对wsc这个名字很熟悉。
wsc,即Force.com Web Service Connector的简称。

Sfdc针对各种主流编程语言,都提供了类似wsc的工具套件。
方便开发者快速的搞定与sfdc连接的部分,以便将注意力放在自己的业务代码上。

目前wsc已经开源,并同步更新到了sfdc api v42.0
我于是迫不及待的去体验了一番。
结果发现了不少的坑。

首先,wsc的github地址为https://github.com/forcedotcom/wsc
其实在forcedotcom这个路径下还有不少宝贝。有兴趣可以自己翻翻看。

如同PHP的docker,现代java项目都靠Maven进行发布,这样就免去了到处去找jar包的苦恼。
wsc自然不例外。
没有安装Maven的同学,请先去安装。什么?安装Meven需要安装JDK?如果连JDK都没有。。。还是算了吧。

首先,按README所讲,要先执行下面两行进行Build
git clone https://github.com/forcedotcom/wsc.git
mvn clean package

OK,拷贝,执行,报错。嗯?
我们知道,git clone之后会生成一个文件夹,比如这个repo叫做wsc.git,则会在执行路径生成一个文件夹叫做wsc,然后把所有的源代码放进文件夹wsc里。
如果直接执行mvn命令的话,根本找不到任何东西,要cd wsc之后再执行mvn clean package才行。
果然这个guide不是给我这种小白看的。

第一步git clone顺利完成。
第二部cd wsc也顺利完成。
第三部mvn clean package出问题了。

BUILD FAILURE

原因是有个测试类没有通过。。。。我。。。。
OK,你赢了,我选择跳过执行测试类。
命令于是变成mvn clean package -DskipTests

信心满满地再次执行
BUILD FAILURE

签名没有通过。。。。我。。。。
OK,你又赢了,按照官方指导,命令变为
mvn clean package -Dgpg.skip -DskipTests

终于成功Build

我们知道wsc只是一个外壳,我们需要用wsdl为其注入灵魂。
我分别准备了Enterprize和Partner的WSDL文件。
按照官方所给的命令,再次自信满满地敲了进去
java -jar target/force-wsc-42.0.0-uber.jar

java.lang.ClassNotFoundException: com.sun.tools.javac.Main

这个错误官方再次精确的预言了!继build时签名错误之后,他又成功的预言了我执行之后一定会出错!!
真厉害!!

OK,再次颤颤巍巍的使用官方给的Plan B命令
java -classpath “${JAVA_HOME}lib/tools.jar:target/force-wsc-42.0.0-uber.jar” com.sforce.ws.tools.wsdlc

错误: 找不到或无法加载主类 com.sforce.ws.tools.wsdlc

咦——?

一定是JAVA_HOME设置的有问题,我于是将tools.jar从jdk的lib路径拷贝到了wsc/target文件夹,这次没问题了吧。
java -classpath “target/tools.jar:target/force-wsc-42.0.0-uber.jar” com.sforce.ws.tools.wsdlc

错误: 找不到或无法加载主类 com.sforce.ws.tools.wsdlc

。。。。。。。。。。。我。。无言以对

正当绝望之时,发现,我靠,官方给的命令!居然!冒号和分号写错了!!!!!!
误:java -classpath “${JAVA_HOME}lib/tools.jar:target/force-wsc-42.0.0-uber.jar” com.sforce.ws.tools.wsdlc
正:java -classpath “${JAVA_HOME}lib/tools.jar;target/force-wsc-42.0.0-uber.jar” com.sforce.ws.tools.wsdlc
来,大家来找茬

终于,执行
java -classpath “target/tools.jar;target/force-wsc-42.0.0-uber.jar” com.sforce.ws.tools.wsdlc
之后,终于,灵魂jar包成功生成。

然后试着跑了一下官方sample,

import com.sforce.soap.partner.*;
import com.sforce.soap.partner.sobject.*;
import com.sforce.ws.*;

public class testMain {

	public static void main(String[] args) throws ConnectionException {
		// TODO Auto-generated method stub
		ConnectorConfig config = new ConnectorConfig();
		config.setUsername("[YOUR SFDC USER ID]");
		config.setPassword("[YOUR PASSWORD]");
		config.setAuthEndpoint("https://login.salesforce.com/services/Soap/u/41.0");
		
		PartnerConnection connection = Connector.newConnection(config);
		connection.setAssignmentRuleHeader(null, true);
		SObject account = new SObject();
		account.setType("Account");
		account.setField("Name", "My Account");
		connection.create(new SObject[]{account});
	}

}

正常执行结束,Account成功创建。

// update 2018-02-09

我发起了一个pull request去修正之前提到的分号问题,不知道什么时候会merge进去。
https://github.com/forcedotcom/wsc/pull/218

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据