Spring为何生成self与rel重复链接?如何禁用该重复链接?
关于Spring Data REST中self与rel链接重复的问题解答
这问题我之前也碰到过,其实是Spring Data REST对无独立仓库的嵌套实体的默认处理逻辑导致的,我给你拆解下原因和解决办法:
为什么会出现重复链接?
你的Banner类是Ad的嵌套实体,但没有对应的@RepositoryRestResource仓库接口。这种情况下,Spring Data REST不会把Banner当作独立的REST资源,而是作为Ad的附属嵌入式资源处理。此时生成的self链接其实是指向父实体Ad中该关联的路径(比如/ads/{adId}/banner),同时rel="banner"的链接也指向同一个位置,所以两者就重复了。
解决办法
方案1:给Banner创建独立的Repository(推荐,符合REST设计)
如果希望Banner成为独立的可访问资源,只需要给它添加一个仓库接口:
@RepositoryRestResource public interface BannerRepository extends CrudRepository<Banner, String> { }
添加后,Spring Data REST会为Banner生成独立的端点(比如/banners/{id}),此时Ad中banner字段对应的rel="banner"链接会指向该独立端点,而Banner自身的self链接也会指向这个地址,两者自然就区分开了。
方案2:自定义ResourceProcessor移除重复链接
如果不想让Banner暴露为独立资源,只是想去掉重复的链接,可以通过自定义ResourceProcessor来修改Banner的资源模型:
@Component public class BannerResourceProcessor implements ResourceProcessor<RepresentationModel<Banner>> { @Override public RepresentationModel<Banner> process(RepresentationModel<Banner> resource) { // 移除self链接,保留rel="banner"的关联链接 resource.removeLink(IanaLinkRelations.SELF); return resource; } }
你也可以根据需求反过来,移除rel="banner"的链接,只保留self,完全看你的业务场景。
方案3:通过配置调整资源暴露规则
还可以通过RepositoryRestConfiguration来全局调整资源的链接生成逻辑,比如禁用嵌套实体的self链接生成:
@Configuration public class RestConfig implements RepositoryRestConfigurer { @Override public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { // 针对Banner类型自定义链接处理逻辑 config.exposeIdsFor(Banner.class); // 如果需要暴露Banner的id字段 // 更精准的控制还是推荐用ResourceProcessor } }
内容的提问来源于stack exchange,提问作者slesh
相关产品推荐
相关产品推荐

