Spring 数据 Neo4j 6 @ConvertWith 实现

Spring Data Neo4j 6 @ConvertWith implementation

我正在尝试在列表 属性 上实施 neo4j @ConvertWith

@ConvertWith(converter = "SomeConverter.class") 
List<CustomObject> customObject;

我看到 SomeConverter 应该实现 ->

implements Neo4jPersistentPropertyConverter<List<CustomObject>>

但我无法使转换正常工作.. 它似乎总是在 CustomObject

中询问所需的 ID 属性
java.lang.IllegalStateException: Required identifier property not found for class

它甚至可能不会进入我的转换器?

问题:为对象列表实现转换器的正确方法是什么?

通过注册 GenericConverter 在没有 @ConvertWith 的情况下解决它确实有效。 因此,您为实际的 MyCustomClass 编写了一个转换器,到 neo4j 驱动程序 StringValue,而不是为整个列表(列表)编写一个转换。因为neo4j可以自己从一个List转换过来。 然后就不需要在 属性 上面写 @ConvertWith 或除了下面的任何其他内容。

那么解决方案:

public class CustomConverter implements GenericConverter 

{
    @Override
    public Object convert(final Object source, final TypeDescriptor sourceType, final TypeDescriptor targetType)
    {
        if (sourceType.getType().equals(StringValue.class))
        {
            System.out.println("reading converted");
            return this.toEntityAttribute((StringValue) source);
        }
        else
        {
            System.out.println("writing converting");
            return this.toGraphProperty((MyCustomClass) source);
        }
    }

    @Override
    public Set<ConvertiblePair> getConvertibleTypes()
    {
        Set<ConvertiblePair> convertiblePairs = new HashSet<>();
        convertiblePairs.add(new ConvertiblePair(MyCustomClass.class, Value.class));
        convertiblePairs.add(new ConvertiblePair(Value.class, MyCustomClass.class));
        return convertiblePairs;
    }

    private MyCustomClass toEntityAttribute(final StringValue value)
    {
        MyCustomClass result = null;
        try
        {
            result = AbstractJsonConverter.createObjectFromJson(value.asString(), MyCustomClass.class);
        }
        catch (IOException e)
        {
            CustomConverter.log.warn(e.getMessage(), e);
        }
        System.out.println("reading result:" + result);
        return result;
    }

    private Value toGraphProperty(final MyCustomClass value)
    {
        String result = null;
        try
        {
            result = AbstractJsonConverter.createJsonFromObject(value);
        }
        catch (RepresenationCreationException e)
        {
            CustomConverter.log.warn(e.getMessage(), e);
        }
        return Values.value(result);
    }
}

然后你必须通过定义一个 bean 来注册转换器。

@Bean
public Neo4jConversions neo4jConversions()
{
    Set<GenericConverter> additionalConverters = Collections.singleton(new CustomConverter());
    return new Neo4jConversions(additionalConverters);
}