栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

默认情况下如何在Spring Boot REST中执行最新版本的端点?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

默认情况下如何在Spring Boot REST中执行最新版本的端点?

如果我的问题没错,您希望发送的不带

X-API-VERSION
标题的请求将自动路由到
headerV2()
方法

可以这样做:

从概念上讲,您需要一个在Spring MVC Dispatch
Servlet之前执行的Web筛选器,并且您必须检查该请求是否包含标头,以及是否未添加您认为应该是最新版本的标头(来自配置等)。

这里的一个警告是HttpServletRequest不允许添加标头,因此您必须创建HttpServletRequestWrapper并在其中实现标头添加的逻辑。

这是一个示例借用了实现):

// The web filter import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import java.io.IOException;@Component@Order(1)public class LatestVersionFilter implements Filter {    @Override    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {        HttpServletRequest req = (HttpServletRequest) servletRequest;        if(req.getHeader("X-API-VERSION")== null) { HeaderMapRequestWrapper wrappedRequest = new HeaderMapRequestWrapper(req); wrappedRequest.addHeader("X-API-VERSION", resolveLastVersion()); filterChain.doFilter(wrappedRequest, servletResponse);        } else { filterChain.doFilter(servletRequest, servletResponse);        }    }    private String resolveLastVersion() {        // read from configuration or something        return "2";    }}

请注意,请求已包装以添加标头,如下所述:

class HeaderMapRequestWrapper extends HttpServletRequestWrapper {                public HeaderMapRequestWrapper(HttpServletRequest request) { super(request);        }        private Map<String, String> headerMap = new HashMap<String, String>();                public void addHeader(String name, String value) { headerMap.put(name, value);        }        @Override        public String getHeader(String name) { String headerValue = super.getHeader(name); if (headerMap.containsKey(name)) {     headerValue = headerMap.get(name); } return headerValue;        }                @Override        public Enumeration<String> getHeaderNames() { List<String> names = Collections.list(super.getHeaderNames()); for (String name : headerMap.keySet()) {     names.add(name); } return Collections.enumeration(names);        }        @Override        public Enumeration<String> getHeaders(String name) { List<String> values = Collections.list(super.getHeaders(name)); if (headerMap.containsKey(name)) {     values.add(headerMap.get(name)); } return Collections.enumeration(values);        }    }

通过这种实现(确保将servlet放在控制器或其他东西旁边的包中,以便Spring Boot将其识别为组件),您将看到:

  1. 带有标题的GET
    X-API-VERSION=1
    将被路由到
    headerV1()
  2. 带有标题的GET
    X-API-VERSION=2
    将被路由到
    headerV2()
  3. 没有
    X-API-VERSION
    标题的GET 将被路由到
    headerV2()


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/615665.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号