Spring Boot 2.0中Spring Data REST自定义资源URI的PUT/PATCH请求失败
实现隐藏真实主键的哈希ID URI方案
针对你需要隐藏资源URI中真实主键的需求,通过自定义EntityLookup替换Spring Data REST默认的主键处理逻辑,实现哈希ID风格的URI是非常合适的方案。我帮你梳理完整的实现细节和关键要点:
1. 自定义EntityLookup组件
首先需要创建一个实现EntityLookup接口的组件,它负责完成真实主键与哈希ID的双向转换,以及实体的查找逻辑:
@Component public class MyDataEntityLookup implements EntityLookup<MyData> { private final MyDataRepository repository; private final HashIdService hashIdService; // 自定义的哈希ID服务,负责生成/解析哈希ID // 构造注入依赖 public MyDataEntityLookup(MyDataRepository repository, HashIdService hashIdService) { this.repository = repository; this.hashIdService = hashIdService; } @Override public Optional<MyData> findById(MyData entity, Serializable id) { // 将URI中的哈希ID解析为真实主键 Long realPrimaryKey = hashIdService.decode((String) id); return repository.findById(realPrimaryKey); } @Override public Serializable getId(MyData entity) { // 将实体的真实主键转换为哈希ID,用于生成对外的URI return hashIdService.encode(entity.getId()); } @Override public Class<? extends Serializable> getIdType() { // URI中使用的ID类型为字符串(哈希ID) return String.class; } @Override public boolean supports(Class<?> type) { // 指定该Lookup只作用于MyData实体 return MyData.class.isAssignableFrom(type); } }
2. 配置Spring Data REST启用自定义Lookup
接下来在你的Spring Data REST配置类中,注册这个自定义的EntityLookup,替换默认的主键处理逻辑:
@Component public class SpringDataMyDataRestCustomization extends RepositoryRestConfigurerAdapter { private final MyDataEntityLookup myDataEntityLookup; public SpringDataMyDataRestCustomization(MyDataEntityLookup myDataEntityLookup) { this.myDataEntityLookup = myDataEntityLookup; } @Override public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { // 注册自定义的EntityLookup,覆盖默认的主键查找行为 config.getEntityLookupRegistrar().register(myDataEntityLookup); // 可选:可以在这里添加其他REST配置,比如设置API基础路径 // config.setBasePath("/api"); } }
关键细节说明
EntityLookup的核心作用:它相当于Spring Data REST的“ID转换器”,完全解耦了对外展示的URI标识和数据库真实主键,既满足了隐私需求,又不影响内部的数据操作;- 哈希ID服务的可靠性:你的
HashIdService需要确保哈希ID的唯一性(避免碰撞),可以基于成熟的库实现,也可以自定义加密逻辑; - 多实体支持:如果有多个实体需要隐藏主键,只需为每个实体创建对应的
EntityLookup组件,然后在配置类中逐一注册即可。
内容的提问来源于stack exchange,提问作者Chris Marth
相关产品推荐
相关产品推荐

