java - 让骆驼使用 Map 构建端点 uri
问题描述
有没有办法让骆驼使用 a 创建端点的 uri Map<String, String>
,其中包含请求参数?
我经常遇到这样的情况,即我通过配置获得不同的参数,并且必须在运行时以编程方式构建 uri(之后是静态的)。
目前我总是必须自己构建 uri,这可以找到,但我想知道是否有更清洁的方法。
例如,这就是我使用某些配置为 smtp enpoint 构建 uri 的方式(可能不是最简单的代码,但它工作正常):
private String buildSmtpUri() {
StringBuilder sb = new StringBuilder();
if (configuration.isEnableSslSecurity()) {
sb.append("smtps://");
} else {
sb.append("smtp://");
}
Assert.hasText(configuration.getSmtpUrl(), "No smtp url was given");
sb.append(configuration.getSmtpUrl());
if (configuration.getPort() != null) {
sb.append(":");
sb.append(configuration.getPort());
}
Map<String, String> parameters = new HashMap<>();
if (StringUtils.isNotEmpty(configuration.getUsername())) {
parameters.put("username", configuration.getUsername());
}
if (StringUtils.isNotEmpty(configuration.getPassword())) {
parameters.put("password", configuration.getPassword());
}
if (configuration.isBodyIsHtml()) {
parameters.put("contentType", "text/html");
}
AtomicBoolean first = new AtomicBoolean(true);
parameters.forEach((key, value) -> {
if (first.get()) {
first.set(false);
sb.append("?");
} else {
sb.append("&");
}
sb.append(key)
.append("=")
.append(value);
});
return sb.toString();
}
如果这不能使用一些骆驼界面来简化,也许它将来可能是一个很酷的功能?
问候克里斯
解决方案
您可以使用Component#createEndpoint
方法来动态构建Endpoint
实例。
public class MyRouteBuilder extends RouteBuilder {
@Override
public void configure() throws Exception{
from(dynamicEndpoint("seda", "mySeda", Collections.singletonMap("size", "123")))
.to("log:Hello from SEDA");
}
private Endpoint dynamicEndpoint(String component, String name, Map<String, Object> params) throws Exception {
return getContext().getComponent(component).createEndpoint(name, params);
}
}
在 Camel 2.x 中,也有解决方案,虽然不是那么优雅
private Endpoint dynamicEndpoint(String component, String name, Map<String, Object> params) throws Exception {
String uri = String.format("%s://%s?%s", component, name, org.apache.camel.util.URISupport.createQueryString(params));
return getContext().getEndpoint(uri);
}
推荐阅读
- python - 如何防止python的turtle模块打开默认窗口?
- bash - 这个神秘的双点是什么?
- batch-file - 如何使用变量创建批处理脚本。这会生成文件,但不会移动文件并删除源文件
- c++ - 如何在类构造函数中初始化 ifstream 对象?
- javascript - 如何使用应用程序脚本在 html 模板中制作表格
- javascript - 将 JS 对象提取为 JSON
- r - 从R中列表中的变量名中删除后缀
- python - 带字节的嵌套字典
- xcode - 切换到新计算机后 Xcode 错误“无法打开文件 MyApp,因为您无权查看它”
- java - 为 Gradle 执行的 Java 代码指定日志记录配置