JsonGenerationException:JSON中不允许使用Map的Null键(使用转换NullKeySerializer?)

时间:2016-02-06 14:49:30

标签: java spring-data-neo4j spring-data-neo4j-4 fasterxml

我尝试将此类的实例添加到neo4j spring 4.0.0.RELEASE

@NodeEntity
public class User
{
    @GraphId
    private Long id;
    @Property
    private UUID uniqueId = UUID.randomUUID();
    @Property
    private String username;
    @Property
    private String password;

    // getters, setters, blah blah...
}

当我这样做时,我得到了这个例外:

ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [/pegboard] threw exception [Request processing failed; nested exception is org.neo4j.ogm.metadata.MappingException: Could not create JSON due to Null key for a Map not allowed in JSON (use a converting NullKeySerializer?)] with root cause
com.fasterxml.jackson.core.JsonGenerationException: Null key for a Map not allowed in JSON (use a converting NullKeySerializer?)
    at com.fasterxml.jackson.databind.ser.impl.FailingSerializer.serialize(FailingSerializer.java:35) ~[jackson-databind-2.6.5.jar:2.6.5]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeFields(MapSerializer.java:538) ~[jackson-databind-2.6.5.jar:2.6.5]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:469) ~[jackson-databind-2.6.5.jar:2.6.5]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:29) ~[jackson-databind-2.6.5.jar:2.6.5]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeFields(MapSerializer.java:561) ~[jackson-databind-2.6.5.jar:2.6.5]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:469) ~[jackson-databind-2.6.5.jar:2.6.5]
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:29) ~[jackson-databind-2.6.5.jar:2.6.5]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:693) ~[jackson-databind-2.6.5.jar:2.6.5]
...more stack trace...

发生了什么事?

1 个答案:

答案 0 :(得分:1)

UUID属性导致此错误。因为neo4j只会持久保存基本类型+ String的属性,所以无法使用转换器进行映射。要解决创建转换器:

import org.neo4j.ogm.typeconversion.AttributeConverter;

public class UUIDConverter implements AttributeConverter<UUID, String> {
    @Override
    public String toGraphProperty(UUID uuid) {
        return uuid.toString();
    }

    @Override
    public UUID toEntityAttribute(String uuid) {
        return UUID.fromString(uuid);
    }
}

然后将转换注释添加到用户类中的UUID属性:

import org.neo4j.ogm.annotation.typeconversion.Convert;

...

@Property
@Convert(UUIDConverter.class)
private UUID uniqueId = UUID.randomUUID();