我已经通过Neo4jConversions创建了转换器和寄存器,但问题是写转换器工作正常,但从neo4j阅读时抛出错误,即未找到转换器
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())) {
// convert to Neo4j Driver Value
return convertToNeo4jValue(source);
} else {
// convert to MyCustomType
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.class到Value.Class的转换工作正常
从MapValue.Class到FollowRelationship.class的转换引发以下错误
异常:
threw exception [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]
型
1条答案
按热度按时间ujv3wf0j1#
在FollowRelationshipConverter类中,您正在组合尝试转换为Map.class或MapValue.class。我认为它应该是一致的-无论是一个或另一个。在getConvertibleTypes()中,它尝试使用MapValue进行转换。在convertToNeo 4jValue()中,它试图转换为Map。