具有多个查询参数的Camel CXF服务
生活随笔
收集整理的這篇文章主要介紹了
具有多个查询参数的Camel CXF服务
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
出色的Apache Camel團隊忙于解決查詢中多個參數的處理問題,這是一種解決方法。 希望該帖子將在下一版本的Camel中變得過時。 (當前,我使用2.7.5)
問題
大于1的查詢參數作為null值傳遞給Camel-CXF服務。 假設網址中有四個查詢參數,例如
執行以下操作時,只會填充第一個:
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;}
}資源資源
- 駱駝郵件列表問題
翻譯自: https://www.javacodegeeks.com/2013/11/camel-cxf-service-with-multiple-query-parameters.html
總結
以上是生活随笔為你收集整理的具有多个查询参数的Camel CXF服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑蓝屏的解决办法电脑蓝屏如何处理
- 下一篇: 如何关闭开机启动项如何关闭电脑开机声音