0

出于某种原因,第二个和后续的查询参数只是空的。第一个工作得很好。我正在使用 Camel+JAX-RS (CXF)。这只是一个 GET 请求。我使用的网址是

http://localhost:8181/cxf/coreservices/search?q=health&start=100&size=924

这是我的接口声明

@Path("search") 公共接口 SearchRestService {

@GET
@Produces(MediaType.APPLICATION_JSON)
public String searchGet(@QueryParam ("q") String q, @DefaultValue("0") @QueryParam("start") String start, @DefaultValue("10") @QueryParam("size") String size );

执行

public SearchResult<WikiSearchHit> searchGet(String q, String start, String size){

    logger.info("Inside wiki GET method: " +q + " start:"+start + " size:"+ size);

q参数很好,health但 start 和 size 参数只是空的。令人惊讶的是,默认值也没有被采用。

恐怕我在骆驼路线上做错了什么。

路由器

@Override
public void configure() throws Exception {

    from("cxfrs://bean://rsServer?bindingStyle=SimpleConsumer")
            .multicast()
            .parallelProcessing()
            .aggregationStrategy(new CoreSearchResponseAggregator())
            .beanRef("searchRestServiceImpl", "searchGet")
             ...

谢谢你的时间 :-)

4

1 回答 1

0

Camel 团队正在努力在不久的将来解决这个问题。在此之前,请使用以下解决方法。

您可以按如下方式获取整个查询字符串

字符串查询 = exchange.getIn().getHeader(Exchange.HTTP_QUERY, String.class);

//会返回类似:q=health&start=100&size=924

界面

@GET 
@Path("search") 
@Produces(MediaType.APPLICATION_JSON) 
public String searchGet(); 

实现 - 目标方法

public SearchResult<WikiSearchHit> wikiGet(Exchange exchange){

        String q = exchange.getIn().getHeader("q", String.class); 
        String size = exchange.getIn().getHeader("size", String.class); 
        String start = exchange.getIn().getHeader("start", String.class); 

路由器

public class RestToBeanRouter extends RouteBuilder { 

    @Override 
    public void configure() throws Exception { 

        from("cxfrs://bean://rsServer?bindingStyle=SimpleConsumer") 
                .process(new ParameterProcessor()) 
                .removeHeaders("CamelHttp*") 
                .multicast() 
                .parallelProcessing() 
                .aggregationStrategy(new CoreSearchResponseAggregator()) 
                .beanRef("searchRestServiceImpl", "wikiGet") 
                .... 
                .end() 
                .marshal().json(JsonLibrary.Jackson); 
        //.to("log://camelLogger?level=TRACE"); 

    } 


    class ParameterProcessor implements Processor { 
        @Override 
        public void process(Exchange exchange) throws Exception { 

            Map<String, String> stringStringMap = convertQueryStringAsMap(exchange.getIn().getHeader(Exchange.HTTP_QUERY, String.class)); 

            //System.out.println("stringStringMap = " + stringStringMap); 

            for (Map.Entry<String, String> eachParamEntry : stringStringMap.entrySet()) { 
                exchange.getIn().setHeader(eachParamEntry.getKey(), eachParamEntry.getValue()); 
            } 
        } 


        private Map<String,String> convertQueryStringAsMap(String queryString){ 

            //some Guava magic 
            return Splitter.on("&").omitEmptyStrings().trimResults().withKeyValueSeparator("=").split(queryString); 

        } 

    } 
} 

更多细节在这里: http ://camel.465427.n5.nabble.com/JAX-RS-and-Camel-Except-1st-QueryParameter-all-others-are-null-tt5742470.html

于 2013-11-01T15:15:11.490 回答