SForceAPI:无法找到API上列出的类? (帐户,联系方式等)

时间:2010-12-27 06:34:28

标签: axis2 salesforce webservice-client force.com

API引用:http://www.salesforce.com/us/developer/docs/api/index.htm
                         subsection:reference->标准对象

客户端详情: partner.wsdl,Axis2 1.5 ,                                     使用解压缩选项(-u)生成存根。

我希望找到一些基本的对象,比如账号,联系方式等(在上面的网址上列出),这样我就可以做点什么了

-> SObject[] sObjArray = queryResult.getRecords(); 

   for(SObject sObj : sObjArray){
     Account acc = [Account] sObj; 
   }

[上述方法在另一个网络服务中成功使用 - 'Zuora']

但是,我在生成的类中找不到Account类。我想我的方法不对,但至少我应该找到参考API中列出的类。

请帮忙。

3 个答案:

答案 0 :(得分:2)

合作伙伴WSDL有一个松散类型的数据模型,允许与任何组织的数据进行交互,而无需事先知道其模式 - 您只需获得SObject。相比之下,企业 WSDL是强类型的,并且具有您正在寻找的帐户,联系人等类型 - 请参阅http://www.salesforce.com/us/developer/docs/api/Content/sforce_api_partner.htm

此外,由于您根据需要为组织生成企业WSDL,因此它包括您的自定义类型(或Salesforce用语中的对象)。

[已更新以回答评论...]

我使用

生成了存根
wsdl2java.sh -uri ~/soapclient/partner.wsdl.xml -p com.superpat.partner -d adb -u -s

我不是Axis2专家,但我一起攻击了以下内容,似乎有效:

package axis2partner;

import com.sforce.soap.partner.Login;
import com.sforce.soap.partner.LoginResult;
import com.sforce.soap.partner.Query;
import com.sforce.soap.partner.QueryResult;
import com.sforce.soap.partner.SessionHeader;
import com.sforce.soap.partner.sobject.SObject;
import com.superpat.partner.SforceServiceStub;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.axiom.om.OMElement;

public class Main {
    private static String username = "user@example.com";
    private static String password = "password";
    private static String securityToken = "SECURITY_TOKEN";

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            // First, login to get a session ID and server URL
            SforceServiceStub loginStub = new SforceServiceStub();

            Login login = new Login();

            login.setUsername(username);
            login.setPassword(password + securityToken);

            LoginResult loginResult
                    = loginStub.login(login, null, null).getResult();

            // Now make a stub for the correct service instance
            SforceServiceStub serviceStub
                    = new SforceServiceStub(loginResult.getServerUrl());

            SessionHeader sessionHeader = new SessionHeader();
            sessionHeader.setSessionId(loginResult.getSessionId());

            // Now we can execute the actual query
            Query query = new Query();
            query.setQueryString("SELECT Id, Name, AccountNumber, BillingCity,"
                    + " BillingState, Description FROM Account");

            QueryResult queryResult = serviceStub.query(query, sessionHeader,
                    null, null, null, null).getResult();

            SObject[] sObjArray = queryResult.getRecords();

            for ( SObject sObj : sObjArray ) {
                System.out.println(sObj.getId());
                for ( OMElement omElement : sObj.getExtraElement() ) {
                    System.out.println("\t" + omElement.getLocalName() + ": "
                            + omElement.getText());
                }
            }
        } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

在我的开发组织中,这会产生以下形式的输出:

0015000000VALE3AAP
    Id: 0015000000VALE3AAP
    Name: United Oil & Gas Corp.
    AccountNumber: CD355118
    BillingCity: New York
    BillingState: NY
    Description: World's third largest oil and gas company.

注意 - 原始SOAP接口非常通用,而不是使用Force.com API的最简单方法。您可能需要查看Force.com Web Services Connector。还有REST API,但它目前(2011年1月)在开发人员预览中,而不是用于生产部署。

答案 1 :(得分:1)

要添加“metadaddy”发布的回复并帮助“Firefox”以及可能偶然发现这个答案的其他人,我想从个人经验中分享一些观察结果:

  1. 使用Salesforce.com(SFDC)与Axis(例如Axis 1.4)的合作伙伴WSDL非常容易,但是使用Axis2的合作伙伴WSDL非常困难(例如Axis2 1.5.1或1.6.0)。 / LI>
  2. 要将合作伙伴WSDL与Axis2一起使用,您基本上需要创建从企业WSDL创建的对象的传真。如果您决定使用此方法,也可以从企业WSDL生成存根,并使用为“帐户”,“联系人”等生成的代码作为创建自定义“SObject”实例的起点。
  3. 那就是说,我的建议就是将企业WSDL与Axis2一起使用。如果您不得不将合作伙伴WSDL与某些版本的Axis一起使用,请将其与先前版本的Axis一起使用。
  4. 在Google上搜索会显示很多人都同意我的评估。

    更好的是,虽然我没有使用它,但我建议使用SFDC的REST API。

答案 2 :(得分:0)