Java Spring Boot HAL+JSON映射报错无法识别_embedded字段及Traverson使用问题
问题1:_embedded字段导致反序列化失败解决方案
你当前反序列化失败的核心原因是实体类结构没有适配HAL格式的_embedded嵌套规则:接口返回的menu_items包在最外层的_embedded字段中,每个MenuItem下的menu_categories、option_sets、price_levels也嵌套在该对象的_embedded字段内,你现有实体类没有对应这两层嵌套结构。
修改方式如下:
- 新增顶层响应类,适配最外层的HAL结构
@Data public class MenuItemListResponse extends RepresentationModel<MenuItemListResponse> { private Integer count; private Integer limit; @JsonProperty("_embedded") private Menu embedded; }
- 调整
MenuItem类,适配内部_embedded嵌套结构
@Data public class MenuItem extends RepresentationModel<MenuItem> { // 新增内部类接收MenuItem下的_embedded内容 @Data public static class MenuItemEmbedded { @JsonProperty("menu_categories") private List<MenuCategory> menuCategories; @JsonProperty("option_sets") private List<OptionSet> optionSets; @JsonProperty("price_levels") private List<PriceLevel> priceLevels; } @JsonProperty("_embedded") private MenuItemEmbedded embedded; // 原有基础字段无需修改 @JsonProperty("barcodes") private String barcodes; @JsonProperty("id") private String id; @JsonProperty("in_stock") private String inStock; @JsonProperty("name") private String name; @JsonProperty("open") private Boolean open; @JsonProperty("open_name") private String openName; @JsonProperty("pos_id") private String posId; @JsonProperty("price_per_unit") private Integer pricePerUnit; @JsonProperty("_links") public void setLinks(final Map<String, Link> links) { links.forEach((label, link) -> add(link.withRel(label))); } }
- 修改反序列化的类型引用
// 原有Menu类不用修改,直接用顶层响应类做反序列化目标 ParameterizedTypeReference<MenuItemListResponse> typeRef = new ParameterizedTypeReference<MenuItemListResponse>() {}; MenuItemListResponse response = tb.toObject(typeRef); // 获取menuItems调用:response.getEmbedded().getMenuItems()
你原来手动调用HALMapper的冗余代码可以直接删除,Traverson默认自带HAL格式反序列化能力,无需额外处理。
问题2:self资源获取与Traverson使用说明
- 如果当前接口返回的字段已经满足业务需求,不需要额外调用self对应接口。如果返回的字段不全,需要获取更多属性,则需要调用self接口拉取完整数据。
- Traverson可以实现更优的关联资源处理,无需你手动解析链接、拼接请求:
示例代码如下:
// 拿到MenuItem的self链接后直接跳转拉取完整信息 Link selfLink = menuItem.getLink("self").get(); Traverson itemTraverson = new Traverson(URI.create(selfLink.getHref()), MediaTypes.HAL_JSON); itemTraverson.withHeaders(headers); MenuItem fullItem = itemTraverson.toObject(MenuItem.class); // 要拉取关联资源比如option_sets,直接follow对应rel即可,无需手动处理href List<OptionSet> optionSets = itemTraverson.follow("option_sets").toObject(new ParameterizedTypeReference<List<OptionSet>>() {});
Traverson会自动处理HAL结构的链接跳转、请求头继承,相比手动调用接口大幅简化代码量。
内容的提问来源于stack exchange,提问作者K Rajitha
相关产品推荐
相关产品推荐

