Spring Boot版本:2.0.3.RELEASE
使用的 Spring Boot 示例可以在“端点基础设施”部分@WriteOperation
找到。
这个示例工作正常,因为 JSON 主体作为带有字符串值的参数传递:并且 LogLevel 是一个枚举。{ "configuredLevel": "WARN" }
不幸的是,如果您尝试传递 HTTP POST 请求正文中包含的 bean 类,那么它将失败并返回 400 - 错误请求。您可以看一下这个不起作用的示例: http://www.baeldung.com/spring-boot-actuators,4.7。 “创建自定义端点”部分
使用curl命令:
$ curl -X POST http://localhost:8080/actuator/features/payment -H "Content-Type: application/json" -d '{"enabled": true}'
response:
{"timestamp":"2018-07-23T09:57:57.922+0000","status":400,"error":"Bad Request","message":"Missing parameters: feature","path":"/actuator/features/payment"}
它表示缺少特征参数。即使添加了这个功能参数:
$ curl -X POST http://localhost:8080/actuator/features/payment -H "Content-Type: application/json" -d '{"feature": {"enabled":true}}'
response:
"Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of java.lang.String out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException"
Feature bean class is not interpreted because Jackson is expecting a string instead of a bean class.
在调试 Jackson 和 Spring 源代码后,我发现问题出现在启动时,因为RequestMappingHandlerMapping.isHandler()
知道创建处理程序用于仅从端点方法识别 bean 类Controller
和RequestMapping
。根据50.8“实现自定义端点”部分,端点和 WebEndpoint 通过 HTTP 公开。因此,这两个类都应该添加到isHandler()
方法中以创建用于解析 bean 类的处理程序。