Hi Sergey,
Actually, the ';foo=321' is something the service does not use. It is
just something that needs to be appended to the URI to make the hardware
work. Something to do with the mobile phone being used.
Currently, the work around we use is to prepend it with '&' like the
following:
barID=1234&;foo=321
barID gets processed properly, the rest gets dropped since it is not
needed. Just giving a shout out if its possible to support other
recommended delimiters. Just in case we get clients that insist on using
them. :)
Thanks again,
Gabo
Sergey Beryozkin wrote:
I'm assuming it is
http://1.1.1.1/Bar?barID=1234;foo=321
Yeah, I can see ';' is recommended to be supported, not required. Some
property can be added to facilitate it.
in meantime, please try
http://1.1.1.1/Bar;barID=1234;foo=321
and use @MatrixParam("barID").
if you must use
http://1.1.1.1/Bar?barID=1234;foo=321
then replace a Message.QUERY_STRING in a request filter by replacing ';'
with '?' in the original query
<http://1.1.1.1/Bar/barID=1234;foo=321>cheers, Sergey
On Wed, Jun 23, 2010 at 8:04 AM, Gabo Manuel <[email protected]>wrote:
Hi All,
This is something we encountered by accident while trying to create a
client for mobile. Given the following:
@GET
@Path("/Bar/")
public Bar getBar(
@QueryParam("barID")
@WebParam(name="barID")
long barID)
throws Exception;
I invoke the following:
http://1.1.1.1/Bar/barID=1234;foo=321
I encounter the following:
Problem encountered: java.lang.NumberFormatException: For input
string: "1234;foo"
*
org.apache.cxf.jaxrs.utils.InjectionUtils.handleParameter(InjectionUtils.java:295)
*
org.apache.cxf.jaxrs.utils.InjectionUtils.createParameterObject(InjectionUtils.java:691)
*
org.apache.cxf.jaxrs.utils.JAXRSUtils.readQueryString(JAXRSUtils.java:885)
*
org.apache.cxf.jaxrs.utils.JAXRSUtils.createHttpParameterValue(JAXRSUtils.java:603)
*
org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:573)
*
org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:527)
*
org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:230)
*
org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:88)
*
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:243)
*
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:110)
*
org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:98)
*
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:423)
*
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:139)
*
org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:142)
*
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179)
*
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:108)
* javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
*
org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159)
*
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
*
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
*
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
*
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
*
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
*
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
*
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
*
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
*
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
*
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
* org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
* java.lang.Thread.run(Thread.java:595)
Caused by: For input string: "1234;foo"
*
java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
* java.lang.Long.parseLong(Long.java:412)
* java.lang.Long.valueOf(Long.java:518)
* org.apache.cxf.common.util.PrimitiveUtils.read(PrimitiveUtils.java:69)
*
org.apache.cxf.jaxrs.utils.InjectionUtils.handleParameter(InjectionUtils.java:286)
*
org.apache.cxf.jaxrs.utils.InjectionUtils.createParameterObject(InjectionUtils.java:691)
*
org.apache.cxf.jaxrs.utils.JAXRSUtils.readQueryString(JAXRSUtils.java:885)
*
org.apache.cxf.jaxrs.utils.JAXRSUtils.createHttpParameterValue(JAXRSUtils.java:603)
*
org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:573)
*
org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:527)
*
org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:230)
*
org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:88)
*
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:243)
*
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:110)
*
org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:98)
*
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:423)
*
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:139)
*
org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:142)
*
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179)
*
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:108)
* javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
*
org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159)
*
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
*
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
*
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
*
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
*
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
*
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
*
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
*
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
*
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
*
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
* org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
* java.lang.Thread.run(Thread.java:595)
It seems CXF did not treat ';' as a valid query delimeter. Given that it is
not part of the generic syntax, but the value to be converted did not
include '=321' which indicates that '=' was considered as delimiter. ';' and
'=' are, in a sense, of the same level with regards to being a URI
delimiter.
Or I am completely missing a point. =D RFC's has too many words I have
trouble digesting...
Gabo
Reference: http://www.ietf.org/rfc/rfc3986.txt, section 2.2