Spring-Data-REST:HAL中@Embeddable的自定义序列化

时间:2017-06-23 09:16:48

标签: json spring-data-rest hateoas hal

我有一个看起来像这样的实体(为简洁起见,我省略了getter,setter和constuctors):

@Entity
public class System {
    @NotNull
    @Column(name = "SYSTEMID", nullable = false)
    @Embedded
    private SystemId systemId;
}
SystemId的

如下所示:

@Embeddable
@JsonSerialize(using = SystemIdSerializer.class)
@JsonDeserialize(using = SystemIdDeserializer.class)
public class SystemId {
    @Column(name = "SYSTEMID", nullable = false)
    private String value;
}

我的自定义序列化程序除了写出值之外什么都不做,它适用于'普通'JSON,而不是看起来像这样的HAL表示:

{
    "systemId": {
        "content": "1"
    }
}

我想要像这样

{
    "systemId": "1"
}

也是。 有什么办法吗?我花了一些时间用谷歌搜索但没有成功。 感谢。

1 个答案:

答案 0 :(得分:2)

也许projection可以帮助你......

@Projection(name="withSystemId", types = System.class)
public interface WithSystemId {

    @JsonProperty("systemId")
    @Value("#{target.systemId.value}")
    String getSysId();

    // Other getters of System properties...
}

然后尝试获取您的System

http://localhost:8080/api/systems?projection=withSystemId

<强>已更新

关于自定义序列化程序 - 只需将@JsonUnwrapped注释添加到systemId

@Entity
public class System {

    @Embedded
    @JsonUnwrapped
    private SystemId systemId;
} 

然后你必须得到你期望的

{
    "systemId": "1"
} 

我认为你的序列化器看起来像这样:

public class SystemIdSerializer extends StdSerializer<SystemId> {

    public SystemIdSerializer() {
        this(null);
    }

    protected SystemIdSerializer(Class<SystemId> t) {
        super(t);
    }

    @Override
    public void serialize(SystemId id, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeStartObject();
        gen.writeNumberField("systemId", id.value());
        gen.writeEndObject();
    }
}

工作示例是here。请参阅Member和嵌套的MemberSkill类。然后尝试启动应用并获取http://localhost:8080/api/members