Spring覆盖jar包中路径映射的几种解决方案
问题背景
项目中使用Spring,通过@GetMapping("/api/user") 定义了路径映射 /api/user,现在有个需求需要修改这个路径映射下的代码逻辑,而由于该定义来自引入的jar,无法直接修改代码。
解决方案
1 使用@RequestMapping优先级
Spring会优先选择更具体的映射:
@RestController
public class MyController {
@GetMapping(path = "/api/user", params = "myParam")
public String myMethod() {
return "My implementation";
}
}
当url中带有参数myParam时,spring会映射到这里处理,也可以设置为 params = "myParam=1",即当参数myParam=1时映射到此
2 使用Filter拦截并转发请求到特定path
- 创建自定义Filter
@Component
public class PathOverrideFilter extends OncePerRequestFilter {
// 定义需要重定向的路径映射
private static final Map<String, String> PATH_MAPPINGS = new HashMap<String, String>(){{
put("/api/user", "/api-new/user");
}};
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
String requestURI = request.getRequestURI();
String redirectPath = PATH_MAPPINGS.get(requestURI);
// 检查是否需要重定向
if (StringUtils.isNotBlank(redirectPath)) {
// 创建包装请求,修改路径信息
HttpServletRequest wrappedRequest = new HttpServletRequestWrapper(request) {
@Override
public String getRequestURI() {
return redirectPath;
}
@Override
public String getServletPath() {
return redirectPath;
}
};
// 继续处理链,但使用修改后的请求
filterChain.doFilter(wrappedRequest, response);
return;
}
// 不需要重定向的请求正常处理
filterChain.doFilter(request, response);
}
}
- 创建目标Controller方法
@RestController
public class NewController {
@GetMapping("/api-new/user")
public String myMethod() {
// 你的新实现
return "My new implementation";
}
}
对于大多数需要"覆盖"功能的场景,Filter转发路径方案通常是最佳选择,它平衡了简单性和功能性。
到此这篇关于Spring覆盖jar包中路径映射的几种解决方案的文章就介绍到这了,更多相关Spring覆盖jar包路径映射内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Mybatis-Plus接口BaseMapper与Services使用详解
这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-05-05
Servlet关于RequestDispatcher的原理详解
这篇文章主要介绍了Servlet关于RequestDispatcher的原理详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-11-11
maven springboot如何将jar包打包到指定目录
这篇文章主要介绍了maven springboot如何将jar包打包到指定目录,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-12-12
Java 利用DeferredResult实现http轮询实时返回数据接口
这篇文章主要介绍了Java 利用 DeferredResult 实现 http 轮询实时返回数据接口,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下2021-03-03
Java gRPC拦截器简单实现分布式日志链路追踪器过程详解
有请求的发送、处理,当然就会有拦截器的需求,例如在服务端通过拦截器统一进行请求认证等操作,这些就需要拦截器来完成,今天松哥先和小伙伴们来聊一聊gRPC中拦截器的基本用法,后面我再整一篇文章和小伙伴们做一个基于拦截器实现的JWT认证的gRPC2023-03-03


最新评论