0

For some reason, the second and the subsequent Query Parameters are just null. The first one works perfectly fine. I am using Camel+JAX-RS (CXF). This is just a GET request. The URL I am using is

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

Here is my Interface declaration

@Path("search") public interface 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 );

Implementation

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

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

The q parameter comes in fine as health but the start and the size parameters are just null. Surprisingly, the default values aren't getting picked up too.

I am afraid I am doing something wrong in my camel routing.

Router

@Override
public void configure() throws Exception {

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

Thanks for your time :-)

Arun Manivannan
  • 4,213
  • 3
  • 29
  • 38

1 Answers1

0

The Camel team is working on fixing this issue in the near future. Until then use the following workaround.

You could get the entire query string as follows

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

//would return something like : q=health&start=100&size=924

Interface

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

Implementation - Target method

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); 

Router

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); 

        } 

    } 
} 

More details here : http://camel.465427.n5.nabble.com/JAX-RS-and-Camel-Except-1st-QueryParameter-all-others-are-null-tt5742470.html

Arun Manivannan
  • 4,213
  • 3
  • 29
  • 38