我正在使用以下类实现自定义端点:
@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 - 有人知道我的代码中缺少什么吗?
提前致谢!
答案 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>