日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 具有多个查询参数的Camel CXF服务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

出色的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服务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。