调用PunkAPI获取啤酒数据如何提取指定字段并配置Entity实体关联
实体类关联关系配置
结合返回的JSON结构,4个实体类的单向关联关系配置如下:
Beer类和Method类:一对一关联,用@OneToOne注解,配置级联保存为CascadeType.ALL,查询抓取策略设为FetchType.EAGER即可,Beer实体中存储Method的外键关联Method类和MashTemp类:一对多关联,用@OneToMany注解,同样配置级联全操作和立即抓取,MashTemp表中存储关联Method的外键MashTemp类和Temp类:一对一关联,用@OneToOne注解,配置同上,MashTemp表中存储关联Temp的外键
所有实体类统一添加@JsonIgnoreProperties(ignoreUnknown = true)注解,避免API返回的多余字段导致反序列化报错,不需要的字段无需在实体类中定义即可自动忽略。
指定返回字段的实现方案
有两种常用方案可选,按需使用即可:
方案1:实体类加JSON序列化注解(适合简单场景)
在不需要返回的字段上添加@JsonIgnore注解,同时自定义mash_temp的序列化逻辑,将嵌套在method下的mash_temp提升到Beer的同级返回,示例代码如下:
// Beer类示例 @Data @Entity @JsonIgnoreProperties(ignoreUnknown = true) public class Beer { @Id private Long id; private String name; private String description; @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JsonIgnore // 序列化时隐藏method层级 private Method method; // 序列化时直接输出mash_temp字段 @JsonProperty("mash_temp") public List<MashTemp> getMashTemp() { return method != null ? method.getMashTemp() : null; } } // Method类示例 @Data @Entity @JsonIgnoreProperties(ignoreUnknown = true) public class Method { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JsonProperty("mash_temp") private List<MashTemp> mashTemp; // 不需要的fermentation、twist字段无需定义 } // MashTemp类示例 @Data @Entity @JsonIgnoreProperties(ignoreUnknown = true) public class MashTemp { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) private Temp temp; private Integer duration; } // Temp类示例 @Data @Entity @JsonIgnoreProperties(ignoreUnknown = true) public class Temp { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Integer value; private String unit; }
配置完成后原有Service代码无需修改,接口直接返回Beer实体即可仅输出指定的4个字段。
方案2:自定义DTO类(适合复杂场景,解耦性更好)
单独定义返回给前端的BeerDTO类,仅包含需要返回的4个字段:
@Data public class BeerDTO { private Long id; private String name; private String description; private List<MashTemp> mashTemp; }
查询到Beer实体后,手动或借助Bean映射工具将对应属性拷贝到BeerDTO后返回即可,实体类和接口返回结构完全解耦,互不影响。
内容的提问来源于stack exchange,提问作者Filip Vidojevic
相关产品推荐
相关产品推荐

