Spring Boot 2.0 未注册自定义执行器端点 Bean

Spring Boot 2.0 Not Registering Custom Actuator Endpoint Bean

我正在尝试在 Spring Boot 2.0.2.RELEASE 应用程序中添加自定义执行器端点。 我正在关注 the official guidelines, the official migration guide and also this post.

我可以通过属性配置所有内容:hide/expose 端点、更改基本路径等。一切正常,除了我的自定义端点 bean 未被 WebMvcEndpointHandlerMapping 拾取。它根本没有出现在这些著名的日志行中:

EndpointLinksResolver        : Exposing 2 endpoint(s) beneath base path '/actuator'
WebMvcEndpointHandlerMapping : Mapped "{[/actuator/health],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
WebMvcEndpointHandlerMapping : Mapped "{[/actuator/info],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
WebMvcEndpointHandlerMapping : Mapped "{[/actuator],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto protected java.util.Map<java.lang.String, java.util.Map<java.lang.String, org.springframework.boot.actuate.endpoint.web.Link>> org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping.links(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)

我只得到这三行。我可以毫无问题地访问 /actuator/health/actuator/info,但不能访问我的自定义端点。我显然得到 404。

到目前为止我尝试了什么:

有什么我至少可以研究的想法吗?到目前为止我发现的所有问题最终都没有意识到他们也需要 @Component 注释。

啊,顺便说下我的class:

@Component
@Endpoint(id = "hello")
public class HelloEndpoint {

    @ReadOperation
    public String sayHello() {
        return "Hello!";
    }
}

发布问题后,我几乎立即找到了答案。这是配置中的拼写错误和实际上 默认情况下未公开的事实 的结合。尽管 the official post saying

To configure an endpoint, all that’s required really is to expose it as a @Bean

这些是定义 属性:

的正确方法
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.include='health,info,metrics,hello'

或作为 YAML:

management:
  endpoints:
    web:
      exposure:
        include: 'health,info,metrics,hello'

这里是官方参考:https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html#production-ready-endpoints-exposing-endpoints

有趣的是,您不能再在端点名称中使用下划线。至少没有额外的改变。