You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Spring Boot HAL+JSON映射报错无法识别_embedded字段及Traverson使用问题

问题1:_embedded字段导致反序列化失败解决方案

你当前反序列化失败的核心原因是实体类结构没有适配HAL格式的_embedded嵌套规则:接口返回的menu_items包在最外层的_embedded字段中,每个MenuItem下的menu_categories、option_sets、price_levels也嵌套在该对象的_embedded字段内,你现有实体类没有对应这两层嵌套结构。
修改方式如下:

  1. 新增顶层响应类,适配最外层的HAL结构
@Data
public class MenuItemListResponse extends RepresentationModel<MenuItemListResponse> {
    private Integer count;
    private Integer limit;
    @JsonProperty("_embedded")
    private Menu embedded;
}
  1. 调整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)));
    }
}
  1. 修改反序列化的类型引用
// 原有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:45:03