当前位置: 首页 > 知识库问答 >
问题:

如何在Spring Boot REST中默认执行最新版本的endpoint?

茅华灿
2023-03-14
@GetMapping(value = "/student/header", headers = {"X-API-VERSION=1"})
public StudentV1 headerV1() {
    return serviceImpl.headerV1();
}

@GetMapping(value = "/student/header", headers = {"X-API-VERSION=2"})
public StudentV1 headerV2() {
    return serviceImpl.headerV2();
}

共有1个答案

姚海
2023-03-14

如果我答对了您的问题,您希望不带x-api-version头发送的请求将自动路由到headerv2()方法

可以这样做:

从概念上讲,您需要一个在Spring MVC Dispatch Servlet之前执行的Web过滤器,并且您必须检查请求是否包含一个头,如果它没有添加一个您认为应该是最新版本的头(从配置或其他方面)。

// 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 {
        /**
         * construct a wrapper for this request
         *
         * @param request
         */
        public HeaderMapRequestWrapper(HttpServletRequest request) {
            super(request);
        }

        private Map<String, String> headerMap = new HashMap<String, String>();

        /**
         * add a header with given name and value
         *
         * @param name
         * @param value
         */
        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;
        }

        /**
         * get the Header names
         */
        @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);
        }

    }
    null
 类似资料:
  • 我目前正在Ubuntu18.04上。 我的默认python版本是python 3.7.9 我想将它升级到Python3.9.2,并将其设置为默认的Python版本 我该怎么做?

  • 我正在上下翻页有人能帮帮我吗?我使用appium版本1.6和java客户端6.01对于最新版本,它是不显示driver.scroll()方法或TouchAction操作=新的TouchAction(this.driver);action.press(starX, start Y). moveTo(endX, endY).释放()。执行();它不执行按

  • 问题内容: 在运行时,我经常创建/修改 log4j Logger,Appenders,Levels,Layouts,并且有时需要将所有内容重置为默认值。 Log4j 系统具有定义明确的 默认初始化过程 ,该 过程 在将 log4j 类加载到内存时执行。有什么方法可以稍后在运行时以编程方式重新执行整个过程吗? 我在 log4j 文档中找到了几种方法,但是不确定它们中的任何一种是否可以执行 默认初始化

  • 我刚刚注意到Gradle发布了2.12版,根据发行说明,脚本的编译速度应该提高20%。我想在Android Studio中升级到那个版本。 我用的是v1。在设置中,我选择了“使用默认gradle包装器”选项,这意味着每个项目将使用特定的gradle版本,而不是使用本地gradle安装。使用的版本是文件。例子: 现在,如果我将其更改为: 然后Android Studio找不到该版本并抛出一个错误。显

  • 我在运行时遇到此错误 我在apt中搜索过,似乎已经安装好了。 我已经通过这个github问题,这是不清楚的解决方案。

  • 我想写版本:'latest.release'在build.gradle某处一次。然后可以像这样简化依赖关系:编译'org.jsoup: jsoup' 就像spring boot一样:编译“org”。springframework。boot:spring boot starter web' 可能吗?