Jersey v1 Spring 引导更改 jersey root 路径以公开执行器端点

Jersey v1 Spring Boot change jersey root Path to expose actuator endpoints

从 dsyer 的例子开始:https://github.com/dsyer/spring-boot-jersey/tree/master/spring-boot-sample-jersey1

重申一下,我使用的是 Jersey v1 而不是 v2。

我注意到球衣覆盖了 spring-boot-actuator 端点,例如 /env 和 /health。我按照 Spring Boot Jersey and Monitoring URL's 成功地重新暴露了 spring-boot 端点。现在球衣忽略了除 /hello/** 之外的所有内容,这是我想要的,但我还必须将控制器中的路径更改为 @Path("/hello")

我希望我的控制器代码保留 @Path("/"),只需将 jersey 的应用程序根更改为 /hello。我想我可以使用 @ApplicationPath("/hello") 注释来完成此操作,但我无法弄清楚使用 Jersey v1 和 Spring Boot 的 put/configure 在哪里。 (我似乎找到的所有示例都使用 Jersey 2 中的 ResourceConfig,而 Jersey 1 似乎没有相同的实现)

有什么想法吗?

因此,根据您链接到的示例(以及在添加执行器监控之后),我能够通过以下方式让端点工作

  1. 除了为 Jersey 过滤器设置初始化参数外,一切保持原样

    FilterRegistrationBean bean = new FilterRegistrationBean();
    ...           
    bean.addInitParameter("com.sun.jersey.config.feature.FilterForwardOn404", "true");
    

    这使得即使使用默认的 /* 映射,当 Jersey 没有找到监控端点(它不应该)时,它会将请求转发回 servlet 容器,并且它会找到端点。

  2. 在您的 post 中,您似乎试图更改 URL 作为监控 URL 的 "shadowing" 的变通方法。但是以上解决了这个问题而不需要改变路径。但是,如果您仍然确实想要更改路径,这就是我能够想出的解决方案。

    似乎尝试在 filter 中添加映射会产生您遇到的行为。为了解决这个问题,我没有将 Jersey 注册为过滤器,而是注册为 servlet。请注意,先前的解决方案仅用作过滤器。但是这里我们将使用一个 servlet 来更改 URL 映射。

    @Bean
    public ServletRegistrationBean jerseyServlet() {
        ServletRegistrationBean bean = new ServletRegistrationBean();
        bean.setServlet(new ServletContainer());
        bean.addInitParameter("com.sun.jersey.config.property.packages",
                              "com.sun.jersey;demo");
        bean.addUrlMappings("/api/*");
        return bean;
    }
    

我想应该有一些 ResourceConfig/@ApplicationPath 的组合应该可以工作,但是根据我所做的测试,我还没有找到它。如果我能弄清楚,我可能会稍后更新这个post。