【问题标题】:Spring Boot web application doesn't serve standard endpointsSpring Boot Web 应用程序不提供标准端点
【发布时间】:2016-10-04 01:14:42
【问题描述】:

我的 Spring Boot 应用程序有问题,它应该从命令行运行,同时从标准 /metrics 端点提供一些指标。当我刚刚创建应用程序时,所有指标都正确提供,但在某些时候我似乎“破坏”了某些东西,我的应用程序停止从默认端点提供服务。我不能只是恢复到初始状态,因为已经有很多代码而且我不想丢失版本控制历史。也许有人可以指出我做错了什么?

我不覆盖调度程序 servlet,也不添加任何自定义过滤器。

Spring Boot 1.3.7 版。

访问 /metrics 或任何其他默认端点时出错

白标错误页面

这个应用程序没有明确的 /error 映射,所以你看到 这是一个后备。

2016 年 10 月 3 日星期一 17:53:12 PDT 出现意外错误(type=Not 找到,状态=404)。没有可用的消息

申请文件:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Runner.class, args);
    }
}

主运行器文件:

@EnableConfigurationProperties(ApplicationProperties.class)
@SpringBootApplication
public class Runner implements CommandLineRunner {
    @Override
    public void run(String... strings) throws Exception {
        // shortened ...
    }
}

POM 文件片段:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.7.RELEASE</version>
    <relativePath/>
</parent>

<dependencies>
    <!-- spring boot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>

调试输出显示过滤器已创建:

2016-10-03 17:26:14.461 DEBUG 85880 --- [ost-startStop-1] o.s.b.c.e.ServletContextInitializerBeans : Added existing Servlet initializer bean 'dispatcherServletRegistration'; order=2147483647, resource=class path resource [org/springframework/boot/autoconfigure/web/DispatcherServletAutoConfiguration$DispatcherServletConfiguration.class]
2016-10-03 17:26:14.720 DEBUG 85880 --- [ost-startStop-1] o.s.b.c.e.ServletContextInitializerBeans : Created Filter initializer for bean 'metricFilter'; order=-2147483648, resource=class path resource [org/springframework/boot/actuate/autoconfigure/MetricFilterAutoConfiguration.class]

我创建了一个示例清洁应用程序进行比较,输出中有我的应用程序中没有的行:

2016-10-03 18:06:48.075 DEBUG 86858 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : 2 request handler methods found on class org.springframework.boot.actuate.endpoint.mvc.MetricsMvcEndpoint: {public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.MetricsMvcEndpoint.value(java.lang.String)={[/{name:.*}],methods=[GET],produces=[application/json]}, public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()={[],methods=[GET],produces=[application/json]}}
2016-10-03 18:06:48.076  INFO 86858 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/metrics/{name:.*}],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.MetricsMvcEndpoint.value(java.lang.String)
2016-10-03 18:06:48.076  INFO 86858 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/metrics || /metrics.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()

因此,过滤器/servlet 似乎已创建但未映射到我的应用程序中。 我可能在这里错过了什么?

【问题讨论】:

  • A 404 is resource is not found - 那么有哪些网络资源可用以及您要获取哪些资源。配置在ApplicationProperties.class,那么显示这段代码怎么样?
  • @ScaryWombat ApplicationProperties.class 是一个简单的 POJO,用于从应用程序启动参数中获取一些文本属性。它不会以任何方式影响 Web 配置。我正在尝试访问 /metrics 端点,如问题中所述,那是我得到 404 的时候。你为什么要减去这个问题?
  • minusing - 哇,我学会了一个新词。其实我是想帮你。我正在尝试确定您实际映射到 metrics 的代码,但我看不到任何代码。
  • 顺便说一句,如果您使用的是 Eclipse 和/或 SVN,那么也许您可以在以前的版本中使用 compare
  • @ScaryWombat 好的,好吧,如果这能让它变得更好,那就投反对票。我刚刚从“减号”创建了一个动词。我使用 git 和 Intellij Idea,当然如果容易的话,我可以逐步进行比较和部分还原和还原。但这不仅仅是一个版本。端点已经有一个多星期没有使用了,在那段时间里,已经进行了大量的提交。我可以尝试创建一个新应用并将所有代码移至其中,但我会丢失几乎所有历史记录。

标签: java spring spring-boot


【解决方案1】:

好吧,我是愚蠢的。可以说两遍。 所以,毕竟,问题是我记性不好。我实际上是在覆盖这样的应用程序属性:

management.contextPath=/services/admin

你猜怎么着,我的 /metrics 一直都在那里。它就在 /services/admin/metrics 下,我完全忘记将其覆盖。呵呵。

【讨论】:

    猜你喜欢
    • 2015-05-24
    • 2014-09-15
    • 2019-05-31
    • 1970-01-01
    • 2019-04-02
    • 2015-07-25
    • 2023-01-30
    • 1970-01-01
    • 2016-02-11
    相关资源
    最近更新 更多