#java #quickbooks #intuit-partner-platform #quickbooks-online #intuit
#java #quickbooks #quickbooks-онлайн #intuit-партнерская платформа
Вопрос:
После установления успешного подключения к Intuit с помощью OpenID и нажатия ссылки «Найти всех клиентов» (убедившись, что клиенты (только 2 клиента) существуют в моей учетной записи Intuit), в которой используется следующий набор кода на JSP:
QBCustomerService customerService = null;
try {
// Create the customer service.
customerService = QBServiceFactory.getService(context,
QBCustomerService.class);
} catch (QBInvalidContextException e) {
System.out.println("(QBInvalidContextException thrown by getService: " e.getMessage());
}
try {
// Using the service, retrieve all customers and display their names.
List<QBCustomer> customers = customerService
.findAll(context, 1, 100);
} catch (Exception e) {
System.out.println("Exception thrown by findAll: " e.getMessage());
}
Я получаю следующую ОШИБКУ:
SEVERE: Error: 500
Exception thrown by findAll: com.intuit.ds.qb.IDSException:
at com.intuit.ds.qb.IDSRestClient.sendRequest(IDSRestClient.java:521)
at com.intuit.ds.qb.IDSRestClient.post(IDSRestClient.java:164)
at com.intuit.ds.qb.qbo.QBORequestCreator.doIDSPost(QBORequestCreator.java:28)
at com.intuit.ds.qb.qbo.AbstractQBOBaseDataService.findAll(AbstractQBOBaseDataService.java:170)
at com.intuit.ds.qb.qbo.QBOCustomerService.findAll(QBOCustomerService.java:127)
at org.apache.jsp.findallcustomers_jsp._jspService(findallcustomers_jsp.java:131)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Пожалуйста, дайте мне знать, если я чего-то не хватает или делаю что-то неправильно. Кроме того, дайте мне знать, если вы хотите узнать больше о какой-либо конфигурации, которую я делаю для настройки этого приложения.
Редактировать
Даже после компиляции приложения V3, предложенного Manas Ref — https://github.com/IntuitDeveloperRelations/QuickbooksV3API-Java
во время запуска этого приложения я получаю эту ошибку:
SEVERE: StandardWrapper.Throwable
java.lang.NoClassDefFoundError: com/intuit/ipp/exception/FMSException
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
at java.lang.Class.getDeclaredConstructors(Unknown Source)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:229)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:962)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:935)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:631)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:588)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:645)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:508)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:449)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:133)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:864)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.intuit.ipp.exception.FMSException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
... 40 more
Jul 07, 2014 1:20:19 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Allocate exception for servlet qbapiv3
java.lang.ClassNotFoundException: com.intuit.ipp.exception.FMSException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
at java.lang.Class.getDeclaredConstructors(Unknown Source)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:229)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:962)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:935)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:631)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:588)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:645)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:508)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:449)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:133)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:864)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Я дважды проверил, что класс FMSException все еще присутствует в библиотеке, которую я загрузил и сделал доступной по пути к классу отсюда
.
РЕДАКТИРОВАТЬ Я каким-то образом настроил QuickBooks версии 2 для целей подключения и использования библиотек версии 3 для выполнения DML в QuickBooks (создание / выборка клиента — работает нормально). Однако я не могу понять, почему я не могу настроить QuickBooks версии 3 в качестве Java-приложения.
Мой главный девиз, стоящий за использованием QuickBooks, заключается в том, чтобы внешнее приложение выполнялось всякий раз, когда в QuickBooks есть DML. Я не знаю, есть ли такая возможность в QuickBooks:
- Написание триггера для определенных объектов или,
- Какие-то push-уведомления для клиентов (модель издатель — подписчик) — Здесь издателем будет учетная запись QuickBooks, а Подписчиком будет наше зарегистрированное приложение. (срабатывает всякий раз, когда происходит какой-либо DML).
Пожалуйста, дайте мне знать ваши предложения по этому поводу.
Комментарии:
1. ошибка 500 обычно возникает, когда срок действия токенов истек или закончилась подписка компании. Проверьте, так ли это. Попробуйте восстановить свои токены OAuth.
Ответ №1:
Вы используете образец приложения JAVA V2. API версии V2 устарели, и вы не можете получить доступ к данным глобальной компании, используя версию V2.
Пожалуйста, используйте образец приложения V3, ссылка — https://github.com/IntuitDeveloperRelations/QuickbooksV3API-Java
Инструкция по установке доступна здесь — https://developer.intuit.com/docs/0025_quickbooksapi/0055_devkits/sample_code/spring_sample_app_for_quickbooksapi/0002_creating_the_app
Команда Maven —
mvn install:install-file -DgroupId=com.intuit.code.devkit.v3 -DartifactId=ipp-v3-java-devkit -Dversion=2.3.1 -Dpackaging=jar -Dfile=<JarFilePath>ipp-v3-java-devkit-2.3.1-jar-with-dependencies.jar
PN — При необходимости, пожалуйста, измените номер версии в соответствии с имеющейся у вас версией devkit.
Последняя версия devkit доступна здесь — https://developer.intuit.com/docs/0025_quickbooksapi/0055_devkits
Повторные запросы на Push-уведомления На данный момент эта услуга недоступна в рабочей среде. Есть пара существующих решений, о которых вы должны узнать, немного погуглив.
Imp — Вам не следует использовать устаревшее приложение версии V2.
Спасибо
Комментарии:
1. спасибо, что вернулись. Похоже, что при настройке API Quickbooks V3 он не компилировал POM и не смог удовлетворить зависимость, и даже после подготовки pom я не могу его выполнить. Пожалуйста, ознакомьтесь с моими обновлениями в starting V3 API в самом моем вопросе.
2. Установили ли вы зависимости, как указано в следующем руководстве по установке? developer.intuit.com/docs/0025_quickbooksapi/0055_devkits/… В команде mvn, пожалуйста, используйте последний номер версии devkit (т.е. 2.3.1). ipp-java-qbapihelper jar доступен как часть архива devkit. Это должно сработать. Пожалуйста, сообщите нам, если вы все еще сталкиваетесь с какой-либо проблемой. Спасибо
3. Манас, я также не могу установить зависимости с помощью команды mvn. Дайте мне знать, поможет ли вам трассировка стека ошибок понять. Смотрите результат здесь: pastebin.com/S5njS8Lm (Вывод Mvn QuickBooks)
4. После внесения некоторых поправок в POM (здесь: pastebin.com/H9aJdY9J ), Я получаю другую ошибку, и, похоже, она также загрузила некоторую информацию. Ошибка, которую я получаю сейчас, такова: pastebin.com/UdRWSZVH . Пожалуйста, дайте мне знать об этом. Я также упомянул в POM, что 3 зависимости не работают (не компилируются)
5. Пожалуйста, ознакомьтесь с моими правками и дайте мне знать, есть ли возможность настроить приложение (в качестве фонового приложения). Это означает, что пользователь будет взаимодействовать только со стандартными страницами QuickBooks, а за экраном наше приложение настройки будет прослушивать события DML, происходящие для этой конкретной учетной записи QuickBooks (например, служба push-уведомлений). Есть идеи!