使用带@RepositoryRestResource的JpaRepository时,如何始终返回实体@Id?
确保JpaRepository(结合RepositoryRestResource)始终返回实体@Id字段的几种方法
首先明确一点:Spring Data REST 默认会把实体的@Id字段包含在REST接口的响应里,要是你的场景里没返回,大概率是下面几个原因,对应解决方法如下:
1. 检查实体类是否意外忽略了@Id字段
如果你的AppUser实体(或者它继承的AbstractTimestampEntity)里,@Id字段被加了@JsonIgnore注解,Jackson序列化时就会跳过这个字段。这时候只要去掉@JsonIgnore就行:
@Entity @Table(name = "app_user") public class AppUser extends AbstractTimestampEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) // 注意:别在这里加@JsonIgnore private Long id; // 其他字段、getter/setter... }
2. 通过RepositoryRestConfigurer强制暴露ID
如果项目有全局配置限制了ID暴露,或者你想明确指定实体暴露ID,可以自定义一个RepositoryRestConfigurer实现,强制注册ID字段的暴露:
import org.springframework.context.annotation.Configuration; import org.springframework.data.rest.core.config.RepositoryRestConfiguration; import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer; import org.springframework.web.servlet.config.annotation.CorsRegistry; @Configuration public class RestConfig implements RepositoryRestConfigurer { @Override public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config, CorsRegistry cors) { // 单独暴露AppUser的ID字段 config.exposeIdsFor(AppUser.class); // 如果要批量暴露多个实体的ID,可以这么写: // config.exposeIdsFor(AppUser.class, Order.class, Product.class); } }
这个配置会强制Spring Data REST把指定实体的ID字段加入到REST响应中,不受默认配置影响。
3. 检查Projection(投影)是否遗漏了ID
如果你的Repository用了Projection(自定义接口来限制返回字段),一定要确保投影接口里包含ID字段的getter方法。比如有这样的投影:
public interface UserProjection { // 必须声明getId()才能让ID字段返回 Long getId(); String getUsername(); // 其他需要的字段getter... }
要是在Repository里指定了默认投影:
@RepositoryRestResource(collectionResourceRel = "users", path = "users", excerptProjection = UserProjection.class) public interface AppUserRepository extends JpaRepository<AppUser, Long> { AppUser findByUsername(@Param("username") String username); }
这时候投影接口里必须显式写getId(),否则ID字段不会出现在响应里。
验证方式
配置完后,调用REST接口(比如GET /users或GET /users/{id}),查看响应体是否包含id字段。正常的响应应该类似这样:
{ "id": 1, "username": "testUser", "createdAt": "2024-05-20T12:34:56", "_links": { "self": { "href": "http://localhost:8080/users/1" }, "appUser": { "href": "http://localhost:8080/users/1" } } }
内容的提问来源于stack exchange,提问作者Stefan Falk
相关产品推荐
相关产品推荐

