В то время как замечательная команда 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 protected]&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 ; } } |