如何在Spring Boot 2.0执行器端点的`@ WriteOperation`中使用`@Selector`?
作者:互联网
我正在使用以下类实现自定义端点:
@Component
@Endpoint(id = "bootstrap")
public class BootstrapUrlEndpoint {
private final URL bootstrapUrl;
@Autowired
public BootstrapUrlEndpoint(URL bootstrapUrl) {
this.bootstrapUrl = bootstrapUrl;
}
@ReadOperation
public Map<String, String> getBootstrapUrl() {
Map<String, String> result = new HashMap<>();
result.put("bootstrap_url", bootstrapUrl.toExternalForm());
return result;
}
@WriteOperation
public void setBootstrapUrl(@Selector String property, String value) throws MalformedURLException {
System.out.println(String.format(">>> Setting %s = %s", property, value));
}
}
没有@Selector注释,这一切都“按预期工作”;省略它并将POST发送到http:// localhost:8080 / actuator / bootstrap:
{
"value": "http://localhost:27017/tables/application"
}
按预期调用方法.
但是,我无法使“选择器”工作;我在启动日志中看到它被注册为有效端点:
Mapped "{[/actuator/bootstrap/{arg0}],methods=[POST],consumes=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public org.reactivestreams....ava.util.Map<java.lang.String, java.lang.String>)
不幸的是,使用POST / actuator / bootstrap / myprop和相同的主体调用它会产生400 Bad Request而不会出现错误日志或错误消息.
我一直在寻找更多的信息和可能的例子:我能找到的唯一相关(但是,唉,不完整)的例子是this article – 有谁知道我的代码中缺少什么?
提前致谢!
解决方法:
顺便说一下,我遇到了和你一样的问题而且有点疯狂.
但我发现问题与使用@Selector注释的参数的参数命名有关.
如果您将var“property”命名为“arg0”,则所有这些都将起作用:
public void setBootstrapUrl(@Selector String arg0, String value)
是的,我知道这有点奇怪但是我在article中找到了一些关于编译类时嵌入参数的信息.
我仍然没有在参数中使用我自己的名字.
标签:spring,spring-boot-2,spring-boot-actuator 来源: https://codeday.me/bug/20190717/1486525.html