JHipster拉取关联实体时Jackson序列化丢失Product相关问题咨询
问题1解答
修改@JsonIgnoreProperties注解配置是完全正确的解决思路。
JHipster自动生成带双向关联的实体时,为了避免JSON序列化时出现无限递归报错,默认会在所有关联字段上添加@JsonIgnoreProperties注解,排除反向关联的引用字段。你遇到的Product数据丢失问题,就是EcmOrderItem实体中指向Product的oitPro关联字段,对应的@JsonIgnoreProperties配置把Product需要返回的业务字段或者整个关联字段加入了序列化忽略列表,导致Repository查出来的Product数据在序列化返回给前端的阶段被直接丢弃了。
问题2解答
完全可以不修改JHipster自动生成的文件,仅通过新增自定义代码解决,常用的有两种方案:
- 方案1:用Jackson混合注解(MixIn)覆盖序列化规则
新增一个自定义Jackson配置类,声明MixIn接口专门给EcmOrderItem类指定序列化规则,明确要求序列化oitPro字段,仅忽略会导致递归的反向关联字段即可,不需要动原自动生成的实体类代码。
参考实现代码:// 自定义MixIn接口,指定EcmOrderItem的oitPro字段的序列化规则 public interface EcmOrderItemMixIn { @JsonIgnoreProperties(value = {"你不需要返回的Product反向关联字段名,比如指向订单项的集合字段名"}) EcmProduct getOitPro(); } // 注册MixIn配置 @Configuration public class CustomJacksonConfig { @Bean public Jackson2ObjectMapperBuilderCustomizer orderDetailJacksonCustomizer() { return builder -> builder.mixIn(EcmOrderItem.class, EcmOrderItemMixIn.class); } } - 方案2:新增自定义DTO层做数据映射
新增自定义的订单详情DTO结构,里面包含你前端需要的所有订单、订单项、商品字段,同时新增对应的MapStruct映射器,在你自己扩展的Service查询逻辑中,把Repository查询到的实体数据映射为自定义DTO之后再返回给前端,完全绕过实体类自带的序列化注解限制,不会修改任何JHipster自动生成的代码。
内容的提问来源于stack exchange,提问作者Ramiro Carvalho
相关产品推荐
相关产品推荐

