53.7.1接收输入
端点上的操作通过其参数接收输入。通过Web公开时,这些参数的值取自URL的查询参数和JSON请求体。通过JMX公开时,参数将映射到
MBean操作的参数。默认情况下需要参数。可以通过使用 @org.springframework.lang.Nullable 注释它们来使它们成为可选项。
JSON请求正文中的每个根属性都可以映射到端点的参数。请考虑以下JSON请求正文:
{
"name": "test",
"counter": 42
}
这可用于调用带有 String name 和 int counter 参数的写操作。
由于端点与技术无关,因此只能在方法签名中指定简单类型。特别是不支持使用定义 name 和 counter 属性的自定义类型声明单
个参数。
要允许输入映射到操作方法的参数,实现端点的Java代码应使用 -parameters 进行编译,实现端点的Kotlin代码应使
用 -java-parameters 进行编译。如果您使用的是Spring Boot的Gradle插件,或者您使用的是Maven
和 spring-boot-starter-parent ,则会自动执行此操作。
输入类型转换
如有必要,传递给端点操作方法的参数将自动转换为所需类型。在调用操作方法之前,通过JMX或HTTP请求接收的输入将使
用 ApplicationConversionService 的实例转换为所需类型。
53.7.2自定义Web端点
@Endpoint , @WebEndpoint 或 @EndpointWebExtension 上的操作将使用Jersey,Spring MVC或Spring WebFlux通过HTTP自动公开。
Web端点请求谓词
为Web暴露的端点上的每个操作自动生成请求谓词。
路径
谓词的路径由端点的ID和Web暴露的端点的基本路径确定。默认基本路径为 /actuator 。例如,ID为 sessions 的端点将使
用 /actuator/sessions 作为谓词中的路径。
可以通过使用 @Selector 注释操作方法的一个或多个参数来进一步定制路径。这样的参数作为路径变量添加到路径谓词中。调用端点操作时,
将变量的值传递给操作方法。
HTTP方法
谓词的HTTP方法由操作类型决定,如下表所示:
消费
对于使用请求主体的 @WriteOperation (HTTP POST ),谓词的consumemes子句
为 application/vnd.spring-boot.actuator.v2 json, application/json 。对于所有其他操作,consumemes子句为空。
产生
谓词的produce子句可以由 @DeleteOperation , @ReadOperation 和 @WriteOperation 注释的 produces 属性确定。该属性是可选的。如果
未使用,则自动确定produce子句。
如果操作方法返回 void 或 Void ,则produce子句为空。如果操作方法返回 org.springframework.core.io.Resource ,则produce子句
为 application/octet-stream 。对于所有其他操作,produce子句
是 application/vnd.spring-boot.actuator.v2 json, application/json 。
Web端点响应状态
端点操作的默认响应状态取决于操作类型(读取,写入或删除)以及操作返回的内容(如果有)。
@ReadOperation 返回一个值,响应状态为200(OK)。如果它未返回值,则响应状态将为404(未找到)。
如果 @WriteOperation 或 @DeleteOperation 返回值,则响应状态将为200(OK)。如果它没有返回值,则响应状态将为204(无内容)。
如果在没有必需参数的情况下调用操作,或者使用无法转换为所需类型的参数,则不会调用操作方法,并且响应状态将为400(错误请求)。
Web端点范围请求
HTTP范围请求可用于请求HTTP资源的一部分。使用Spring MVC或Spring Web Flux时,返回 org.springframework.core.io.Resource 的
操作会自动支持范围请求。
使用Jersey时不支持范围请求。
Web端点安全
Web端点或特定于Web的端点扩展上的操作可以接收当前 java.security.Principal
或 org.springframework.boot.actuate.endpoint.SecurityContext 作为方法参数。前者通常与 @Nullable 结合使用,为经过身份验证和
未经身份验证的用户提供不同的行为。后者通常用于使用 isUserInRole(String) 方法执行授权检查。
53.7.3 Servlet端点
通过实现一个注释为 @ServletEndpoint 且同时实现 Supplier<EndpointServlet> 的类,可以将 Servlet 公开为端点。Servlet端点提供与
Servlet容器更深层次的集成,但代价是可移植性。它们旨在用于将现有的 Servlet 作为端点公开。对于新端点,应尽可能优先选择 @Endpoint
和 @WebEndpoint 注释。
53.7.4控制器端点
@ControllerEndpoint 和 @RestControllerEndpoint 可用于实现仅由Spring MVC或Spring WebFlux公开的端点。使用Spring MVC和
Spring WebFlux的标准注释(例如 @RequestMapping 和 @GetMapping )映射方法,并将端点的ID用作路径的前缀。控制器端点提供与Spring
Web框架的更深层次集成,但代价是可移植性。应尽可能优先考虑 @Endpoint 和 @WebEndpoint 注释。