Apache Camel 2.16.4:如何将查询参数传入Velocity模板?
解决方案:直接获取Restlet查询参数到Velocity模板
针对你在Camel 2.16.4中遇到的Restlet查询参数无法直接通过${headers.param2}访问的问题,这里有几种更简洁的实现方式:
方法1:配置Restlet端点自动映射查询参数到Headers
Camel的Restlet组件支持通过端点参数开启查询参数到消息头的自动映射,你只需要修改from端点的URI,添加mapQueryParameters=true:
<from uri="restlet:http://localhost:8081/service_url?restletMethod=get&mapQueryParameters=true"/> <to uri="velocity:{{templates.uri}}/stub-answer.vm{{velocity.opts}}"/>
开启这个参数后,所有查询参数会自动被映射到消息头中,你就可以在Velocity模板里直接使用${headers.param2}来获取对应的值了,和路径参数的用法完全一致。
方法2:在路由中添加Processor解析查询参数
如果方法1的参数在你的Camel版本中存在兼容性问题,还可以在路由里添加一个自定义Processor,手动解析CamelHttpQuery并将参数存入headers:
<from uri="restlet:http://localhost:8081/service_url?restletMethod=get"/> <process ref="queryParamParser"/> <to uri="velocity:{{templates.uri}}/stub-answer.vm{{velocity.opts}}"/>
然后定义对应的Processor Bean:
public class QueryParamParser implements Processor { @Override public void process(Exchange exchange) throws Exception { String query = exchange.getIn().getHeader("CamelHttpQuery", String.class); if (query != null && !query.isEmpty()) { Map<String, String> params = new HashMap<>(); // 分割并解析每个查询参数,同时处理URL解码 for (String param : query.split("&")) { String[] keyValue = param.split("=", 2); if (keyValue.length == 2) { params.put(keyValue[0], URLDecoder.decode(keyValue[1], StandardCharsets.UTF_8.name())); } } // 将解析后的参数存入消息头 exchange.getIn().getHeaders().putAll(params); } } }
这样处理后,同样可以在Velocity模板里直接用${headers.param2}访问参数值,而且还能处理URL编码的场景,比你之前的分割方法更健壮。
方法3:在Velocity模板中直接解析查询参数(无需修改路由)
如果不想改动现有路由配置,也可以在Velocity模板里用更通用的逻辑解析CamelHttpQuery:
#set($query = $headers.CamelHttpQuery) #set($param2 = "") #if($query) #foreach($param in $query.split("&")) #set($kv = $param.split("=", 2)) #if($kv[0] == "param2") ## 用Camel自带的工具类完成URL解码,覆盖所有编码场景 #set($param2 = $context.get("org.apache.camel.util.URISupport").decode($kv[1])) #end #end #end
这种方式不需要修改路由,直接在模板里完成解析逻辑,比你之前的分割方式更灵活,能适配多个参数的场景。
内容的提问来源于stack exchange,提问作者WeGa
相关产品推荐
相关产品推荐

