You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 11:04:50