Spring Boot 2.2升级后Spring HATEOAS 1.0中BaseUriLinkBuilder移除的修复咨询
修复Spring Boot 2.2升级后BaseUriLinkBuilder不存在的问题
嘿,这个问题我升级Spring Boot到2.2版本时也踩过坑!Spring HATEOAS 1.0(正好和Spring Boot 2.2配套)重构了API,BaseUriLinkBuilder确实被移除了,官方把它的功能整合到了WebMvcLinkBuilder里,下面给你具体的修复方案:
核心变更说明
Spring HATEOAS 1.0为了简化API设计,将基础URI的构建能力合并到了WebMvcLinkBuilder的静态方法baseUri()中,不再需要单独的BaseUriLinkBuilder类,这是你找不到它的原因。
改造你的工具类
你原来的代码逻辑是拼接origin、上下文路径、REST基础路径和后缀URI,我们可以用UriComponentsBuilder先构建完整的基础URI,再通过WebMvcLinkBuilder.baseUri()替代原来的BaseUriLinkBuilder.create()逻辑,改造后的代码如下:
/** * Utility class that fix the URI created adding the base path. * {@linkplain "https://github.com/spring-projects/spring-hateoas/issues/434}" * * @author Daniele Renda */ @Service @Log4j2 public class BasePathAwareLinks { private final URI contextBaseURI; private final URI restBaseURI; @Autowired public BasePathAwareLinks(ServletContext servletContext, RepositoryRestConfiguration config) { contextBaseURI = URI.create(servletContext.getContextPath()); restBaseURI = config.getBasePath(); } public WebMvcLinkBuilder underBasePath(WebMvcLinkBuilder linkBuilder) { try { URI uri = linkBuilder.toUri(); URI origin = new URI(uri.getScheme(), uri.getAuthority(), null, null, null); URI suffix = new URI(null, null, uri.getPath(), uri.getQuery(), uri.getFragment()); // 构建完整的基础URI:origin + contextBaseURI + restBaseURI UriComponents baseUriComponents = UriComponentsBuilder.fromUri(origin) .path(contextBaseURI.getPath()) .path(restBaseURI.getPath()) .build(); // 使用WebMvcLinkBuilder.baseUri替代BaseUriLinkBuilder.create return WebMvcLinkBuilder.baseUri(baseUriComponents.toUri()) .slash(suffix); } catch (URISyntaxException e) { log.error("Failed to build base path aware link", e); } return null; } }
额外注意点
UriComponentsBuilder会自动处理路径中的斜杠重复问题,不用担心拼接时出现//这类错误路径;- 如果你的
restBaseURI是空路径,UriComponentsBuilder也会自动忽略,不会影响最终结果; - 如果你需要更灵活的路径拼接,也可以直接使用
UriComponentsBuilder构建完整URI后,再转换成WebMvcLinkBuilder。
内容的提问来源于stack exchange,提问作者drenda
相关产品推荐
相关产品推荐

