В то время как замечательная команда Apache Camel занята исправлением обработки нескольких параметров в запросе, вот обходной путь. Надеюсь, этот пост устареет со следующими версиями Camel. (В настоящее время я использую 2.7.5)
проблема
Параметры запроса больше 1 передаются как null значение в сервис Camel-CXF. Скажем, если URL имеет четыре параметра запроса, как в
|
1
|
name=arun&email=arun@arunma.com&age=10&phone=123456 |
только первый заполняется, когда вы делаете:
MultiQueryParams
|
1
2
3
4
5
6
|
@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
|
1
|
MultivaluedMap<String, String> queryMap = JAXRSUtils.getStructuredParams(queryString, "&", false, false); |
получить параметры запроса в виде многозначной карты.
Параметры запроса могут быть затем установлены в качестве свойства для Exchange и использованы во время обмена.
Код
- Весь код может быть загружен с GitHub
Обратите внимание, что я использую Camel как часть OSGi внутри контейнера Karaf. Хотя обходной путь не отличается в зависимости от среды, в которой вы используете Camel-CXF, будьте осторожны с этим фактом при загрузке кода с github. Не упустите план xmls для конфигурации Camel.
Наиболее важной частью здесь является маршрутизатор
маршрутизатор
RestToBeanRouter
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
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
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
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
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
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; }} |
