adobe / aem-core-cif-components

A set of configurations and components to get you started with AEM Commerce development
Apache License 2.0
103 stars 80 forks source link

Unable to parse JsonPrimitive when using AddCustomSimpleField on CategoriesRetriever #679

Closed smallcar88 closed 2 years ago

smallcar88 commented 3 years ago

User Story

Our company has a Magento commerce site that is up and running. We have added a custom membership point for a loyalty program. Afterward, we have decided to build another frontend site using AEM therefore we make use of CIF components to build the react frontend. During the development, we have to extend the CIF component FeaturedCategoryList and modify the GraphQL query to retrieve the products from the selected category. The retrieved products should include the custom GraphQL attribute mentioned above.

Expected Behaviour

The customized attribute value (datatype Number) return from GraphQL should be parsed as a primitive number. Even a nullable attribute with null returned value is unable to parse successfully. The page JSON model can be rendered successfully.

Actual Behaviour

The primitive value is processed by asJsonObject the Gson package used by the model exporter will throw an exception that

07.09.2021 09:43:25.758 *ERROR* [127.0.0.1 [1630979004078] GET /content/theclub-spa-react/spa.model.json HTTP/1.1] org.apache.sling.models.impl.ExportServlet.com.theclub.spa.react.core.models.impl.CustomPageImpl Could not perform export with jackson requested by model.
org.apache.sling.models.factory.ExportException: **com.fasterxml.jackson.databind.JsonMappingException: Not a JSON Object: 0** (through reference chain: com.theclub.spa.react.core.models.impl.CustomPageImpl[":children"]->java.util.LinkedHashMap["/content/theclub-spa-react/spa/en-mobile"]->com.theclub.spa.react.core.models.impl.CustomPageImpl[":items"]->java.util.LinkedHashMap["root"]->com.day.cq.wcm.foundation.model.responsivegrid.ResponsiveGrid[":items"]->java.util.LinkedHashMap["menu"]->com.day.cq.wcm.foundation.model.responsivegrid.ResponsiveColumn["exportedComponent"]->com.theclub.spa.react.core.models.impl.MenuImpl[":items"]->java.util.LinkedHashMap["tierbannerlist"]->com.theclub.spa.react.core.models.impl.TierBannerListImpl[":items"]->java.util.LinkedHashMap["tierbannerproductlis"]->com.theclub.spa.react.core.models.impl.TierBannerProductListImpl["categories"]->java.util.ArrayList[0]->com.adobe.cq.commerce.magento.graphql.CategoryTree["responseData"]->java.util.HashMap["products"]->com.adobe.cq.commerce.magento.graphql.CategoryProducts["responseData"]->java.util.HashMap["items"]->java.util.ArrayList[0]->com.adobe.cq.commerce.magento.graphql.VirtualProduct["responseData"]->java.util.HashMap["min_clubpoints"]->com.google.gson.JsonPrimitive["asJsonObject"])

Reproduce Scenario (including but not limited to)

I extend the GraphQL query using categoriesRetriever.extendCategoryQueryWith() and a customized attribute that is not an out-of-box Magento attribute.

The return value is 0 which is a primitive number. However, the Gson package used by the model exporter will throw an exception.

Steps to Reproduce

  1. Setup GraphQL connection
  2. Extend a proxy component from FeaturedCategoryList
  3. Extend GraphQL query by categoriesRetriever.extendCategoryQueryWith() API

Platform and Version

AEM 6.5 Service Pack 8 aem-core-cif-components 2.0.0 com.adobe.commerce.cif.graphql-client 1.7.2 com.adobe.commerce.cif.magento-graphql 9.0.0.magento242ee

Sample Code that illustrates the problem

  @PostConstruct
   public void initModel() {
       categoriesRetriever = categoryList.getCategoriesRetriever();
       if (categoriesRetriever != null) {
        categoriesRetriever.extendCategoryQueryWith(c -> c.products(
           p -> p.items(
             item -> item.name()
                        .sku()
                        .image( img -> img.url())
                        .priceRange(pr -> pr.minimumPrice(
                          mP -> mP.discount(d -> d.amountOff().percentOff())
                                       .finalPrice(fp -> fp.value().currency())
                                       .regularPrice(rP -> rP.value().currency())

                        ).maximumPrice(
                          mP -> mP.discount(d -> d.amountOff().percentOff())
                                       .finalPrice(fp -> fp.value().currency())
                                       .regularPrice(rP -> rP.value().currency())
                        ))
                        .addCustomSimpleField(CLUBPOINT_ATTRIBUTE)  // Add an non-standard attribute
           )
        ));
        categoriesRetriever.fetchCategories();
       }

Logs taken while reproducing problem

07.09.2021 09:43:25.758 *ERROR* [127.0.0.1 [1630979004078] GET /content/theclub-spa-react/spa.model.json HTTP/1.1] org.apache.sling.models.impl.ExportServlet.com.theclub.spa.react.core.models.impl.CustomPageImpl Could not perform export with jackson requested by model.
org.apache.sling.models.factory.ExportException: com.fasterxml.jackson.databind.JsonMappingException: Not a JSON Object: 0 (through reference chain: com.theclub.spa.react.core.models.impl.CustomPageImpl[":children"]->java.util.LinkedHashMap["/content/theclub-spa-react/spa/en-mobile"]->com.theclub.spa.react.core.models.impl.CustomPageImpl[":items"]->java.util.LinkedHashMap["root"]->com.day.cq.wcm.foundation.model.responsivegrid.ResponsiveGrid[":items"]->java.util.LinkedHashMap["menu"]->com.day.cq.wcm.foundation.model.responsivegrid.ResponsiveColumn["exportedComponent"]->com.theclub.spa.react.core.models.impl.MenuImpl[":items"]->java.util.LinkedHashMap["tierbannerlist"]->com.theclub.spa.react.core.models.impl.TierBannerListImpl[":items"]->java.util.LinkedHashMap["tierbannerproductlis"]->com.theclub.spa.react.core.models.impl.TierBannerProductListImpl["categories"]->java.util.ArrayList[0]->com.adobe.cq.commerce.magento.graphql.CategoryTree["responseData"]->java.util.HashMap["products"]->com.adobe.cq.commerce.magento.graphql.CategoryProducts["responseData"]->java.util.HashMap["items"]->java.util.ArrayList[0]->com.adobe.cq.commerce.magento.graphql.VirtualProduct["responseData"]->java.util.HashMap["min_clubpoints"]->com.google.gson.JsonPrimitive["asJsonObject"])
    at org.apache.sling.models.jacksonexporter.impl.JacksonExporter.export(JacksonExporter.java:120) [org.apache.sling.models.jacksonexporter:1.0.8]
    at org.apache.sling.models.impl.ModelAdapterFactory.exportModel(ModelAdapterFactory.java:1313) [org.apache.sling.models.impl:1.4.16]
    at org.apache.sling.models.impl.ExportServlet$RequestAccessor.getExportedString(ExportServlet.java:203) [org.apache.sling.models.impl:1.4.16]
    at org.apache.sling.models.impl.ExportServlet.doGet(ExportServlet.java:106) [org.apache.sling.models.impl:1.4.16]
    at org.apache.sling.api.servlets.SlingSafeMethodsServlet.mayService(SlingSafeMethodsServlet.java:266) [org.apache.sling.api:2.22.0]
    at org.apache.sling.api.servlets.SlingSafeMethodsServlet.service(SlingSafeMethodsServlet.java:342) [org.apache.sling.api:2.22.0]
    at org.apache.sling.api.servlets.SlingSafeMethodsServlet.service(SlingSafeMethodsServlet.java:374) [org.apache.sling.api:2.22.0]
    at org.apache.sling.engine.impl.request.RequestData.service(RequestData.java:570) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.filter.SlingComponentFilterChain.render(SlingComponentFilterChain.java:45) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:82) [org.apache.sling.engine:2.7.4]
    at com.day.cq.wcm.core.impl.WCMDeveloperModeFilter.doFilter(WCMDeveloperModeFilter.java:119) [com.day.cq.wcm.cq-wcm-core:5.12.164]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.day.cq.wcm.core.impl.WCMDebugFilter.doFilterWithErrorHandling(WCMDebugFilter.java:192) [com.day.cq.wcm.cq-wcm-core:5.12.164]
    at com.day.cq.wcm.core.impl.WCMDebugFilter.doFilter(WCMDebugFilter.java:159) [com.day.cq.wcm.cq-wcm-core:5.12.164]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:78) [org.apache.sling.engine:2.7.4]
    at com.day.cq.wcm.core.impl.WCMComponentFilter.doFilter(WCMComponentFilter.java:278) [com.day.cq.wcm.cq-wcm-core:5.12.164]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.day.cq.wcm.core.impl.page.PageLockFilter.doFilter(PageLockFilter.java:91) [com.day.cq.wcm.cq-wcm-core:5.12.164]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.day.cq.personalization.impl.TargetComponentFilter.doFilter(TargetComponentFilter.java:94) [com.day.cq.cq-personalization:5.12.44]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.adobe.granite.csrf.impl.CSRFFilter.doFilter(CSRFFilter.java:217) [com.adobe.granite.csrf:1.0.20.CQ650-B0002]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.SlingRequestProcessorImpl.processComponent(SlingRequestProcessorImpl.java:283) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.SlingRequestProcessorImpl.dispatchRequest(SlingRequestProcessorImpl.java:323) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.request.SlingRequestDispatcher.dispatch(SlingRequestDispatcher.java:211) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.request.SlingRequestDispatcher.include(SlingRequestDispatcher.java:104) [org.apache.sling.engine:2.7.4]
    at com.day.cq.wcm.core.impl.WCMComponentFilter$ForwardRequestDispatcher.include(WCMComponentFilter.java:516) [com.day.cq.wcm.cq-wcm-core:5.12.164]
    at org.apache.jsp.libs.cq.Page.model_json_jsp._jspService(model_json_jsp.java:118)
    at org.apache.sling.scripting.jsp.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) [org.apache.sling.scripting.jsp:2.3.6]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) [org.apache.felix.http.servlet-api:1.1.2]
    at org.apache.sling.scripting.jsp.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:502) [org.apache.sling.scripting.jsp:2.3.6]
    at org.apache.sling.scripting.jsp.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:449) [org.apache.sling.scripting.jsp:2.3.6]
    at org.apache.sling.scripting.jsp.JspScriptEngineFactory.callJsp(JspScriptEngineFactory.java:339) [org.apache.sling.scripting.jsp:2.3.6]
    at org.apache.sling.scripting.jsp.JspScriptEngineFactory.access$100(JspScriptEngineFactory.java:97) [org.apache.sling.scripting.jsp:2.3.6]
    at org.apache.sling.scripting.jsp.JspScriptEngineFactory$JspScriptEngine.eval(JspScriptEngineFactory.java:600) [org.apache.sling.scripting.jsp:2.3.6]
    at org.apache.sling.scripting.core.impl.DefaultSlingScript.call(DefaultSlingScript.java:388) [org.apache.sling.scripting.core:2.3.2]
    at org.apache.sling.scripting.core.impl.DefaultSlingScript.eval(DefaultSlingScript.java:184) [org.apache.sling.scripting.core:2.3.2]
    at org.apache.sling.scripting.core.impl.DefaultSlingScript.service(DefaultSlingScript.java:491) [org.apache.sling.scripting.core:2.3.2]
    at org.apache.sling.engine.impl.request.RequestData.service(RequestData.java:570) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.filter.SlingComponentFilterChain.render(SlingComponentFilterChain.java:45) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:82) [org.apache.sling.engine:2.7.4]
    at com.day.cq.wcm.core.impl.WCMDebugFilter.doFilter(WCMDebugFilter.java:156) [com.day.cq.wcm.cq-wcm-core:5.12.164]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.day.cq.wcm.core.impl.WCMComponentFilter.filterRootInclude(WCMComponentFilter.java:375) [com.day.cq.wcm.cq-wcm-core:5.12.164]
    at com.day.cq.wcm.core.impl.WCMComponentFilter.doFilter(WCMComponentFilter.java:190) [com.day.cq.wcm.cq-wcm-core:5.12.164]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.day.cq.wcm.core.impl.page.PageLockFilter.doFilter(PageLockFilter.java:91) [com.day.cq.wcm.cq-wcm-core:5.12.164]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.day.cq.personalization.impl.TargetComponentFilter.doFilter(TargetComponentFilter.java:94) [com.day.cq.cq-personalization:5.12.44]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.SlingRequestProcessorImpl.processComponent(SlingRequestProcessorImpl.java:283) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.filter.RequestSlingFilterChain.render(RequestSlingFilterChain.java:49) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:76) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:78) [org.apache.sling.engine:2.7.4]
    at com.day.cq.wcm.core.impl.warp.TimeWarpFilter.doFilter(TimeWarpFilter.java:109) [com.day.cq.wcm.cq-wcm-core:5.12.164]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.adobe.cq.social.ugcbase.security.impl.SaferSlingPostServlet.doFilter(SaferSlingPostServlet.java:114) [com.adobe.cq.social.cq-social-ugcbase-impl:2.5.2]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.day.cq.dam.core.impl.assetlinkshare.AdhocAssetShareAuthHandler.doFilter(AdhocAssetShareAuthHandler.java:434) [com.day.cq.dam.cq-dam-core:5.12.296]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:78) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:78) [org.apache.sling.engine:2.7.4]
    at com.day.cq.dam.core.impl.servlet.ActivityRecordHandler.doFilter(ActivityRecordHandler.java:141) [com.day.cq.dam.cq-dam-core:5.12.296]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.adobe.granite.rest.impl.servlet.ApiResourceFilter.doFilter(ApiResourceFilter.java:70) [com.adobe.granite.rest.api:1.1.16.CQ650-B0005]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.adobe.granite.requests.logging.impl.RequestLoggerImpl.doFilter(RequestLoggerImpl.java:134) [com.adobe.granite.requests.logging:1.0.20]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.adobe.granite.rest.assets.impl.AssetContentDispositionFilter.doFilter(AssetContentDispositionFilter.java:96) [com.adobe.granite.rest.assets:1.0.58]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.day.cq.wcm.core.impl.AuthoringUIModeServiceImpl.doFilter(AuthoringUIModeServiceImpl.java:372) [com.day.cq.wcm.cq-wcm-core:5.12.164]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.day.cq.wcm.mobile.core.impl.redirect.RedirectFilter.doFilter(RedirectFilter.java:248) [com.day.cq.wcm.cq-wcm-mobile-core:5.11.10]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.theclub.spa.react.core.filters.LoggingFilter.doFilter(LoggingFilter.java:58) [theclub-spa-react.core:1.0.0.SNAPSHOT]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.adobe.aem.guides.wknd.spa.react.core.filters.LoggingFilter.doFilter(LoggingFilter.java:58) [wknd-spa-react.core:1.0.3.SNAPSHOT]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.adobe.aem.guides.wknd.mobile.core.filters.LoggingFilter.doFilter(LoggingFilter.java:52) [com.adobe.aem.guides.wknd-mobile.core:1.0.0]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.adobe.livecycle.content.appcontext.impl.AppContextFilter.doFilter(AppContextFilter.java:69) [com.adobe.livecycle.content.core-bundle:6.0.40]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:78) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.debug.RequestProgressTrackerLogFilter.doFilter(RequestProgressTrackerLogFilter.java:110) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.adobe.livecycle.dsc.clientsdk.internal.ResourceResolverHolderFilter.doFilter(ResourceResolverHolderFilter.java:37) [com.adobe.livecycle.dsc.clientsdk:3.0.4]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.adobe.cq.social.commons.cors.CORSAuthenticationFilter.doFilter(CORSAuthenticationFilter.java:91) [com.adobe.cq.social.cq-social-commons:1.10.82]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.day.cq.wcm.foundation.forms.FormsHandlingServletHelper.handleFilter(FormsHandlingServletHelper.java:226) [com.day.cq.wcm.cq-wcm-foundation:5.12.38]
    at com.day.cq.wcm.foundation.forms.impl.FormsHandlingServlet.doFilter(FormsHandlingServlet.java:138) [com.day.cq.wcm.cq-wcm-foundation:5.12.38]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.adobe.granite.optout.impl.OptOutFilter.doFilter(OptOutFilter.java:76) [com.adobe.granite.optout:1.0.0]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.day.cq.wcm.foundation.forms.FormsHandlingServletHelper.handleFilter(FormsHandlingServletHelper.java:226) [com.day.cq.wcm.cq-wcm-foundation:5.12.38]
    at com.adobe.cq.wcm.core.components.internal.servlets.CoreFormHandlingServlet.doFilter(CoreFormHandlingServlet.java:123) [com.adobe.cq.core.wcm.components.core:2.17.9.SNAPSHOT]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.adobe.fd.core.security.internal.CurrentUserServiceImpl.doFilter(CurrentUserServiceImpl.java:114) [adobe-aemfd-core-security:3.0.72]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.day.cq.wcm.core.impl.WCMRequestFilter.doFilter(WCMRequestFilter.java:90) [com.day.cq.wcm.cq-wcm-core:5.12.164]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.adobe.cq.history.impl.HistoryRequestFilter.doFilter(HistoryRequestFilter.java:122) [com.adobe.cq.cq-history:5.10.6]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.rewriter.impl.RewriterFilter.doFilter(RewriterFilter.java:87) [org.apache.sling.rewriter:1.2.2]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.adobe.granite.httpcache.impl.InnerCacheFilter.doFilter(InnerCacheFilter.java:81) [com.adobe.granite.httpcache.core:1.0.8]
    at com.adobe.granite.httpcache.impl.InnerCacheFilter.doFilter(InnerCacheFilter.java:60) [com.adobe.granite.httpcache.core:1.0.8]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.i18n.impl.I18NFilter.doFilter(I18NFilter.java:131) [org.apache.sling.i18n:2.5.14]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at com.adobe.granite.csrf.impl.CSRFFilter.doFilter(CSRFFilter.java:217) [com.adobe.granite.csrf:1.0.20.CQ650-B0002]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.security.impl.ContentDispositionFilter.doFilter(ContentDispositionFilter.java:152) [org.apache.sling.security:1.1.16]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:78) [org.apache.sling.engine:2.7.4]
    at com.adobe.granite.resourceresolverhelper.impl.ResourceResolverHelperImpl.doFilter(ResourceResolverHelperImpl.java:83) [com.adobe.granite.resourceresolverhelper:1.0.4]
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:72) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.SlingRequestProcessorImpl.doProcessRequest(SlingRequestProcessorImpl.java:151) [org.apache.sling.engine:2.7.4]
    at org.apache.sling.engine.impl.SlingMainServlet.service(SlingMainServlet.java:250) [org.apache.sling.engine:2.7.4]
    at org.apache.felix.http.base.internal.handler.ServletHandler.handle(ServletHandler.java:123) [org.apache.felix.http.jetty:4.1.6]
    at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:86) [org.apache.felix.http.jetty:4.1.6]
    at com.adobe.granite.license.impl.LicenseCheckFilter.doFilter(LicenseCheckFilter.java:308) [com.adobe.granite.license:1.2.10]
    at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:142) [org.apache.felix.http.jetty:4.1.6]
    at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:81) [org.apache.felix.http.jetty:4.1.6]
    at org.apache.sling.i18n.impl.I18NFilter.doFilter(I18NFilter.java:131) [org.apache.sling.i18n:2.5.14]
    at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:142) [org.apache.felix.http.jetty:4.1.6]
    at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:81) [org.apache.felix.http.jetty:4.1.6]
    at org.apache.sling.featureflags.impl.FeatureManager.doFilter(FeatureManager.java:116) [org.apache.sling.featureflags:1.2.2]
    at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:142) [org.apache.felix.http.jetty:4.1.6]
    at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:81) [org.apache.felix.http.jetty:4.1.6]
    at org.apache.sling.engine.impl.log.RequestLoggerFilter.doFilter(RequestLoggerFilter.java:75) [org.apache.sling.engine:2.7.4]
    at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:142) [org.apache.felix.http.jetty:4.1.6]
    at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:81) [org.apache.felix.http.jetty:4.1.6]
    at org.apache.sling.engine.impl.parameters.RequestParameterSupportConfigurer.doFilter(RequestParameterSupportConfigurer.java:67) [org.apache.sling.engine:2.7.4]
    at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:142) [org.apache.felix.http.jetty:4.1.6]
    at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:81) [org.apache.felix.http.jetty:4.1.6]
    at org.apache.felix.http.base.internal.dispatch.Dispatcher$1.doFilter(Dispatcher.java:146) [org.apache.felix.http.jetty:4.1.6]
    at org.apache.felix.http.base.internal.whiteboard.WhiteboardManager$2.doFilter(WhiteboardManager.java:1002) [org.apache.felix.http.jetty:4.1.6]
    at com.adobe.granite.auth.oauth.impl.OAuthCallbackFilter.doFilter(OAuthCallbackFilter.java:69) [com.adobe.granite.auth.oauth:1.7.2]
    at org.apache.felix.http.base.internal.handler.PreprocessorHandler.handle(PreprocessorHandler.java:137) [org.apache.felix.http.jetty:4.1.6]
    at org.apache.felix.http.base.internal.whiteboard.WhiteboardManager$2.doFilter(WhiteboardManager.java:1008) [org.apache.felix.http.jetty:4.1.6]
    at org.apache.sling.security.impl.ReferrerFilter.doFilter(ReferrerFilter.java:326) [org.apache.sling.security:1.1.16]
    at org.apache.felix.http.base.internal.handler.PreprocessorHandler.handle(PreprocessorHandler.java:137) [org.apache.felix.http.jetty:4.1.6]
    at org.apache.felix.http.base.internal.whiteboard.WhiteboardManager$2.doFilter(WhiteboardManager.java:1008) [org.apache.felix.http.jetty:4.1.6]
    at org.apache.felix.http.sslfilter.internal.SslFilter.doFilter(SslFilter.java:97) [org.apache.felix.http.sslfilter:1.2.6]
    at org.apache.felix.http.base.internal.handler.PreprocessorHandler.handle(PreprocessorHandler.java:137) [org.apache.felix.http.jetty:4.1.6]
    at org.apache.felix.http.base.internal.whiteboard.WhiteboardManager$2.doFilter(WhiteboardManager.java:1008) [org.apache.felix.http.jetty:4.1.6]
    at org.apache.felix.http.base.internal.whiteboard.WhiteboardManager.invokePreprocessors(WhiteboardManager.java:1012) [org.apache.felix.http.jetty:4.1.6]
    at org.apache.felix.http.base.internal.dispatch.Dispatcher.dispatch(Dispatcher.java:91) [org.apache.felix.http.jetty:4.1.6]
    at org.apache.felix.http.base.internal.dispatch.DispatcherServlet.service(DispatcherServlet.java:49) [org.apache.felix.http.jetty:4.1.6]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) [org.apache.felix.http.servlet-api:1.1.2]
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:791) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:550) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1435) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1350) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:191) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.server.Server.handle(Server.java:516) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:388) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.server.HttpChannel$$Lambda$532/0x0000000000000000.dispatch(Unknown Source) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:633) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:380) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:279) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:383) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:882) [org.apache.felix.http.jetty:4.1.6]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1036) [org.apache.felix.http.jetty:4.1.6]
    at java.base/java.lang.Thread.run(Thread.java:836)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Not a JSON Object: 0 (through reference chain: com.theclub.spa.react.core.models.impl.CustomPageImpl[":children"]->java.util.LinkedHashMap["/content/theclub-spa-react/spa/en-mobile"]->com.theclub.spa.react.core.models.impl.CustomPageImpl[":items"]->java.util.LinkedHashMap["root"]->com.day.cq.wcm.foundation.model.responsivegrid.ResponsiveGrid[":items"]->java.util.LinkedHashMap["menu"]->com.day.cq.wcm.foundation.model.responsivegrid.ResponsiveColumn["exportedComponent"]->com.theclub.spa.react.core.models.impl.MenuImpl[":items"]->java.util.LinkedHashMap["tierbannerlist"]->com.theclub.spa.react.core.models.impl.TierBannerListImpl[":items"]->java.util.LinkedHashMap["tierbannerproductlis"]->com.theclub.spa.react.core.models.impl.TierBannerProductListImpl["categories"]->java.util.ArrayList[0]->com.adobe.cq.commerce.magento.graphql.CategoryTree["responseData"]->java.util.HashMap["products"]->com.adobe.cq.commerce.magento.graphql.CategoryProducts["responseData"]->java.util.HashMap["items"]->java.util.ArrayList[0]->com.adobe.cq.commerce.magento.graphql.VirtualProduct["responseData"]->java.util.HashMap["min_clubpoints"]->com.google.gson.JsonPrimitive["asJsonObject"])
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:397) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:356) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:316) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:763) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeOptionalFields(MapSerializer.java:786) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeWithoutTypeInfo(MapSerializer.java:677) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:637) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:33) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeOptionalFields(MapSerializer.java:786) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeWithoutTypeInfo(MapSerializer.java:677) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:637) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:33) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeOptionalFields(MapSerializer.java:786) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeWithoutTypeInfo(MapSerializer.java:677) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:637) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:33) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeOptionalFields(MapSerializer.java:786) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeWithoutTypeInfo(MapSerializer.java:677) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:637) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:33) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeOptionalFields(MapSerializer.java:786) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeWithoutTypeInfo(MapSerializer.java:677) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:637) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:33) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.impl.UnwrappingBeanSerializer.serialize(UnwrappingBeanSerializer.java:134) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.impl.UnwrappingBeanPropertyWriter.serializeAsField(UnwrappingBeanPropertyWriter.java:127) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeOptionalFields(MapSerializer.java:786) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeWithoutTypeInfo(MapSerializer.java:677) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:637) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:33) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeOptionalFields(MapSerializer.java:786) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeWithoutTypeInfo(MapSerializer.java:677) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:637) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:33) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeFields(MapSerializer.java:726) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeWithoutTypeInfo(MapSerializer.java:681) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:637) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:33) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:3058) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at org.apache.sling.models.jacksonexporter.impl.JacksonExporter.export(JacksonExporter.java:117) [org.apache.sling.models.jacksonexporter:1.0.8]
    ... 183 common frames omitted
Caused by: java.lang.IllegalStateException: Not a JSON Object: 0
    at com.google.gson.JsonElement.getAsJsonObject(JsonElement.java:91) [com.adobe.cq.gson:2.8.5]
    at jdk.internal.reflect.GeneratedMethodAccessor620.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:689) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) [com.fasterxml.jackson.core.jackson-databind:2.11.3]
    ... 256 common frames omitted
smallcar88 commented 3 years ago

@mhaack any ideas?

mhaack commented 3 years ago

During the development, we have to extend the CIF component FeaturedCategoryList and modify the GraphQL query to retrieve the products from the selected category.

Do I understand your extension sample correct, you what the category to return all products with the attributes you specify. For that I suggest to build your own retriever. The FeaturedCategoryList is build to query multiple categories with focus on category.

But the code from your example still looks ok to me. Can you enable query log (via debug logger for CIF GraphQL client) and posts the executed query.

Does the query work if used in a GraphQL tool? Can you share a sample GraphQL result?

smallcar88 commented 3 years ago

During the development, we have to extend the CIF component FeaturedCategoryList and modify the GraphQL query to retrieve the products from the selected category.

Do I understand your extension sample correct, you what the category to return all products with the attributes you specify. For that I suggest to build your own retriever. The FeaturedCategoryList is build to query multiple categories with focus on category.

But the code from your example still looks ok to me. Can you enable query log (via debug logger for CIF GraphQL client) and posts the executed query.

Does the query work if used in a GraphQL tool? Can you share a sample GraphQL result?

That is correct. We want to customize a component that when the user selects a category from Magento, it will load 10 latest products through GraphQL. We have a local forward proxy (built by npm package local-cors-proxy) to print out the underlying GraphQL query during page loads. Then we test the query through GraphiQL tool and it executed successfully with an expected result.

Query

{
  categoryList(filters: {category_uid: {in: ["NTY3"]}}) {
    uid
    name
    url_key
    url_path
    position
    image
    products {
      items {
        __typename
        name
        sku
        image {
          url
        }

        min_club_point_custom_: min_club_point
        price_range {
          minimum_price {
            discount {
              amount_off
              percent_off
            }
            final_price {
              value
              currency
            }
            regular_price {
              value
              currency
            }
          }
          maximum_price {
            discount {
              amount_off
              percent_off
            }
            final_price {
              value
              currency
            }
            regular_price {
              value
              currency
            }
          }
        }
      }
    }
  }
}

Response from GraphiQL

{
  "data": {
    "categoryList": [
      {
        "uid": "NTY3",
        "name": "1 - 200 ClubPoint",
        "url_key": "1-200-clubpoints",
        "url_path": "rewards/1-200-clubpoints",
        "position": 1,
        "image": null,
        "products": {
          "items": [
            {
              "__typename": "VirtualProduct",
              "name": "Gemini Body Measure Weight",
              "sku": "CR-52085",
              "image": {
                "url": "https://shopping-t0.theclub.com.hk/media/catalog/product/cache/325fd8d4f7eaef1af70e0a1582ef0e80/g/w/gws2vrere.jpg"
              },
              "min_club_point_custom_": 100,  // this is `Float` datatype, but throw an exception when parsing this value
              "price_range": {
                "minimum_price": {
                  "discount": {
                    "amount_off": 0,
                    "percent_off": 0
                  },
                  "final_price": {
                    "value": 180,
                    "currency": "HKD"
                  },
                  "regular_price": {
                    "value": 180,
                    "currency": "HKD"
                  }
                },
                "maximum_price": {
                  "discount": {
                    "amount_off": 0,
                    "percent_off": 0
                  },
                  "final_price": {
                    "value": 180,
                    "currency": "HKD"
                  },
                  "regular_price": {
                    "value": 180,
                    "currency": "HKD"
                  }
                }
              }
            }
          ]
        }
      }
    ]
  }
}
buuhuu commented 2 years ago

tldr; do not try to return objects from the GQL client by any public method that is part of a components JSON schema (served by Apache Sling Models Exporter using Jackson). The object tree may contain Google GSON specific instances that Jackson cannot serialise (as is).

If I read the stacktrace correct this is not related to the parsing of the GQL response but actually exposing the pages as model by the Sling Model Exporter to a SPA:

07.09.2021 09:43:25.758 *ERROR* [127.0.0.1 [1630979004078] GET /content/theclub-spa-react/spa.model.json HTTP/1.1] org.apache.sling.models.impl.ExportServlet.com.theclub.spa.react.core.models.impl.CustomPageImpl Could not perform export with jackson requested by model.

From the trace it seems that you added methods to your component interface that return the objects from the GQL client, which are then picked up by jackson when exporting for the .model.json request.

com.theclub.spa.react.core.models.impl.CustomPageImpl[":children"]
  ->java.util.LinkedHashMap["/content/theclub-spa-react/spa/en-mobile"]
  [...]
  ->com.theclub.spa.react.core.models.impl.TierBannerProductListImpl["categories"]
  ->java.util.ArrayList[0]
  ->com.adobe.cq.commerce.magento.graphql.CategoryTree["responseData"]
  [...]   
  ->java.util.HashMap["min_clubpoints"]
  ->com.google.gson.JsonPrimitive["asJsonObject"])

You see that Jackson tries to serialise an instance of JsonPrimitve. As jackson-databind is considering all bean-like named public methods it calls each of them on the instance including getAsJsonObject(). But as a JsonPrimitive is not a JsonObject, it fails with the exception you are seeing.

Please let us know if that helps to resolve your issue.

smallcar88 commented 2 years ago

@Buuhuu Thank you for your response. If I understand your answer correctly, do you mean that we shouldn't let the Jackson model exporter to handle the serialization of the GraphQL response object as it may have unpredictable parsing result?

We end up implementing to reconstruct an array of simple data structure to pass to the Jackson Model Exporter and it worked and our purpose is served for now. Thank you for clarifying the issue again. Cheers.

buuhuu commented 2 years ago

Yes exactly.

This is one approach. Another would have been to use a custom Jackson serialiser for the field that returns the GQL response object and make it use GSON to serialise the object instead. This would have been a little less boilerplate I assume but either way is fine.

Closing as resolved.