Spring Data Rest是否支持按HAL规范解析请求中的_links关联字段?
Spring Data Rest POST提交HAL格式载荷时关联属性未注入问题
问题场景
向Spring Data Rest端点/api/groupMembers发起媒体类型为application/hal+json的POST请求,请求载荷如下:
{ "id": null, "_links":{ "group":{"href":"http://local:8080/api/groups/7"}, "item":{"href":"http://local:8080/api/items/10689"}, "groupItem":{"href":"http://local:8080/api/items/10689"} } }
该格式与HAL规范给出的示例一致,载荷中所有URI均指向已存在的资源,可直接访问解析。但服务端Spring Data Rest未正确组装这些链接对象,对应TRACE日志如下:
TRACE 20248 --- [nio-8080-exec-9] .w.s.m.m.a.ServletInvocableHandlerMethod : Arguments: [org.springframework.data.rest.webmvc.RootResourceInformation@15aacfd5, Resource { content: GroupMember(id=null, group=null, item=null, groupItem=null), links: [] }, org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler@1d8f0f1a, application/hal+json]
核心疑问:为何Spring Data Rest没有使用这些链接对象填充group、item、groupItem关联属性?
补充验证信息
序列化行为验证
向/api/GroupMembers/1发起GET请求,返回响应如下:
{ "id":1, "_links":{ "group":{"href":"http://local:8080/api/groups/1"}, "item":{"href":"http://local:8080/api/items/689"}, "groupItem":{"href":"http://local:8080/api/items/689"} } }
从返回结果可见,Spring Data Rest可正常生成/序列化该类JSON HAL响应,但无法在请求中处理(反序列化)相同格式的JSON HAL内容。
关联实体定义
涉及的GroupMember实体定义如下:
@Entity @Data public class GroupMember { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; @ManyToOne @JoinColumn(name="groupId") private Group group; @ManyToOne @JoinColumn(name="itemId") private Item item; @ManyToOne @JoinColumn(name="groupItemId") private Item groupItem; }
问题原因
出现该现象的核心原因是Spring Data Rest对HAL格式的序列化、反序列化逻辑不对称:
- 序列化输出阶段:框架会自动将实体的关联属性转换为
_links节点下带href的链接对象,符合HAL规范的输出要求。 - 反序列化输入阶段:框架默认不会解析
_links节点完成关联属性绑定,其内置的关联属性解析规则为:直接以关联属性名为key,对应值传入关联资源的URI字符串,框架会自动根据URI查找对应持久化实体完成关联注入。
当前提交的载荷将所有关联URI放在_links节点下,反序列化时该节点会被直接忽略,因此解析后的实体所有关联属性均为null,与日志打印结果一致。
正确请求格式
符合Spring Data Rest反序列化要求的POST载荷格式如下:
{ "id": null, "group": "http://local:8080/api/groups/7", "item": "http://local:8080/api/items/10689", "groupItem": "http://local:8080/api/items/10689" }
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

