intuit / QuickBooks-V3-Java-SDK

Java SDK for QuickBooks REST API v3 services
Apache License 2.0
70 stars 142 forks source link

Compatibility Issues with Java 21 and QuickBooks Java SDK #224

Open priyanshuKum-are opened 1 month ago

priyanshuKum-are commented 1 month ago

I'm currently working on a Spring Boot project using Java 21, and I've encountered several compatibility issues while integrating the QuickBooks Java SDK.

Issues Encountered: Javax to Jakarta Transition: The SDK is still relying on javax packages, which have been deprecated in favor of jakarta. This presents challenges for compatibility with modern Java applications.

Jackson Databind Version: The SDK uses jackson-databind version 2.9.10, while the latest stable version is 2.17.2. This discrepancy leads to deserialization issues as my project depends on the newer version.

Deserialization Error: While syncing invoices, I encountered the following error:

com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type com.intuit.ipp.data.LineDetailTypeEnum from String "SalesItemLineDetail": not one of the values accepted for Enum class: [TDS_LINE_DETAIL, SUB_TOTAL_LINE_DETAIL, SALES_ITEM_LINE_DETAIL, JOURNAL_ENTRY_LINE_DETAIL, TAX_LINE_DETAIL, ITEM_RECEIPT_LINE_DETAIL, DESCRIPTION_ONLY, SALES_ORDER_ITEM_LINE_DETAIL, ITEM_ADJUSTMENT_LINE_DETAIL, ACCOUNT_BASED_EXPENSE_LINE_DETAIL, DEPOSIT_LINE_DETAIL, GROUP_LINE_DETAIL, ITEM_BASED_EXPENSE_LINE_DETAIL, DISCOUNT_LINE_DETAIL, PURCHASE_ORDER_ITEM_LINE_DETAIL, PAYMENT_LINE_DETAIL, REIMBURSE_LINE_DETAIL] at [Source: UNKNOWN; byte offset: #UNKNOWN] (through reference chain: com.intuit.ipp.data.Invoice["Line"]->java.util.ArrayList[0]->com.intuit.ipp.data.Line["DetailType"]) at com.fasterxml.jackson.databind.exc.InvalidFormatException.from(InvalidFormatException.java:67) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.DeserializationContext.weirdStringException(DeserializationContext.java:1958) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.DeserializationContext.handleWeirdStringValue(DeserializationContext.java:1245) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.deser.std.EnumDeserializer._deserializeAltString(EnumDeserializer.java:447) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.deser.std.EnumDeserializer._fromString(EnumDeserializer.java:304) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.deser.std.EnumDeserializer.deserialize(EnumDeserializer.java:273) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:138) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:310) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromArray(CollectionDeserializer.java:361) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:246) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:30) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:138) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:310) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:342) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:4881) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3035) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.ObjectMapper.treeToValue(ObjectMapper.java:3499) ~[jackson-databind-2.17.2.jar:2.17.2] at com.intuit.ipp.serialization.QueryResponseDeserializer.deserialize(QueryResponseDeserializer.java:183) ~[ipp-v3-java-devkit-6.4.1-jar-with-dependencies.jar:na] at com.intuit.ipp.serialization.QueryResponseDeserializer.deserialize(QueryResponseDeserializer.java:44) ~[ipp-v3-java-devkit-6.4.1-jar-with-dependencies.jar:na] at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:342) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:4881) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3035) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.ObjectMapper.treeToValue(ObjectMapper.java:3499) ~[jackson-databind-2.17.2.jar:2.17.2] at com.intuit.ipp.serialization.IntuitResponseDeserializer.getQueryResponse(IntuitResponseDeserializer.java:367) ~[ipp-v3-java-devkit-6.4.1-jar-with-dependencies.jar:na] at com.intuit.ipp.serialization.IntuitResponseDeserializer.deserialize(IntuitResponseDeserializer.java:203) ~[ipp-v3-java-devkit-6.4.1-jar-with-dependencies.jar:na] at com.intuit.ipp.serialization.IntuitResponseDeserializer.deserialize(IntuitResponseDeserializer.java:54) ~[ipp-v3-java-devkit-6.4.1-jar-with-dependencies.jar:na] at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:342) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4905) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3848) ~[jackson-databind-2.17.2.jar:2.17.2] at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3816) ~[jackson-databind-2.17.2.jar:2.17.2] at com.intuit.ipp.serialization.JSONSerializer.deserialize(JSONSerializer.java:307) ~[ipp-v3-java-devkit-6.4.1-jar-with-dependencies.jar:na] at com.intuit.ipp.interceptors.DeserializeInterceptor.execute(DeserializeInterceptor.java:79) ~[ipp-v3-java-devkit-6.4.1-jar-with-dependencies.jar:na] at com.intuit.ipp.interceptors.IntuitInterceptorProvider.executeResponseInterceptors(IntuitInterceptorProvider.java:114) ~[ipp-v3-java-devkit-6.4.1-jar-with-dependencies.jar:na] at com.intuit.ipp.interceptors.IntuitInterceptorProvider.executeInterceptors(IntuitInterceptorProvider.java:87) ~[ipp-v3-java-devkit-6.4.1-jar-with-dependencies.jar:na] at com.intuit.ipp.services.DataService.executeInterceptors(DataService.java:159) ~[ipp-v3-java-devkit-6.4.1-jar-with-dependencies.jar:na] at com.intuit.ipp.services.DataService.executeQuery(DataService.java:636) ~[ipp-v3-java-devkit-6.4.1-jar-with-dependencies.jar:na] at com.fundtap.integration.service.impl.QuickBooksServiceImpl.syncInvoices(QuickBooksServiceImpl.java:177) ~[classes/:na] at com.fundtap.integration.controller.QuickBooksController.syncInvoices(QuickBooksController.java:142) ~[classes/:na] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) ~[spring-web-6.1.13.jar:6.1.13] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) ~[spring-web-6.1.13.jar:6.1.13] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.1.13.jar:6.1.13] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) ~[spring-webmvc-6.1.13.jar:6.1.13] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) ~[spring-webmvc-6.1.13.jar:6.1.13] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.1.13.jar:6.1.13] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.1.13.jar:6.1.13] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.1.13.jar:6.1.13] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.1.13.jar:6.1.13] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.1.13.jar:6.1.13] at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.30.jar:6.0] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.1.13.jar:6.1.13] at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.30.jar:6.0] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.30.jar:10.1.30] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.1.13.jar:6.1.13] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.13.jar:6.1.13] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1.13.jar:6.1.13] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.13.jar:6.1.13] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.1.13.jar:6.1.13] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.13.jar:6.1.13] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.30.jar:10.1.30] at java.base/java.lang.Thread.run(Thread.java:1570) ~[na:na]

Request for Recommendations: Could you please provide guidance on:

A recommended version of the QuickBooks Java SDK that is fully compatible with Java 21? Any code snippets or examples that would facilitate smooth integration with this version of Java? Thank you for your attention to this matter. I look forward to your assistance.

kamiltrantvananh commented 1 month ago

Use 6.3.0 which uses Java 17. The higher versions was downgraded back to Java 8.

priyanshuKum-are commented 1 month ago

Hi,

Thank you for your response regarding the use of version 6.3.0. However, I am encountering two deserialization error when integrating with the SDK, which states:

Failed to sync invoices: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type com.intuit.ipp.data.LineDetailTypeEnum from String "SalesItemLineDetail": not one of the values accepted for Enum class: [TDS_LINE_DETAIL, SUB_TOTAL_LINE_DETAIL, SALES_ITEM_LINE_DETAIL, JOURNAL_ENTRY_LINE_DETAIL, TAX_LINE_DETAIL, ITEM_RECEIPT_LINE_DETAIL, DESCRIPTION_ONLY, SALES_ORDER_ITEM_LINE_DETAIL, ITEM_ADJUSTMENT_LINE_DETAIL, ACCOUNT_BASED_EXPENSE_LINE_DETAIL, DEPOSIT_LINE_DETAIL, GROUP_LINE_DETAIL, ITEM_BASED_EXPENSE_LINE_DETAIL, DISCOUNT_LINE_DETAIL, PURCHASE_ORDER_ITEM_LINE_DETAIL, PAYMENT_LINE_DETAIL, REIMBURSE_LINE_DETAIL]

"com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type com.intuit.ipp.data.MonthEnum from String \"July\": not one of the values accepted for Enum class: [OCTOBER, SEPTEMBER, JUNE, MARCH, MAY, APRIL, JULY, JANUARY, FEBRUARY, DECEMBER, AUGUST, NOVEMBER]\n at [Source: UNKNOWN; byte offset: #UNKNOWN] (through reference chain: com.intuit.ipp.data.CompanyInfo[\"FiscalYearStartMonth\"])"

This issue seems to arise from a version mismatch between Jackson libraries used in the SDK (version 2.9.10) and those in my project (version 2.17.2).

Given that the SDK relies on specific Jackson versions, is there any guidance or workaround to handle these deserialization issues without modifying the SDK itself?

Your assistance in resolving this would be greatly appreciated!

ManikaSaiKiran commented 1 month ago

@priyanshuKum-are To avoid the deserialization error, please use the Jackson library version specified by the SDK (version 2.9.10). This will ensure compatibility and prevent the deserialization issues you are encountering.

dolson334 commented 1 week ago

any update here? I am very surprised this sdk is not compatible with Java 17 and up. Any work arounds?