如何在Spring Boot 2.0执行器端点的`@ WriteOperation`中使用`@Selector`?

时间:2017-12-21 07:45:36

标签: spring spring-boot spring-boot-actuator

我正在使用以下类实现自定义端点:

@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 - 有人知道我的代码中缺少什么吗?

提前致谢!

3 个答案:

答案 0 :(得分:5)

顺便说一下,我遇到了和你一样的问题并且有点疯狂。

但我发现问题与用@Selector注释的参数的参数命名有关。

如果你将var“property”命名为“arg0”,那么所有这些都会有效:

public void setBootstrapUrl(@Selector String arg0, String value)

是的,我知道这有点奇怪但我在article中找到了一些关于编译类时嵌入参数的信息。

我仍然没有在参数中使用我自己的名字。

答案 1 :(得分:3)

Angel Pizano建议的解决方案确实解决了这个问题,但这是一个更好的解决方案:为maven编译器插件启用参数标志:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <compilerArgs>
            <arg>-parameters</arg>
        </compilerArgs>
    </configuration>
</plugin>

顺便说一下,这是一个相关的主题:https://github.com/spring-projects/spring-boot/issues/11010

答案 2 :(得分:2)

实际上,这两种解决方案都可以使用,但是从3.6.2版本开始,maven-compiler-plugin支持一个新的配置元素“ parameters”,必须将其设置为“ true”。

这会为方法反射生成一些额外的元数据,Spring可以在启动时使用它们来正确绑定参数。参见maven-compiler-plugin documentation

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.2</version>
            <configuration>
                <parameters>true</parameters>
            </configuration>
        </plugin>