Статьи

Сервис Camel CXF с несколькими параметрами запроса

В то время как замечательная команда Apache Camel занята исправлением обработки нескольких параметров в запросе, вот обходной путь. Надеюсь, этот пост устареет со следующими версиями Camel. (В настоящее время я использую 2.7.5)

проблема

Параметры запроса больше 1 передаются как  null значение в сервис Camel-CXF. Скажем, если URL имеет четыре параметра запроса, как в

name=arun&email=arun@arunma.com&age=10&phone=123456

только первый из них заполняется при выполнении

нескольких запросов

@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.

Окончательный вывод

Для URL

http://localhost:8181/cxf/karafcxfcamel/search?name=arun&email=arun@arunma.com&age=31&phone=232323

ожидаемый результат:

Временное решение

Интересно, что мы могли бы получить всю строку запроса в заголовке.


QueryStringHeader
1.
String queryString = exchange.getIn().getHeader(Exchange.HTTP_QUERY, String.class);

Мы могли бы тогда сделать


ExtractingParams
MultivaluedMap<String, String> queryMap = JAXRSUtils.getStructuredParams(queryString, "&", false, false);

получить параметры запроса в виде многозначной карты.

Параметры запроса могут затем быть установлены как свойство для  Exchange и использоваться через обмен.

Код

Весь код может быть загружен с  GitHub

Обратите внимание, что я использую Camel как часть OSGi внутри контейнера Karaf. Хотя обходной путь не отличается из-за среды, в которой вы используете Camel-CXF, будьте осторожны с этим фактом при загрузке кода с github. Не упустите план xmls для конфигурации Camel.

Наиболее важной частью здесь является маршрутизатор

маршрутизатор


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);
    @Override
    public 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 {
        @Override
        public 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 requests
    public 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;
    }
}

Ссылка

Список рассылки Camel