出色的Apache Camel团队忙于解决查询中多个参数的处理问题,这是一种解决方法。 希望该帖子将在下一版本的Camel中变得过时。 (当前,我使用2.7.5)

问题

大于1的查询参数作为null值传递给Camel-CXF服务。 假设网址中有四个查询参数,例如

name=arun&email=arun@arunma.com&age=10&phone=123456

执行以下操作时,只会填充第一个:

MultiQueryParams

@GET
@Path("search")
@Produces(MediaType.APPLICATION_JSON)
public String sourceResultsFromTwoSources(@QueryParam("name") String name, @QueryParam("age") String age,@QueryParam("phone") String phone,@QueryParam("email") String email
);

所有其他参数为null

最终输出

对于网址: http://localhost:8181/cxf/karafcxfcamel/search?name=arun&email=arun@arunma.com&age=31&phone=232323预期的结果是:

解决方法

有趣的是,我们可以在标头中获取整个查询字符串。

QueryStringHeader

String queryString = exchange.getIn().getHeader(Exchange.HTTP_QUERY, String.class);

然后我们可以做一个

提取参数

MultivaluedMap<String, String> queryMap = JAXRSUtils.getStructuredParams(queryString, "&", false, false);

获取查询参数作为多值Map。

然后可以将查询参数设置为Exchange的属性,并在整个Exchange使用。

  • 整个代码可以从github下载

请注意,我在Karaf容器中将Camel作为OSGi的一部分运行。 尽管因使用Camel-CXF的环境而导致变通办法没有不同,但从github下载代码时请注意这一事实。 请注意用于骆驼配置的xml蓝图。

这里最重要的是路由器

路由器

RestToBeanRouter

package me.rerun.karafcxfcamel.camel.beans;import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.model.dataformat.JsonLibrary;
import org.apache.cxf.jaxrs.utils.JAXRSUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.ws.rs.core.MultivaluedMap;
import java.util.List;
import java.util.Map;public class RestToBeanRouter extends RouteBuilder {private static Logger logger= LoggerFactory.getLogger(RouteBuilder.class);@Overridepublic void configure() throws Exception {from ("cxfrs://bean://rsServer").process(new ParamProcessor()).multicast().parallelProcessing().aggregationStrategy(new ResultAggregator()).beanRef("restServiceImpl", "getNameEmailResult").beanRef("restServiceImpl", "getAgePhoneResult").end().marshal().json(JsonLibrary.Jackson).to("log://camelLogger?level=DEBUG");}private class ParamProcessor implements Processor {@Overridepublic void process(Exchange exchange) throws Exception {String queryString = exchange.getIn().getHeader(Exchange.HTTP_QUERY, String.class);MultivaluedMap<String, String> queryMap = JAXRSUtils.getStructuredParams(queryString, "&", false, false);for (Map.Entry<String, List<String>> eachQueryParam : queryMap.entrySet()) {exchange.setProperty(eachQueryParam.getKey(), eachQueryParam.getValue());}}}
}

接口

RestService

package me.rerun.karafcxfcamel.rest;import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;public interface RestService {@GET@Path("search")@Produces(MediaType.APPLICATION_JSON)public String sourceResultsFromTwoSources();}

实作

RestServiceImpl

package me.rerun.karafcxfcamel.rest;import me.rerun.karafcxfcamel.model.AgePhoneResult;
import me.rerun.karafcxfcamel.model.NameEmailResult;
import me.rerun.karafcxfcamel.service.base.AgePhoneService;
import me.rerun.karafcxfcamel.service.base.NameEmailService;
import me.rerun.karafcxfcamel.service.impl.AgePhoneServiceImpl;
import org.apache.camel.Exchange;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.List;public class RestServiceImpl implements RestService {private static Logger logger= LoggerFactory.getLogger(AgePhoneServiceImpl.class);private NameEmailService nameEmailService;private AgePhoneService agePhoneService;public RestServiceImpl(){}//Do nothing. Camel intercepts and routes the requestspublic String sourceResultsFromTwoSources() {return null;}public NameEmailResult getNameEmailResult(Exchange exchange){logger.info("Invoking getNameEmailResult from RestServiceImpl");String name=getFirstEntrySafelyFromList(exchange.getProperty("name", List.class));String email=getFirstEntrySafelyFromList(exchange.getProperty("email", List.class));return nameEmailService.getNameAndEmail(name, email);}public AgePhoneResult getAgePhoneResult(Exchange exchange){logger.info("Invoking getAgePhoneResult from RestServiceImpl");String age=getFirstEntrySafelyFromList(exchange.getProperty("age", List.class));String phone=getFirstEntrySafelyFromList(exchange.getProperty("phone", List.class));return agePhoneService.getAgePhoneResult(age, phone);}public NameEmailService getNameEmailService() {return nameEmailService;}public AgePhoneService getAgePhoneService() {return agePhoneService;}public void setNameEmailService(NameEmailService nameEmailService) {this.nameEmailService = nameEmailService;}public void setAgePhoneService(AgePhoneService agePhoneService) {this.agePhoneService = agePhoneService;}private String getFirstEntrySafelyFromList(List<String> list){if (list!=null && !list.isEmpty()){return list.get(0);}return null;}
}

资源资源

  • 骆驼邮件列表问题
参考: Rerun.me博客上的JCG合作伙伴 Arun Manivannan提供的具有多个查询参数的Camel CXF服务 。

翻译自: https://www.javacodegeeks.com/2013/11/camel-cxf-service-with-multiple-query-parameters.html

具有多个查询参数的Camel CXF服务相关推荐

  1. camel 多个 to_具有多个查询参数的Camel CXF服务

    camel 多个 to 出色的Apache Camel团队忙于解决查询中多个参数的处理问题,这是一种解决方法. 希望本文将在下一版本的Camel中不再使用. (目前,我使用2.7.5) 问题 大于1的 ...

  2. Go 学习笔记(50)— Go 标准库之 net/url(查询转义、查询参数增/删/改/查、解析URL)

    1. URL 概述 import "net/url" url 包解析 URL 并实现了查询的转码.URL 提供了一种定位因特网上任意资源的手段,但这些资源是可以通过各种不同的方案( ...

  3. 在AngularJS中读取查询参数的最简洁方法是什么?

    本文翻译自:What's the most concise way to read query parameters in AngularJS? I'd like to read the values ...

  4. 基于服务器端保存用户的查询参数

    基于服务器端保存用户的查询参数 最近公司项目有一个新的需求, 希望用户在PC查询的参数能够同步更新到APP端, 避免让用户在PC和APP端重复输入查询条件, 基于项目是前后端分离, APP和PC的请求 ...

  5. ASP.NET三层架构之不确定查询参数个数的查询

    在做三层架构的时候,特别是对表做查询的时候,有时候并不确定查询条件的个数,比如查询学生表:有可能只输入学号,或者姓名,或者性别,总之查询条件的参数个数并不确定,下面是我用List实现传值的代码: 附图 ...

  6. 获取request中的查询参数

    //获取request中的查询参数public static Map<String, Object> getRequestParamsByMap(HttpServletRequest re ...

  7. php动态添加查询,php动态添加url查询参数的方法,php动态url参数_PHP教程

    php动态添加url查询参数的方法,php动态url参数 本文实例讲述了php动态添加url查询参数的方法.分享给大家供大家参考.具体分析如下: 这段代码可以动态为url添加key-value查询参数 ...

  8. neo4j cypher_neo4j / cypher:悬挂查询参数

    neo4j cypher 一直以来,我一直在使用neo4j的密码查询语言, 迈克尔一直在告诉我在查询中使用参数,但是查询的性能始终可以接受,因此我没有必要. 但是,最近我正在研究一个数据集,并使用类似 ...

  9. Java EE 8 MVC:使用查询参数

    在上一篇有关新Java EE MVC框架的文章中,我们详细介绍了Controllers . 在本篇和以下文章中,我们将看到如何在MVC控制器中访问各种类型的请求数据. Java EE MVC大量使用了 ...

最新文章

  1. 基于Socket的UDP和TCP编程介绍
  2. 极大似然估计和贝叶斯估计
  3. Jquery append 方法在ie8不兼容问题
  4. 国家市场监管总局:互联网广告不得等倒计时结束才能关闭
  5. Android中binder,hwbinder,vndbinder之间的关系
  6. Shanda EZ Mini
  7. MongoDB 在windows shell环境下的基本操作和命令的使用示例(二)
  8. 【教程New】IDM安装使用教程--便捷下载网页视频的好方法
  9. 卡巴斯基2009离线升级包制作方法
  10. Janusgraph索引
  11. 个人博客网站的设计与实现
  12. 人工智能与大数据就业前景_人工智能就业方向及发展前景
  13. 奥西450的服务器系统,奥西TDS450
  14. STM8/STM32 SPI模式的MAX7456代码
  15. html怎么实现左右滚动,css实现左右滑动
  16. ASP.NET 2.0 本地化技术之研究
  17. windows7 64位安装oracle10g
  18. 基于L2Dwidget动态漫画人物js特效
  19. SecureCRT标签显示IP地址
  20. 诺禾-C语言实现尾递归求7的阶乘

热门文章

  1. python的pandas库中如何计算每列出现最多的值_Python Pandas:计算多个列的每个唯一值的显示次数...
  2. linux入门_Linux超详细0基础入门篇(一)
  3. follow 开源项目关于NoClassDefFoundError错误的解决方法
  4. kafka处理流式数据_通过Apache Kafka集成流式传输大数据
  5. selenium 等待_Selenium等待:内隐,外显,流利和睡眠
  6. java中无限大_Java 9中的无限集
  7. zip unzip_zip和unzip上的Java要点
  8. vaadin_Vaadin提示:以声明方式构建UI
  9. 使用Maven进行增量构建
  10. Java 11新字符串方法的基准