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 和过滤器吗?