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

camel 多个 to

出色的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());}}}
}

接口

休息服务

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 多个 to

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

select * from where 三个条件_VBA学习笔记70: Select语句基础

学习资源:《Excel VBA从入门到进阶》第72集 by兰色幻想 这节课来详细讲解Select语句。 Select 字段 from 表 where 条件 例:从sheet1中筛选全部数据。 * 表示全部字符,无条件可以省略where。 Select * from [sheet1$] 如果是对表中特定单元格区域进行查找,可以在[sheet1$]的…

使用Servlet和Bootstrap上传Ajax文件

介绍 在本教程中&#xff0c;我们将检查Ajax文件上传如何与Servlet一起使用。 同样&#xff0c;我们将用Bootstrap装饰表单并通过jQuery Ajax上传ajaxify文件。 实作 基本的servlet实现是相同的。 因此&#xff0c;我们需要做的第一件事是更新我们的web.xml文件并为我们的应用…

linux文件系统dentry_Linux文件系统(四)---三大缓冲区之inode缓冲区 (内存inode映像 )...

在文件系统中&#xff0c;有三大缓冲为了提升效率&#xff1a;inode缓冲区、dentry缓冲区、块缓冲。(内核&#xff1a;2.4.37)一、inode缓冲区为了加快对索引节点的索引&#xff0c;引入inode缓冲区&#xff0c;下面我们看Linux/fs/inode.c代码。inode缓冲区代码1、一些数据结构…

java 快死了_如果Java快死了,那么它肯定看起来非常健康

java 快死了Java快要死了的奇怪但流行的断言只能在没有证据的情况下提出&#xff0c;而不是因为它。 在酷孩子闲逛的论坛&#xff08;Hacker News&#xff0c;Reddit等&#xff09;中反复出现的偏见与Java语言背道而驰。 人们常常反复感叹 Java冗长而流行。 虽然我接受第一个描…

python函数调用时所提供的参数可以是变量吗_Python函数一章,关于变量参数调用(何时使用*)记录,pytho,章节,可变,的,什么,时候...

关于可变参数调用def bmi(*person):for list_person in person:for item in list_person:…这个&#xff0c;调用时&#xff0c;不需要带*bmi(list1,list2…)def bmi(*person):for item in person:…这个调用时&#xff0c;需要带*bmi(*list1&#xff0c;*list2)注&#xff1a;…

使用这些先进的GC技术提高应用程序性能

应用程序性能是我们的首要考虑因素&#xff0c;垃圾收集优化是取得小而有意义的进步的好地方 自动化垃圾收集&#xff08;与JIT HotSpot编译器一起&#xff09;是JVM中最先进&#xff0c;最有价值的组件之一&#xff0c;但是许多开发人员和工程师对垃圾收集&#xff08;GC&a…

2mysql_2.Mysql常用命令行大全

7.1 一个建库和建表的实例1drop database if exists school; //如果存在SCHOOL则删除create database school; //建立库SCHOOLuse school; //打开库SCHOOLcreate table teacher //建立表TEACHER(id int(3) auto_increment not null primary key,name char(10) not null,address…

JDK 11的一般可用性

按照计划&#xff0c; 今天宣布将发布 JDK 11 &#xff0c;以实现一般可用性 。 本周初&#xff0c;Iris Clark宣布了“ JSR 384&#xff08;Java SE 11&#xff09;最终发行版 ”&#xff0c;并且在同一封邮件中引用了JSR 384的最终发行版&#xff0c;并引用了“ Java SE 11&a…

mysql中lead_SqlServer2012中LEAD函数简单分析_MySQL

LEAD函数简单点说&#xff0c;就是把下一行的某列数据提取到当前行来显示&#xff0c;看示例更能解释清楚&#xff0c;先看测试用脚本DECLARE TestData TABLE(ID INT IDENTITY(1,1),Department VARCHAR(20),LastName VARCHAR(20),Rate FLOAT)INSERT INTO TestData(Department,L…

堆栈溢出回答了我们不知道的Java首要问题

您不应该错过的堆栈溢出问题集合&#xff1a; 这不是秘密&#xff1b; 我们都使用堆栈溢出。 它掌握了生命&#xff0c;宇宙以及几乎所有与代码相关的内容的答案。 该平台为开发人员&#xff0c;工程师和其他人员提供了一个找到他们所面临问题的答案的地方&#xff0c;或者至少…

sequelize连接mysql_node.js通过Sequelize 连接MySQL

node.js通过Sequelize 连接MySQL一.通过koa2脚手架构建项目1.1 安装koa-generator在终端输入&#xff1a;$ npm install -g koa-generator11.2 使用koa-generator生成koa2项目$ koa2 HelloKoa21成功创建项目后&#xff0c;进入项目目录&#xff0c;并执行npm install命令$ cd H…

杀java_java怎么杀掉java进程

展开全部java中有调用外部程序的e69da5e887aa62616964757a686964616f31333337623431类&#xff0c;Runtime.getRuntime().exec("./**.exe");此函数返回的是一个Process 对象&#xff0c;该对象在创建后&#xff0c;可以对它进行 destroy () 杀掉子进程、 waitFor () …

高级java开发_我最喜欢的Java高级开发人员书籍

高级java开发我上一篇博客文章 &#xff08;我对高级Java开发人员的十个最喜欢的在线资源&#xff09;的想法&#xff0c;是由Xiaoran Wang发表的“面向高级Java开发人员的十大网站”的启发。 Wang还写了一篇名为“面向Java高级开发人员的十大书籍”的文章。 就像关于高级Java开…

Optional.isEmpty()在JDK 11 EA构建中可用

我最近发布的问题“ Optional.isEmpty&#xff08;&#xff09;即将加入Java吗&#xff1f; ”是由名为“ RFR&#xff1a;8184693 &#xff1a;&#xff08;选择&#xff09;添加Optional.isEmpty ”的core-libs-dev邮件列表帖子提示的。 当前的JDK 11 Early Access构建 &…

camera.swf java_java调用摄像头保存图片上传功能

在项目中要用到jsp页面实现网页采集摄像头图像&#xff0c;并实现上传的功能&#xff0c;页面主要js调用的&#xff0c;所以可以使用多种语言php,asp等都可以使用&#xff0c;而且是跨浏览器的。可以整合的到SSH项目中和struts1或者struts2项目中使用方法1&#xff1a;下载 pri…

java list 字段去重_如何实现java8 list按照元素的某个字段去重

list 按照元素的某个字段去重DataAllArgsConstructorNoArgsConstructorpublic class Student {private Integer age;private String name;}测试数据List studentList Lists.newArrayList();studentList.add(new Student(28, "river"));studentList.add(new Student(…

cassandra使用心得_使用Cassandra和Nutch爬网

cassandra使用心得因此&#xff0c;您想从互联网上收集大量数据吗&#xff1f; 有什么比Cassandra更好的存储机制&#xff1f; 使用Nutch可以轻松做到这一点。 人们经常在Nutch后面使用Hbase。 这可行&#xff0c;但是如果您是&#xff08;或想成为&#xff09;Cassandra商店&…

java 北理工 教材_北理工《Java技术与应用》在线作业

北理工《Java技术与应用》在线作业可以代做所有奥鹏平台的作业、小论文、毕业论文、离线作业、考核作业、在线作业、在线测试&#xff0c;有需要的请联系本人一、单选题(共 20 道试题&#xff0c;共 40 分。)V1. Socket对象中____函数获取远程端口。A. getPort( )B. getLocalPo…

占用内存的Enum.values()方法

我是Java 枚举的忠实拥护者 。 似乎我们一直在等待获得它&#xff0c;但是当我们最终获得它&#xff08; J2SE 5 &#xff09;时&#xff0c;该枚举比C和C 提供的枚举要好得多&#xff0c;在我看来&#xff0c;这“ 值得等待” 。 与Java enum一样好&#xff0c;它也不是没有问…

Apache Spark Job的剖析

Apache Spark是通用的大规模数据处理框架。 了解spark如何执行作业对于获取大部分作业非常重要。 关于Spark评估范式的简短回顾&#xff1a;Spark使用的是惰性评估范式&#xff0c;在该范式中&#xff0c;Spark应用程序在驱动程序调用“ Action”之前不会执行任何操作。 惰性…