You need to enable JavaScript to run this app. Spring Data Rest与Lombok结合@RestResource注解下实体字段丢失排查
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data Rest与Lombok结合@RestResource注解下实体字段丢失排查

问题排查结论

Lombok和Spring Data REST不存在这类已知的不兼容问题,你遇到的实体字段不保存、返回结果缺失业务字段的异常,根源是对@RestResource注解的使用规则认知错误,和Lombok没有关系。

问题产生的核心原因

  • @RestResource是Spring Data REST专门提供的、用于标注Repository接口资源暴露规则的注解,设计上就不是用来修饰JPA实体类的。
  • 你把@RestResource直接加到DeviceType实体类上时,Spring Data REST会错误将实体类识别为独立的资源描述类,绕开了原本基于Jackson序列化器的字段绑定逻辑:既不会把POST请求体里的name、description通过setter绑定到实体属性,也不会在响应里序列化这些字段,最终就出现了只返回_links、没有业务字段的结果。
  • 最开始没有加这个注解的时候,Spring Data REST会自动按照实体Repository的默认规则生成/deviceTypes路径的接口,没有额外的识别干扰,Jackson可以正常识别Lombok生成的getter/setter方法,所以字段绑定、序列化全是正常的。

正确的修复方式

要修改接口的暴露路径,需要严格按照注解的设计规则使用:

  1. 先移除实体类上错加的@RestResource注解,保持实体类的Lombok简化写法不变即可:
    @Entity
    @Table(name = "Devicetype")
    @Data
    @NoArgsConstructor
    public class DeviceType {
        @Id
        @GeneratedValue
        private long uid;
        private String name;
        private String description;
    }
    
  2. 找到对应DeviceType的JPA Repository接口,把@RestResource注解移动到Repository类上:
    // 把资源路径配置加在这里,而不是实体上
    @RestResource(path = "types", rel = "types")
    public interface DeviceTypeRepository extends JpaRepository<DeviceType, Long> {
    }
    
  3. 配置完成后注意:原默认的/deviceTypes端点会被替换为自定义的/types路径,POST请求需要发送到新地址,就能正常完成字段绑定、实体持久化,返回包含完整业务字段的JSON响应。

其他需要注意的关联细节

  • 你当前使用的spring-boot-starter-parent版本是2.5.0-M1,属于未正式发布的里程碑版本,存在大量未适配的兼容问题,建议替换为正式RELEASE版本,减少无意义的排障成本。
  • 对于字段量大的业务实体,Lombok的@Data注解完全可以和Spring Data REST协同工作,只要不出现注解位置用错的问题,不需要手动补全所有getter、setter方法,不会额外增加开发工作量。

内容的提问来源于stack exchange,提问作者chrx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 01:24:07