java - QuickBooks Online Java SDK DataServiceexecuteBatch() 导致 NullPointerException

标签 java quickbooks quickbooks-online intuit-partner-platform

我正在尝试使用 Java SDK v2.2.1 和 ipp v3 来运行 QuickBooks Online 批处理作业:

public int updateQuickBooks(BatchOperation batch) {

    OAuthAuthorizer oauth = new OAuthAuthorizer(
        consumerKey, consumerSecret, accessToken, accessTokenSecret);
    assert(oauth != null);

    Context context = new Context(oauth, QuickBooks.APP_TOKEN, ServiceType.QBO, realmID);
    assert(context != null);

    DataService service = new DataService(context);
    assert(service != null);

    LOG.info("Executing QuickBooks batch operation for " + batch.getBIds().size() + " invoices");
    service.executeBatch(batch);

...以及错误的堆栈跟踪:

java.lang.NullPointerException
at com.intuit.ipp.interceptors.ConnectionInterceptor.getRetryHandler(ConnectionInterceptor.java:212)
at com.intuit.ipp.interceptors.ConnectionInterceptor.execute(ConnectionInterceptor.java:85)
at com.intuit.ipp.interceptors.IntuitInterceptorProvider.executeRequestInterceptors(IntuitInterceptorProvider.java:76)
at com.intuit.ipp.interceptors.IntuitInterceptorProvider.executeInterceptors(IntuitInterceptorProvider.java:62)
at com.intuit.ipp.services.DataService.executeBatch(DataService.java:387)
at ie.search4less.quickbooks.InvoiceGenerator.updateQuickBooks(InvoiceGenerator.java:120)
at ie.search4less.quickbooks.FileUploadServlet.doPost(FileUploadServlet.java:79)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:127)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:98)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:491)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

您可以从堆栈跟踪中看到,是 DataServiceexecuteBatch() 函数导致了错误。

我正在本地主机上运行的 Google App Engine 开发服务器上对此进行测试。我顺利完成了 oAuth 流程,并且获得了访问 key 和访问 secret 。我正在使用我的开发应用程序 token 和消费者 key / secret ,并且我绝对确定凭据是正确的。

无论如何,我将 accessToken 更改为一些硬编码的随机字符串值,但错误是相同的。 SDK 似乎根本无法与 API 端点通信。这可能是 App Engine 环境的问题吗?

更新:

我刚刚遇到this类似的问题,我尝试删除我的 qbapihelper-1.2.0-with-dependencies jar (我只有它和 devkit-2.2.1-with-dependencies jar),但它没有产生任何影响。

更新2:

这似乎是使用 GAE 和 QBO 的 java SDK 的问题,但不幸的是我没有时间进一步调试这个问题,所以我已经切换到我自己的 Web 服务器(使用 Jetty - 这就是GAE 不需要太多移植工作)。

最佳答案

我建议您在您的系统上尝试一下(不使用 GAE)。如果它运行良好,那么您可能需要配置您的 GAE 环境(可能是一些代理设置?或限制出站请求等)。

我尝试了以下代码,效果很好。

public void createNoOfPurchaseUsingBatch(int noOfPurchaseInBatch) {

    BatchOperation batchOperation = new BatchOperation();

    for (int i = 1; i <= noOfPurchaseInBatch; i = i + 1) {
        Customer customer = createCustomer();
        batchOperation.addEntity(customer, OperationEnum.CREATE, "bID" + i);
    }
    try {
        this.service.executeBatch(batchOperation);
    } catch (FMSException e) {
        e.printStackTrace();
    }
}

private Customer createCustomer() {
    Customer cust = new Customer();
    cust.setDisplayName("HelloWorld " + UUID.randomUUID().toString().substring(0, 5));
    return cust;
}

请求

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<IntuitBatchRequest xmlns="http://schema.intuit.com/finance/v3">
    <BatchItemRequest bId="bID1" operation="create">
        <Customer>
            <DisplayName>HelloWorld 0d89f</DisplayName>
        </Customer>
    </BatchItemRequest>
    <BatchItemRequest bId="bID2" operation="create">
        <Customer>
            <DisplayName>HelloWorld 90251</DisplayName>
        </Customer>
    </BatchItemRequest>
</IntuitBatchRequest>

回应

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2014-05-01T06:56:43.373-07:00">
    <BatchItemResponse bId="bID1">
        <Customer domain="QBO" sparse="false">
            <Id>7</Id>
            <SyncToken>0</SyncToken>
            <MetaData>
                <CreateTime>2014-05-01T06:56:43-07:00</CreateTime>
                <LastUpdatedTime>2014-05-01T06:56:43-07:00</LastUpdatedTime>
            </MetaData>
            <FullyQualifiedName>HelloWorld 0d89f</FullyQualifiedName>
            <DisplayName>HelloWorld 0d89f</DisplayName>
            <PrintOnCheckName>HelloWorld 0d89f</PrintOnCheckName>
            <Active>true</Active>
            <Taxable>false</Taxable>
            <Job>false</Job>
            <BillWithParent>false</BillWithParent>
            <Balance>0</Balance>
            <BalanceWithJobs>0</BalanceWithJobs>
            <CurrencyRef name="Australian Dollar">AUD</CurrencyRef>
            <PreferredDeliveryMethod>Email</PreferredDeliveryMethod>
        </Customer>
    </BatchItemResponse>
    <BatchItemResponse bId="bID2">
        <Customer domain="QBO" sparse="false">
            <Id>8</Id>
            <SyncToken>0</SyncToken>
            <MetaData>
                <CreateTime>2014-05-01T06:56:43-07:00</CreateTime>
                <LastUpdatedTime>2014-05-01T06:56:43-07:00</LastUpdatedTime>
            </MetaData>
            <FullyQualifiedName>HelloWorld 90251</FullyQualifiedName>
            <DisplayName>HelloWorld 90251</DisplayName>
            <PrintOnCheckName>HelloWorld 90251</PrintOnCheckName>
            <Active>true</Active>
            <Taxable>false</Taxable>
            <Job>false</Job>
            <BillWithParent>false</BillWithParent>
            <Balance>0</Balance>
            <BalanceWithJobs>0</BalanceWithJobs>
            <CurrencyRef name="Australian Dollar">AUD</CurrencyRef>
            <PreferredDeliveryMethod>Email</PreferredDeliveryMethod>
        </Customer>
    </BatchItemResponse>
</IntuitResponse>

谢谢

关于java - QuickBooks Online Java SDK DataServiceexecuteBatch() 导致 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23397142/

相关文章:

java - 为什么 JAVAC 说,包 <pkg_name> 不存在?

quickbooks - 桌面版 Quickbooks 与 Windows 服务集成

QuickBooks API - 检索所有帐户的交易

php - 在美国版 QuickBooks Online 中成功添加客户,但在加拿大版 QBO 中通过 PHP 中的 Intuit API 出现验证错误

oauth - 如何在 ColdFusion 9 中签署 Quickbooks 在线 API 请求?

Java套接字超时错误

java - 程度报告 4.1.6 和 Selenium 未显示最新测试结果

java - 如何在不使用 OAuth 的情况下使用 QuickBooks Online 进行简单例份验证?

java - Intuit Anywhere Java 的 Hello World 发现客户不工作

Java - repaint(x, y, w, h) 不调用 paintComponent?