其他分享
首页 > 其他分享> > 如何在Spring Boot 2.0执行器端点的`@ WriteOperation`中使用`@Selector`?

如何在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