Spring Data MongoDB重写deleteById实现软删除,避免多余搜索端点
解决MongoRepository软删除时多余GET端点的问题
方案:拆分方法实现逻辑隔离
直接在重写的deleteById上用@Query和@Update会被Spring Data REST判定为自定义查询,自动生成/search端点;加@RestResource(exported=false)又会连带干掉原DELETE端点。试试拆分方法的思路:
@RepositoryRestResource(collectionResourceRel = "entityname", path = "entityname") public interface EntityRepository extends MongoRepository<Entity, String> { // 自定义软删除方法,仅处理更新逻辑,隐藏掉搜索端点 @Update("{ '$set': { 'deleted': true } }") @Query("{ '_id': ?0 }") @RestResource(exported = false) void softDeleteById(String id); // 重写deleteById,内部调用软删除方法 @Override default void deleteById(String id) { softDeleteById(id); } }
效果验证
- 原有的
DELETE /entityname/{id}端点正常可用,调用后执行软删除,返回204 No Content - 不会生成多余的
GET /entityname/search/deleteById或/search/softDeleteById端点 - 即便有人尝试访问/search相关的软删除端点,会直接返回404
原理说明
把软删除逻辑拆到单独的softDeleteById方法里,并用@RestResource(exported=false)禁止Spring Data REST暴露它的搜索端点。而重写的deleteById继承了Spring Data REST默认的DELETE端点配置,不会被额外处理成查询方法,完美避开了原问题里的冲突。
内容的提问来源于stack exchange,提问作者creepercrack
相关产品推荐
相关产品推荐

