SpringBoot中能否将URL路径映射作为配置项实现便捷复用?
实现方案
以下是3种常用实现方案,可根据你的业务场景选择:
方案1:通用路径变量映射(最快捷,消除重复代码)
你的现有方法逻辑都是URL路径和视图名完全对应,直接用一个通用方法即可覆盖所有同规则请求,额外加白名单控制避免非法路径访问:
package refill.station.controller.user; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import java.util.Set; @RestController @RequiredArgsConstructor @RequestMapping("/user") public class MemberController { // 允许访问的视图白名单,也可以后续抽到配置文件中 private static final Set<String> ALLOWED_VIEWS = Set.of("id", "pw", "signUp"); @GetMapping("/{viewName}") public ModelAndView commonView(@PathVariable String viewName, ModelAndView mav) { if (!ALLOWED_VIEWS.contains(viewName)) { // 自定义错误页跳转逻辑 mav.setViewName("error/404"); return mav; } mav.setViewName("user/" + viewName); return mav; } }
后续新增同规则路径,只需要往ALLOWED_VIEWS集合中加元素即可,不需要重复写方法。
方案2:路径统一抽至配置文件管理(灵活度最高)
如果需要完全统一管理所有URL路径,修改时不需要动业务代码,可以把路径映射规则写到配置文件中,结合配置类读取:
- 首先在
application.yml中添加自定义配置:
# 自定义用户端路径映射配置 user: view-mapping: id: id pw: pw sign-up: signUp
- 编写配置类绑定配置:
import org.springframework.boot.context.properties.ConfigurationProperties; import java.util.Map; @ConfigurationProperties(prefix = "user.view-mapping") public class UserViewProperties { private Map<String, String> mappings; public Map<String, String> getMappings() { return mappings; } public void setMappings(Map<String, String> mappings) { this.mappings = mappings; } }
- 启动类添加
@EnableConfigurationProperties(UserViewProperties.class)开启配置绑定,改造Controller:
@RestController @RequiredArgsConstructor @RequestMapping("/user") public class MemberController { private final UserViewProperties viewProperties; @GetMapping("/{path}") public ModelAndView commonView(@PathVariable String path, ModelAndView mav) { String viewName = viewProperties.getMappings().get(path); if (viewName == null) { mav.setViewName("error/404"); return mav; } mav.setViewName("user/" + viewName); return mav; } }
后续新增或者修改路径映射,直接改yml配置即可,完全不需要修改Controller代码。
方案3:全局视图控制器注册(纯视图跳转无业务逻辑最优)
如果这些接口没有任何业务逻辑,只是做视图跳转,直接不需要写Controller方法,通过Spring MVC配置统一注册即可:
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { // 一次性注册所有路径和视图的对应关系 registry.addViewController("/user/id").setViewName("user/id"); registry.addViewController("/user/pw").setViewName("user/pw"); registry.addViewController("/user/signUp").setViewName("user/signUp"); // 也可以结合方案2的配置类,循环读取配置批量注册,进一步简化代码 } }
这种方式连Controller的方法都不需要写,所有跳转规则统一在配置类管理,适合纯静态视图跳转的场景。
内容的提问来源于stack exchange,提问作者JinYeong Kim
相关产品推荐
相关产品推荐

