Thank you for your reply Sergey, unfortunately while the context is populated,
I get:
java.lang.NullPointerException
at
org.apache.cxf.jaxrs.impl.tl.ThreadLocalHttpServletRequest.getRemoteAddr(ThreadLocalHttpServletRequest.java:223)[119:org.apache.cxf.bundle:2.3.2]
...
So I have a handle to the ThreadLocalHttpServletRequest, but the "get" function
isn't being populated. I've walked the code and the NPE in
ThreadLocalHttpServletRequest at 223 corresponds to the function
public String getRemoteAddr() {
return get().getRemoteAddr();
}
Get is exposed from AbstractThreadLocalProxy:
public T get() {
return infos.get();
}
Is there something I need to do to force my context to be populated?
Thank you again!
Zach Calvert
-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]]
Sent: Tuesday, November 06, 2012 8:13 AM
To: [email protected]
Subject: Re: Obtain CXF Request?
Hi
On 06/11/12 14:02, Calvert, Zach (Zach)** CTR ** wrote:
> I am stuck using Camel CXF 2.6.0 (yes, I know I'm behind) and need to get the
> IP address of the remote system making an HTTP POST to my cxfbean:
> <!-- Define the camel route -->
> <camel:route id="restApis">
> <camel:from
> uri="jetty:{{protocol}}://0.0.0.0:{{port}}/rest/?matchOnUriPrefix=true&handlers=securityHandler"/>
> <camel:to
> uri="cxfbean:restfulService?providers=#restExceptionMapper" />
> <camel:log message="done"/>
> </camel:route>
>
> My restfulService handles the posts. When I turn on tracing, I see
>
> 07:10:29,783 | INFO | qtp26579196-144 | Tracer |
> 76 - org.apache.camel.camel-core - 2.6.0 |
> ID-centora-45480-1352207331927-4-1>>> (restApis)
> from(https://0.0.0.0:9091/rest/?matchOnUriPrefix=true&handlers=securityHandler)
> --> restfulService<<< Pattern:InOut, Headers:{Host=test.com:9091,
> CamelHttpMethod=POST, CamelHttpServletRequest=[POST
> /rest/domain/feed]@19570394 org.eclipse.jetty.server.Request@12a9eda,
> Accept-Encoding=gzip,deflate, CamelHttpServletResponse=HTTP/1.1 200
>
> In my bean I have the function
> @POST
> @Path("{domainName}/{domainChild}")
> @Consumes({MediaType.APPLICATION_RESTMS_XML,
> MediaType.APPLICATION_RESTMS_JSON, MediaType.APPLICATION_XML,
> MediaType.APPLICATION_JSON})
> @Produces({MediaType.APPLICATION_RESTMS_XML,
> MediaType.APPLICATION_RESTMS_JSON, MediaType.APPLICATION_XML,
> MediaType.APPLICATION_JSON})
> public Response post(@PathParam("domainName") String domainName,
> @PathParam("domainChild") String domainChildName,
> JAXBElement<RestXml> restXml) { ...
> }
>
> I have tried to add the parameter Exchange (camel), Exchange (cxf), Message,
> etc all to no avail due to no longer having a mapping for my sample test
> post. I want to know if there is a way for me to access that header
> "CamelHttpServletRequest" inside of this bean's function? My end goal is
> simply to get the HttpRequest or ServletRequest or whatever request that will
> have the "getRemoteAddress" function exposed on it. I've been through the
> jaxrs core annotations and cannot seem to figure out how to get a handle to
> the original incoming request, or any context object that may contain the IP
> address of whoever is making the call to my servlet. I thought maybe UriInfo
> or Request (from javax.ws.rs.core) contexts would have the info I'm looking
> for, but if they do, I can't figure them out.
>
> I have also looked at building a custom provider, but I can't figure out how
> to build one that not only gets the IP address, but manages to provide it
> along the route to my cxfbean. Is there a way I can do something like get
> the IP and then set it as a QueryParam for my bean to consume?
>
> Any and all help would be greatly appreciated!
>
Injection "@Context HttpServletRequest" into the bean itself is one option.
Another one is to inject it into a RequestFilter provider and update (CXF)
Message.QUERY_STRING accordingly - this will let you add
@QueryParam("remoteip") to the method signature
HTH, Sergey
>
> Thanks,
> Zach Calvert
>
--
Sergey Beryozkin
Talend Community Coders
http://coders.talend.com/
Blog: http://sberyozkin.blogspot.com