How do I set custom converters for my entities?

I have a complex Entity which is defined like so

@Getter
@Setter
@Node
public abstract class StepNode {
 @Id
 @GeneratedValue
 private Long id;

@Relationship
private StepNode parent;

@Relationship
private StepNode child;
 // ... extra properties omitted for brevity 
}

This Node has a few subclasses which add extra properties with varying levels of inheritance.

For example

public class DecisionNode extends StepNode {
  // extra properties here
}
public class MultiChoiceOption extends DecisionNode {
 // extra properties here
}

I am able to save the nodes (I tested by created a decision node and a couple multichoice nodes). However, when I try to query the data or any node that has a reference to the main StepNode class in anyway, I get the error below

 Resolved [org.springframework.data.mapping.MappingException: Error mapping Record<{__sn__: node<310>, __sr__: [relationship<64>, relationship<59>, relationship<58>, relationship<70>, relationship<62>, relationship<63>, relationship<60>, relationship<61>], __srn__: [node<301>, node<302>, node<303>, node<304>, node<308>, node<314>, node<315>, node<316>]}>]

For the other entities that have the StepNode as property (thereby establishing a relationship between them) I can override the findAll query that comes with spring data and just have it return the entity itself without relationships, however, at some point I need to be able to retrieve the full data. I tried setting up a @ReadingConverter but that does not seem to work.

PS: Before the error mapping, I do get this message in my console

 Don't know how to translate exception of type class org.springframework.data.mapping.MappingException

The converter that I created (with the help of chatgpt 4o); this is not the final implementation, I just want to get something that will help me retrieve the data then I complete the implementation.

@ReadingConverter
@Component
public class StepNodeReadingConverter implements Converter<Node, StepNode> {

    @Override
    public StepNode convert(Node source) {
        StepNode stepNode = null;
        NodeType type = NodeType.fromString(source.get("type").asString());

        if (type == null) return null;

        switch (type) {
            case DECISION:
                InputType inputType = InputType.fromString(source.get("inputType").asString());
                if (inputType == null) return null;
                if(inputType == InputType.MULTIPLE_CHOICE) {
                    stepNode = new MultipleChoiceOption();
                } else if (inputType == InputType.DATE) {
                    stepNode = new DateOption();
                } else {
                    stepNode = new DecisionNode();
                }
                break;
            case CHANCE:
                stepNode = new ChanceNode();
                break;
            case TERMINAL:
                stepNode = new TerminalNode();
                break;
            default:
                throw new IllegalArgumentException("Unknown type: " + type);
        }

        stepNode.setStepNodeId(UUID.fromString(source.get("stepNodeId").asString()));
        stepNode.setPreamble(source.get("preamble").asString());
        stepNode.setTitle(source.get("title").asString());
        stepNode.setType(type);
        stepNode.setMedia(source.get("media").asString());

        if (stepNode instanceof DecisionNode decisionNode) {
            InputType inputType = InputType.fromString(source.get("inputType").asString());
            decisionNode.setInputType(inputType);
            decisionNode.setSalesAndMarketingDecision(source.get("isSalesAndMarketingDecision").asBoolean());
            List<StepNode> decisionOptions = new ArrayList<>();
            for (Node decisionOptionValue : source.get("decisionOptions").asList(Value::asNode)) {
                decisionOptions.add(convert(decisionOptionValue));
            }
            decisionNode.setDecisionOptions(decisionOptions);
        }

        if (stepNode instanceof MultipleChoiceOption multipleChoiceOption) {
            // Assuming pointCost is another entity, handle its conversion here
            multipleChoiceOption.setChoiceName(source.get("choiceName").asString());
            multipleChoiceOption.setPointCost((PointCost) source.get("pointCost").asObject());
        }

        if (stepNode instanceof DateOption dateOption) {
            dateOption.setActivityDaysCount(source.get("activityDaysCount").asInt());
            // Assuming pointCost is another entity, handle its conversion here
            dateOption.setEarlyPointCost((PointCost) source.get("earlyPointCost").asObject());
            dateOption.setLatePointCost((PointCost) source.get("latePointCost").asObject());
            dateOption.setOnTimePointCost((PointCost) source.get("onTimePointCost").asObject());
        }

        if (stepNode instanceof ChanceNode chanceNode) {
            chanceNode.setHappens((OutcomeDieOption) source.get("happens").asObject());
            chanceNode.setNotHappen((OutcomeDieOption) source.get("notHappen").asObject());
        }

        if (stepNode instanceof TerminalNode terminalNode) {
            terminalNode.setSalesScore(source.get("salesScore").asInt());
            terminalNode.setMarketingScore(source.get("marketingScore").asInt());
        }

        return stepNode;
    }

}

I also registered the converter in my Neo4jConfig class, sample below

@org.springframework.context.annotation.Configuration
@EnableNeo4jRepositories(basePackages = "<base_package>")
public class Neo4jConfig {

    @Bean
    Configuration cypherDslConfiguration() {
        return Configuration.newConfig().withDialect(Dialect.NEO4J_5).build();
    }

    @Bean
    public Neo4jConversions neo4jConversions() {
        return new Neo4jConversions(List.of(
                new StepNodeReadingConverter()
        ));
    }
}

Any assistance is appreciated

How do you load the nodes? Usually the error has a root cause in the stack that indicates what exactly fails.

A converter has nothing to do with the "conversion" of graph nodes and relationships into objects. It is used of you have e.g. embedded objects or types (String vs. numbers) that are saved in Neo4j other than you have it defined in your object model.

If you want to retrieve a subset of the data it should be done by using projections (Projections :: Spring Data Neo4j).

Just a side note: If you are already defining the Neo4j 5 dialect for CypherDSL, you could also use a String id type instead of the long to benefit from the elementId support.

How do you load the nodes?

Hi @gerrit.meier, at the moment, I am using the findAll method from Neo4jRepository. I am attempting to store a decision tree for another entity and then retrieve that tree as well (which is why I have the different types of node :sweat_smile: :sweat_smile: )

A converter has nothing to do with the "conversion" of graph nodes and relationships into objects. It is used of you have e.g. embedded objects or types (String vs. numbers) that are saved in Neo4j other than you have it defined in your object model.

Thanks for the explanation

If you want to retrieve a subset of the data it should be done by using projections

Thanks for the tip

Just a side note: If you are already defining the Neo4j 5 dialect for CypherDSL, you could also use a String id type instead of the long to benefit from the elementId support.

I wasn't sure how the id would be generated with the string, which is why I used the Long :sweat_smile:

For my actual entity, I am using a UUID, how does that compare to using a String?

Another thing I just noticed, I get the issue with the findById query as well. I'm guessing this is because it tries to pull in the related entities as well.

I run into the issue trying to query for an entity that has a relationship that leads to the problematic entity.

Let's assume the chain goes like Game -> Round -> Template -> Product -> Node. So when I try to do a findGameById, it fails with the same error.

Please post the full stacktrace. There has to be a root cause for the mapping that gives me more information besides the: MappingException: Error mapping Record

Hi @gerrit.meier, please find the query and model definition and full stack trace below. Like I mentioned earlier, the error can also occur when I try to use the findById or findAll query from the Neo4jRepository.

@Query("MATCH (t:Template {templateId: $templateId})-[:PRODUCTS_FOR]->(p:Product)-[a]-(b) RETURN p, a, b")
List<Product> findByTemplateId(UUID templateId);
@Node("Product")
@Getter
@Setter
public class Product {

    @Id
    @GeneratedValue
    private UUID id;

    private String name;

    private String productionCapacityUnit;

    private BigDecimal expectedProductionTarget;

    @Relationship(value = "ROOT_NODE")
//    @JsonSerialize(using = StepNodeSerializer.class)
    private StepNode rootNode;
}

stack trace
[A236660A8B20F46C50FCD6D95C5744F7] Exception: Error mapping Record<{p: node<329>, a: relationship<78>, b: node<330>}>, [org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.read(DefaultNeo4jEntityConverter.java:123), org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.read(DefaultNeo4jEntityConverter.java:71), org.springframework.data.neo4j.core.mapping.Schema.lambda$getRequiredMappingFunctionFor$0(Schema.java:96), org.springframework.data.neo4j.core.PreparedQuery$AggregatingMappingFunction.apply(PreparedQuery.java:246), org.springframework.data.neo4j.core.PreparedQuery$AggregatingMappingFunction.apply(PreparedQuery.java:158), org.springframework.data.neo4j.core.DefaultNeo4jClient$DefaultRecordFetchSpec.lambda$partialMappingFunction$0(DefaultNeo4jClient.java:490), java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197), java.base/java.util.Iterator.forEachRemaining(Iterator.java:133), java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845), java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509), java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499), java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921), java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234), java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682), org.springframework.data.neo4j.core.DefaultNeo4jClient$DefaultRecordFetchSpec.all(DefaultNeo4jClient.java:475), java.base/java.util.Optional.map(Optional.java:260), org.springframework.data.neo4j.core.Neo4jTemplate$DefaultExecutableQuery.lambda$getResults$1(Neo4jTemplate.java:1212), org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140), org.springframework.data.neo4j.core.Neo4jTemplate$DefaultExecutableQuery.getResults(Neo4jTemplate.java:1211), org.springframework.data.neo4j.repository.query.Neo4jQueryExecution$DefaultQueryExecution.execute(Neo4jQueryExecution.java:51), org.springframework.data.neo4j.repository.query.AbstractNeo4jQuery.execute(AbstractNeo4jQuery.java:93), org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170), org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158), org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:164), org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143), org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184), org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:70), org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184), org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123), org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:392), org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119), org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184), org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137), org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184), org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97), org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184), org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223), jdk.proxy3/jdk.proxy3.$Proxy133.findByTemplateId(Unknown Source), com.lucidarray.d_and_c.game_engine.services.game.ProductService.findProductsForTemplate(ProductService.java:27), com.lucidarray.d_and_c.game_engine.controllers.game.TemplateController.getProductsForTemplate(TemplateController.java:346), java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method), java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77), java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43), java.base/java.lang.reflect.Method.invoke(Method.java:568), org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354), org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196), org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163), org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768), org.springframework.security.authorization.method.AuthorizationManagerBeforeMethodInterceptor.invoke(AuthorizationManagerBeforeMethodInterceptor.java:198), org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184), org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768), org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720), com.lucidarray.d_and_c.game_engine.controllers.game.TemplateController$$SpringCGLIB$$0.getProductsForTemplate(<generated>), java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method), java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77), java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43), java.base/java.lang.reflect.Method.invoke(Method.java:568), org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255), org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188), org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118), org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926), org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831), org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87), org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089), org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979), org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014), org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903), jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564), org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885), jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658), org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:206), org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150), org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51), org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175), org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150), org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108), org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231), org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:479), org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:340), org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:82), org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:128), org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:100), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227), org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126), org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227), org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227), org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227), org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227), org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), org.springframework.security.oauth2.server.resource.web.authentication.BearerTokenAuthenticationFilter.doFilterInternal(BearerTokenAuthenticationFilter.java:145), org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227), org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107), org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227), org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91), org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227), org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82), org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227), org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62), org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227), org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42), org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:323), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:224), org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233), org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191), org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113), org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$3(HandlerMappingIntrospector.java:195), org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113), org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74), org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:230), org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352), org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268), org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175), org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150), org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100), org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116), org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175), org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150), org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93), org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116), org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175), org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150), org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:109), org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116), org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175), org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150), org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201), org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116), org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175), org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150), org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167), org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90), org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482), org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115), org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93), org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74), org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344), org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391), org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63), org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896), org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736), org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52), org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191), org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659), org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63), java.base/java.lang.Thread.run(Thread.java:840)]

I was going to add this under my previous comment by I hit a character limit.

This is another stacktrace i got from my exception handler. I just log the stacktrace. If there's a way to get a clearer error message, please let me know so I can provide better information

Thank you

another stack trace
Exception: Error mapping Record<{__sn__: node<301>, __sr__: [relationship<77>, relationship<78>], __srn__: [node<329>, node<330>]}>, 
[org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.read(DefaultNeo4jEntityConverter.java:123), 
org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.read(DefaultNeo4jEntityConverter.java:71), 
org.springframework.data.neo4j.core.mapping.Schema.lambda$getRequiredMappingFunctionFor$0(Schema.java:96), 
org.springframework.data.neo4j.core.PreparedQuery$AggregatingMappingFunction.apply(PreparedQuery.java:246),
org.springframework.data.neo4j.core.PreparedQuery$AggregatingMappingFunction.apply(PreparedQuery.java:158), 
org.springframework.data.neo4j.core.DefaultNeo4jClient$DefaultRecordFetchSpec.one(DefaultNeo4jClient.java:444), 
java.base/java.util.Optional.flatMap(Optional.java:289), 
org.springframework.data.neo4j.core.Neo4jTemplate$DefaultExecutableQuery.lambda$getSingleResult$3(Neo4jTemplate.java:1224), 
org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140), 
org.springframework.data.neo4j.core.Neo4jTemplate$DefaultExecutableQuery.getSingleResult(Neo4jTemplate.java:1222), 
org.springframework.data.neo4j.core.Neo4jTemplate.lambda$findById$12(Neo4jTemplate.java:346), 
org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140), 
org.springframework.data.neo4j.core.Neo4jTemplate.findById(Neo4jTemplate.java:340), 
org.springframework.data.neo4j.repository.support.SimpleNeo4jRepository.findById(SimpleNeo4jRepository.java:71), 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method), 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77), 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43), 
java.base/java.lang.reflect.Method.invoke(Method.java:568), 
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354), 
org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277), 
org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170), 
org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158), 
org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516), 
org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285), 
org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628), 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184), 
org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:168), 
org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143), 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184), 
org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:70), 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184), 
org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123), 
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:392), 
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119), 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184), 
org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137), 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184), 
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97), 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184), 
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223), 
jdk.proxy3/jdk.proxy3.$Proxy131.findById(Unknown Source), 
com.lucidarray.d_and_c.game_engine.services.game.TemplateService.findById(TemplateService.java:46), 
com.lucidarray.d_and_c.game_engine.utils.ValidationUtils.existsById(ValidationUtils.java:15), 
com.lucidarray.d_and_c.game_engine.controllers.game.TemplateController.addProductToTemplate(TemplateController.java:312), 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method), 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77), 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43), 
java.base/java.lang.reflect.Method.invoke(Method.java:568), 
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354), 
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196), 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163), 
org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768), 
org.springframework.security.authorization.method.AuthorizationManagerBeforeMethodInterceptor.invoke(AuthorizationManagerBeforeMethodInterceptor.java:198), 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184), 
org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768), 
org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720), 
com.lucidarray.d_and_c.game_engine.controllers.game.TemplateController$$SpringCGLIB$$0.addProductToTemplate(<generated>), 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method), 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77), 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43), 
java.base/java.lang.reflect.Method.invoke(Method.java:568), 
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255), 
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188), 
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118), 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926), 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831), 
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87), 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089), 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979), 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014), 
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914), 
jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590), 
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885), 
jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658), 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:206), 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150), 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51), 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175), 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150), 
org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108), 
org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231), 
org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:479), 
org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:340), 
org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:82), 
org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:128), 
org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:100), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227), 
org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), 
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126), 
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227), 
org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), 
org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227), 
org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), 
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227), 
org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137),
org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227), 
org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), 
org.springframework.security.oauth2.server.resource.web.authentication.BearerTokenAuthenticationFilter.doFilterInternal(BearerTokenAuthenticationFilter.java:145), 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116), org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227), 
org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), 
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107), 
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227), 
org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), 
org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91), 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227), 
org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), 
org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82), 
org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227), 
org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), 
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62), 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227), 
org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), 
org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42), org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240), 
org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:323), 
org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:224), 
org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137), 
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233), 
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191), 
org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113), 
org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$3(HandlerMappingIntrospector.java:195), 
org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113), 
org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74), 
org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:230), 
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352), 
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268), 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175), 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150), 
org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100), 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116), 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175), 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150), 
org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93), 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116),
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175), 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150), 
org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:109), 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116), 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175), 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150), 
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201), 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116), 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175), 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150), 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167), 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90), 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482), 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115), 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93), 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74), 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344), 
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391), 
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63), 
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896), 
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736), 
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52), 
org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191), 
org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659), 
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63), 
java.base/java.lang.Thread.run(Thread.java:840)]