No Convertor found Neo4j Sping Boot SDN 6

xiozqbni  于 2023-08-04  发布在  其他
关注(0)|答案(1)|浏览(152)

我已经通过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]

ujv3wf0j

ujv3wf0j1#

在FollowRelationshipConverter类中,您正在组合尝试转换为Map.class或MapValue.class。我认为它应该是一致的-无论是一个或另一个。在getConvertibleTypes()中,它尝试使用MapValue进行转换。在convertToNeo 4jValue()中,它试图转换为Map。

相关问题