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方法,所以字段绑定、序列化全是正常的。
正确的修复方式
要修改接口的暴露路径,需要严格按照注解的设计规则使用:
- 先移除实体类上错加的
@RestResource注解,保持实体类的Lombok简化写法不变即可:@Entity @Table(name = "Devicetype") @Data @NoArgsConstructor public class DeviceType { @Id @GeneratedValue private long uid; private String name; private String description; } - 找到对应
DeviceType的JPA Repository接口,把@RestResource注解移动到Repository类上:// 把资源路径配置加在这里,而不是实体上 @RestResource(path = "types", rel = "types") public interface DeviceTypeRepository extends JpaRepository<DeviceType, Long> { } - 配置完成后注意:原默认的
/deviceTypes端点会被替换为自定义的/types路径,POST请求需要发送到新地址,就能正常完成字段绑定、实体持久化,返回包含完整业务字段的JSON响应。
其他需要注意的关联细节
- 你当前使用的
spring-boot-starter-parent版本是2.5.0-M1,属于未正式发布的里程碑版本,存在大量未适配的兼容问题,建议替换为正式RELEASE版本,减少无意义的排障成本。 - 对于字段量大的业务实体,Lombok的
@Data注解完全可以和Spring Data REST协同工作,只要不出现注解位置用错的问题,不需要手动补全所有getter、setter方法,不会额外增加开发工作量。
内容的提问来源于stack exchange,提问作者chrx
相关产品推荐
相关产品推荐

