有谁知道如何从驼峰URI中提取参数? 我有一个像这样定义的路线
from("SOME_URI")
.to("SOME_URI")
.to("bean:myBean?method=myMethod&myParameter1=val1&myParameter2=val2")
我想像这样在“myMethod”中提取parameter1和parameter2(我在Grails中实现了camel)
def myMethod(def inBody, Exchange exchange){
String parameter1 = extractParameter('myParameter1')
String parameter2 = extractParameter('myParameter2')
...//rest of code
return something
}
提前感谢!
答案 0 :(得分:1)
你可以从交换中获得你想要的东西:
exchange.getFromEndpoint()
将返回“SOME_URI”定义的 Endpoint 并且:
exchange.getFromEndpoint().getEndpointUri()
将返回“SOME_URI”的 String 值
意味着您的代码可能变为:
def myMethod(def inBody, Exchange exchange){
def uri = exchange?.fromEndpoint?.endpointUri
if(uri) {
String parameter1 = extractParameter(uri, 'myParameter1')
String parameter2 = extractParameter(uri, 'myParameter2')
//...rest of code
}
return something
}
/*
* do any kind of processing you want here to manipulate the string
* and return the parameter. This code should work just fine in grails
*/
def extractParameter(String uri, String parameterName) {
def m = uri =~ "${parameterName}=([^&]+)"
return m.find() ? m[0][1] : null
}
如果首选Java等效项,则应该这样做:
private static String extractParameter(String uri, String parameterName) {
Matcher m = Pattern.compile(parameterName + "=([^&]+)").matcher(uri);
return m.find() ? m.group(1) : null
}
另请注意,根据您要完成的具体操作,更好的方法可能是使用 fromF DSL直接向您的路线提供参数。这样,您可以在代码中使用参数,然后您不必担心提取它们。
下面的代码段取自Camel Documentation of FromF。
fromF("file://%s?include=%s", path, pattern).toF("mock:%s", result);
答案 1 :(得分:1)
val1和val2是硬编码的值,还是它们应该是某种动态值,可能来自消息本身?
Camel bean组件允许您定义绑定,并从消息或固定值传入值。有关详细信息,请参阅:http://camel.apache.org/bean-binding.html
您还需要查看方法签名中的参数数量,以及您在Camel bean绑定uri中定义的参数数量。他们应该匹配。
答案 2 :(得分:1)
如果我理解正确,您正在尝试将参数传递给将要调用的方法。通常的做法是修改Exchange
对象,因为它正在流经路径。
from("SOME_URI")
.to("SOME_URI")
.setHeader("myParameter1", constant("val1"))
.setHeader("myParameter2", constant("val2"))
.to("bean:myBean?method=myMethod")
在您的方法中,您只需访问Exchange
。
def myMethod(Exchange exchange) {
String parameter1 = exchange.getHeader("myParameter1", String.class)
String parameter2 = exchange.getHeader("myParameter2", String.class)
//...rest of code
}
或者如果你想获得幻想并使用Camel的bean绑定,
def myMethod(Exchange exchange,
@Header("myParameter1") String parameter1,
@Header("myParameter2") String parameter2) {
//...rest of code
}
如果有帮助,请记得投票。