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。
到目前为止我尝试了什么:
- 检查我的端点 class 是否在上下文中注册为 bean。
- 通过 yaml 配置显式公开它。
- 通过
management.endpoints.web.exposure.include=*
暴露了一切
- 完全删除了所有管理配置,因为它应该默认可用。
- 三次检查端点 ID。
- 重命名端点 ID。
有什么我至少可以研究的想法吗?到目前为止我发现的所有问题最终都没有意识到他们也需要 @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'
有趣的是,您不能再在端点名称中使用下划线。至少没有额外的改变。
我正在尝试在 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。
到目前为止我尝试了什么:
- 检查我的端点 class 是否在上下文中注册为 bean。
- 通过 yaml 配置显式公开它。
- 通过
management.endpoints.web.exposure.include=*
暴露了一切
- 完全删除了所有管理配置,因为它应该默认可用。
- 三次检查端点 ID。
- 重命名端点 ID。
有什么我至少可以研究的想法吗?到目前为止我发现的所有问题最终都没有意识到他们也需要 @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'
有趣的是,您不能再在端点名称中使用下划线。至少没有额外的改变。