【问题标题】:Spring Boot Jersey and Monitoring URL'sSpring Boot Jersey 和监控 URL
【发布时间】:2015-01-12 13:01:15
【问题描述】:

我们有一个简单的带有 Jersey 的 Spring Boot 应用程序。

Spring Boot 提供默认的监控端点

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#production-ready-monitoring

例子:

@Component
public class JerseyConfig extends ResourceConfig {

    public JerseyConfig() {
        // registering resources from rest package
        packages("com.xyx.abc.rest");

    }

}

Spring Boot 提供的 REST 端点在 Spring Boot Jersey 应用程序的上下文中不可用。

Spring Boot 依赖包括 Jersey、starter-actuator、starter-tomcat。

我们的 REST 资源显示正常,但 Spring Boot 提供的用于监控的资源不显示。

例如 http://abc.xyx.com:8080/health 返回 404

【问题讨论】:

    标签: spring rest tomcat spring-boot health-monitoring


    【解决方案1】:

    如果您将其用作Filter,您需要告诉 Jersey 不要处理这些请求。例如。通过将 Jersey 资源放在单独的路径下,例如“/api/*”或其他内容:

    @Bean
    public FilterRegistrationBean jersey() {
        FilterRegistrationBean bean = new FilterRegistrationBean();
        ...
        bean.setUrlPatterns(Lists.newArrayList("/api/*"));
        return bean;
    }
    

    (来自here)。

    或者通过声明您的管理端点是“静态的”(通过另一个初始化参数“com.sun.jersey.config.property.WebPageContentRegex”):

    @Bean
    public FilterRegistrationBean jersey() {
        FilterRegistrationBean bean = new FilterRegistrationBean();
        ...
        bean.addInitParameter("com.sun.jersey.config.property.WebPageContentRegex",
                "/admin/.*");
        return bean;
    }
    

    我们在 Spring Boot 外部配置中设置了 management.contextPath=/admin(否则您必须枚举正则表达式中的所有端点)。

    您还可以告诉 Jersey 忽略未解决的请求(而不是发送 404)。这也将实现您的目标,但可能会影响您的客户端应用程序(如果它们的行为依赖 404)。

    【讨论】:

    • 使用以下代码,当managment.contextPath=/app 时监控URL 工作正常。但是泽西资源给了一个 404 @Bean public FilterRegistrationBean jersey() { FilterRegistrationBean bean = new FilterRegistrationBean(); bean.setFilter(new ServletContainer()); bean.setOrder(Ordered.LOWEST_PRECEDENCE); bean.addInitParameter("com.sun.jersey.config.property.WebPageContentRegex", "/app/.**"); bean.addInitParameter("com.sun.jersey.config.property.packages", "com.xxx.application"); bean.setUrlPatterns(Lists.newArrayList("/api/**"));回豆; }
    • 所有 Jersey 资源都为 /api。但是,使用 /api/* 或 /api/** 注册上述内容会导致 404
    • 应该是“/api/*”(根据 Servlet 规范)。什么是给你 404 的 URL?您确定它们在泽西岛被映射(不带 /api 前缀)吗?
    • 仍然是带有 Jersey URL 的 404。是的,它是 bean.setUrlPatterns(Lists.newArrayList("/api/*"));并且给出 404 的 JERSEY URL 是 @Path("/api") public class HelloWorldResource { @GET @Path("/company/{companyId}/hello/{count}") @Produces(MediaType.APPLICATION_JSON)public HelloServiceContract sayHelloPlus(@PathParam("count") 字符串计数) { ..}
    • 来自日志,2014 年 11 月 18 日 07:46:00.656;线程="localhost-startStop-1"; ;日志级别=信息;记录器=o.s.b.c.e.FilterRegistrationBean.configure;映射过滤器:“servletContainer”到 url:[/api/*] 以及 Nov-18-2014 07:46:00.656;线程="localhost-startStop-1"; ;日志级别=信息;记录器=o.s.b.c.e.ServletRegistrationBean.onStartup;映射 servlet:'dispatcherServlet' 到 [/]
    猜你喜欢
    • 2016-05-09
    • 2021-10-17
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 2017-09-09
    • 2017-10-02
    • 1970-01-01
    相关资源
    最近更新 更多