Spring Boot SDN 6读取Neo4j数据时ConverterNotFoundException问题求助
Spring Boot SDN 6读取Neo4j数据时ConverterNotFoundException问题求助
大家好,我在使用**Spring Data Neo4j 6(SDN 6)**开发时遇到了一个转换器相关的问题,想请各位帮忙看看:
我已经自定义了FollowRelationshipConverter转换器,并通过Neo4jConversions完成了注册。目前写入Neo4j数据时,FollowRelationship转Value的逻辑工作完全正常,但从Neo4j读取数据时,却抛出了ConverterNotFoundException,提示找不到从org.neo4j.driver.internal.value.MapValue到com.helpingduck.userservice.model.neo4j.FollowRelationship的转换器。
我的自定义转换器代码:
package com.helpingduck.userservice.config.neo4j; import com.fasterxml.jackson.databind.ObjectMapper; import com.helpingduck.userservice.model.neo4j.FollowRelationship; import java.util.HashSet; import java.util.Map; import java.util.Set; import lombok.RequiredArgsConstructor; import org.neo4j.driver.Value; import org.neo4j.driver.Values; import org.neo4j.driver.internal.value.MapValue; import org.neo4j.driver.internal.value.ValueAdapter; import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.converter.GenericConverter; import org.springframework.stereotype.Component; @Component @RequiredArgsConstructor public class FollowRelationshipConverter implements GenericConverter { private final ObjectMapper objectMapper; @Override public Set<ConvertiblePair> getConvertibleTypes() { Set<ConvertiblePair> convertiblePairs = new HashSet<>(); convertiblePairs.add(new ConvertiblePair(MapValue.class, FollowRelationship.class)); convertiblePairs.add(new ConvertiblePair(FollowRelationship.class, Value.class)); return convertiblePairs; } @Override public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { if (FollowRelationship.class.isAssignableFrom(sourceType.getType())) { // 转换为Neo4j Driver Value return convertToNeo4jValue(source); } else { // 转换为自定义FollowRelationship类型 return convertToMyCustomType(source); } } private FollowRelationship convertToMyCustomType(Object source) { MapValue value = (MapValue) source; Map<String, Object> map = value.asMap(); return objectMapper.convertValue(map, FollowRelationship.class); } private Value convertToNeo4jValue(Object source) { FollowRelationship followRelationship = (FollowRelationship) source; return Values.value(objectMapper.convertValue(followRelationship, Map.class)); } }
关系实体类代码:
@SuperBuilder(toBuilder = true) @AllArgsConstructor @NoArgsConstructor @Getter @Setter public class BaseRelationship { private String elementId; private String type; } @Getter @Setter @AllArgsConstructor @NoArgsConstructor @SuperBuilder(toBuilder = true) public class FollowRelationship extends BaseRelationship { private String details; }
数据操作的查询方法:
@Query( "MATCH (follower:User {user_ref: $followerUserRef}) MATCH (following:User {user_ref:" + " $followingUserRef}) MERGE (follower)-[r:FOLLOWS]->(following) set r +=" + " $followRelationship RETURN apoc.map.merge({elementId: elementId(r), type:" + " type(r)},properties(r)) as result") Optional<FollowRelationship> follow( @Param("followerUserRef") String followerUserRef, @Param("followingUserRef") String followingUserRef, @Param("followRelationship") FollowRelationship followRelationship);
问题详情:
- 写入逻辑正常:
FollowRelationship转Value的转换没有任何问题,数据能正确写入Neo4j - 读取逻辑失败:查询返回结果转换为
FollowRelationship时抛出异常,完整错误堆栈如下:
Request processing failed; nested exception is org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [org.neo4j.driver.internal.value.MapValue] to type [com.helpingduck.userservice.model.neo4j.FollowRelationship] with root cause org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [org.neo4j.driver.internal.value.MapValue] to type [com.helpingduck.userservice.model.neo4j.FollowRelationship] at org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:322) ~[spring-core-5.3.28.jar:5.3.28] at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:195) ~[spring-core-5.3.28.jar:5.3.28] at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:175) ~[spring-core-5.3.28.jar:5.3.28] at org.springframework.data.neo4j.core.SingleValueMappingFunction.apply(SingleValueMappingFunction.java:61) ~[spring-data-neo4j-6.3.13.jar:6.3.13] at org.springframework.data.neo4j.core.SingleValueMappingFunction.apply(SingleValueMappingFunction.java:34) ~[spring-data-neo4j-6.3.13.jar:6.3.13] at org.springframework.data.neo4j.core.DefaultNeo4jClient$DefaultRecordFetchSpec.one(DefaultNeo4jClient.java:456) ~[spring-data-neo4j-6.3.13.jar:6.3.13] at java.base/java.util.Optional.flatMap(Optional.java:294) ~[na:na]
有没有大佬能帮我分析下为什么读取时转换器不生效?谢谢大家!
备注:内容来源于stack exchange,提问作者kishan
相关产品推荐
相关产品推荐

