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);
}
我正在尝试在列表 属性 上实施 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);
}