spring-data-neo4j: random mapping record error
Hi, I am also facing an error in which a record could not be mapped. The tricky part is that this error is intermittent after upgrading SDN to 6.3.1(spring boot 2.7.1), sometime happens sometimes not, it is working well with SDN 6.2.4(spring boot 2.6.7)
controller (full page is here)
@RequestMapping
public void Image(){
ReactionLikeEvent rle = getReactionLikeEvent(identifier);
}
private ReactionLikeEvent getReactionLikeEvent(String id) {
ReactionLikeEvent rle;
try {
rle = databaseObjectService.findById(id);
} catch (ClassCastException e) {
throw new DiagramExporterException(String.format("The identifier '%s' does not correspond to a 'ReactionLikeEvent'", id));
}
if (rle == null) throw new NotFoundException(String.format("Identifier '%s' not found", id));
return rle;
}
service(full page is here)
@Service
public class DatabaseObjectService {
private final DatabaseObjectRepository databaseObjectRepository;
public DatabaseObjectService(DatabaseObjectRepository databaseObjectRepository) {
this.databaseObjectRepository = databaseObjectRepository;
}
public <T extends DatabaseObject> T findById(Object identifier) {
T rtn = null;
String id = DatabaseObjectUtils.getIdentifier(identifier);
if (DatabaseObjectUtils.isStId(id)) {
rtn = databaseObjectRepository.findByStId(id);
} else if (DatabaseObjectUtils.isDbId(id)) {
rtn = databaseObjectRepository.findByDbId(Long.parseLong(id));
}
if (rtn != null) rtn.isLoaded = true;
return rtn;
}
}
repository(full page is here)
@Repository
public class DatabaseObjectRepository {
private final Neo4jTemplate neo4jTemplate;
private final Neo4jClient neo4jClient;
@Value("${spring.data.neo4j.database:graph.db}")
private String databaseName;
@Autowired
public DatabaseObjectRepository(Neo4jTemplate neo4jTemplate, Neo4jClient neo4jClient) {
this.neo4jTemplate = neo4jTemplate;
this.neo4jClient = neo4jClient;
}
public <T extends DatabaseObject> T findByStId(String stId) {
String query = "MATCH (a:DatabaseObject{stId:$stId})-[r]-(m) RETURN a, COLLECT(r), COLLECT(m)";
return (T) neo4jTemplate.findOne(query, Map.of("stId", stId), DatabaseObject.class).orElse(null);
}
}
data model: ReactioneLikeEvent class.
error message is, it is not easy to produce the error as it happens randomly.
org.springframework.data.mapping.MappingException: Error mapping Record<{a: node<1630761>, COLLECT(r): [relationship<6837398>, relationship<6837397>, relationship<6837396>, relationship<6837395>, relationship<6837392>, relationship<6837391>, relationship<6837390>, relationship<6837389>, relationship<6837388>, relationship<6837387>, relationship<6837386>, relationship<6837385>, relationship<6837384>, relationship<6837383>, relationship<6837382>, relationship<6837381>, relationship<6837380>, relationship<6837379>, relationship<6837378>], COLLECT(m): [node<1630669>, node<1629976>, node<1630748>, node<1630762>, node<8>, node<1629971>, node<789490>, node<1629968>, node<1630684>, node<1629858>, node<789284>, node<135593>, node<245>, node<1630748>, node<789282>, node<1630741>, node<1630738>, node<167296>, node<1630743>]}>
at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.read(DefaultNeo4jEntityConverter.java:122)
at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.read(DefaultNeo4jEntityConverter.java:71)
at org.springframework.data.neo4j.core.mapping.Schema.lambda$getRequiredMappingFunctionFor$0(Schema.java:96)
at org.springframework.data.neo4j.core.PreparedQuery$AggregatingMappingFunction.apply(PreparedQuery.java:246)
at org.springframework.data.neo4j.core.PreparedQuery$AggregatingMappingFunction.apply(PreparedQuery.java:158)
at org.springframework.data.neo4j.core.DelegatingMappingFunctionWithNullCheck.apply(DelegatingMappingFunctionWithNullCheck.java:45)
at org.springframework.data.neo4j.core.DelegatingMappingFunctionWithNullCheck.apply(DelegatingMappingFunctionWithNullCheck.java:35)
at org.springframework.data.neo4j.core.DefaultNeo4jClient$DefaultRecordFetchSpec.one(DefaultNeo4jClient.java:455)
at java.base/java.util.Optional.flatMap(Optional.java:294)
at org.springframework.data.neo4j.core.Neo4jTemplate$DefaultExecutableQuery.getSingleResult(Neo4jTemplate.java:1030)
at org.springframework.data.neo4j.core.Neo4jTemplate.findOne(Neo4jTemplate.java:246)
at org.reactome.server.graph.repository.DatabaseObjectRepository.findByStId(DatabaseObjectRepository.java:36)
at org.reactome.server.graph.repository.DatabaseObjectRepository$$FastClassBySpringCGLIB$$64a0d279.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708)
at org.reactome.server.graph.repository.DatabaseObjectRepository$$EnhancerBySpringCGLIB$$c29edc64.findByStId(<generated>)
at org.reactome.server.graph.service.DatabaseObjectService.findById_aroundBody0(DatabaseObjectService.java:32)
at org.reactome.server.graph.service.DatabaseObjectService.findById_aroundBody1$advice(DatabaseObjectService.java:33)
at org.reactome.server.graph.service.DatabaseObjectService.findById(DatabaseObjectService.java:1)
at org.reactome.server.service.controller.exporter.ImageExporterController.getReactionLikeEvent(ImageExporterController.java:262)
at org.reactome.server.service.controller.exporter.ImageExporterController.reactionImage(ImageExporterController.java:221)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:655)
at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167)
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134)
at org.reactome.server.service.utils.CustomRequestFilter.doFilterInternal(CustomRequestFilter.java:34)
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134)
at org.reactome.server.service.utils.CustomRequestFilter.doFilterInternal(CustomRequestFilter.java:34)
at org.springframework.test.web.servlet.setup.PatternMappingFilterProxy.doFilter(PatternMappingFilterProxy.java:100)
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134)
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134)
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134)
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134)
at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:199)
at org.reactome.server.service.utils.BaseTest.mockMvcGetResult(BaseTest.java:69)
at org.reactome.server.service.controller.exporter.ImageExporterControllerTest.reactionImage(ImageExporterControllerTest.java:38)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
Caused by: org.springframework.data.mapping.model.MappingInstantiationException: Failed to instantiate org.reactome.server.graph.domain.model.ReactionLikeEvent using constructor public org.reactome.server.graph.domain.model.ReactionLikeEvent() with arguments
at org.springframework.data.mapping.model.ClassGeneratingEntityInstantiator$MappingInstantiationExceptionEntityInstantiator.createInstance(ClassGeneratingEntityInstantiator.java:358)
at org.springframework.data.mapping.model.ClassGeneratingEntityInstantiator.createInstance(ClassGeneratingEntityInstantiator.java:102)
at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.instantiate(DefaultNeo4jEntityConverter.java:462)
at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.lambda$map$2(DefaultNeo4jEntityConverter.java:286)
at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.map(DefaultNeo4jEntityConverter.java:305)
at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.map(DefaultNeo4jEntityConverter.java:259)
at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.read(DefaultNeo4jEntityConverter.java:120)
... 134 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.reactome.server.graph.domain.model.ReactionLikeEvent]: Class is abstract
... 141 common frames omitted
References:
our service Github repo: https://github.com/reactome/content-service
graph core Github repo: https://github.com/reactome/graph-core/
it would be great if you have any ideas about it and thank you so much for your help.
About this issue
- Original URL
- State: closed
- Created 2 years ago
- Reactions: 1
- Comments: 17
Sorry, I have to correct me: Was just looking at the head of 6.2.x and not 6.2.4 in special. You are right. The determination there is quite different and our goal was to improve it and not make it worse (of course). I will try create a simpler reproducer from the given domain class constellation and hope I will get some insights what might be the problem.