Spring Boot Jersey 和监控 URL

Posted

技术标签:

【中文标题】Spring Boot Jersey 和监控 URL【英文标题】:Spring Boot Jersey and Monitoring URL's 【发布时间】: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

【问题讨论】:

【参考方案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' 到 [/]

以上是关于Spring Boot Jersey 和监控 URL的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot、jwt、jersey、spring security和CORS问题

Spring-Boot Jersey:允许 Jersey 提供静态内容

带有 Jersey 和 Spring Security OAuth2 的 Spring Boot

我可以在 Spring Boot 中将 Jersey 用作 servlet 和过滤器吗?

jersey在 spring boot 添加 packages 扫描路径支持

无法访问 Spring Boot 和 Jersey 应用程序中的某些控制器