On 06/11/12 14:53, Calvert, Zach (Zach)** CTR ** wrote:
Unfortunately no, I'm stuck in 2.6.0. Are there any other options exposed for
obtaining caller's IP address?
Thank you again, your help is very much appreciated!
It's a question to Camel experts at this stage :-)
Cheers, Sergey
Thanks,
Zach
-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]]
Sent: Tuesday, November 06, 2012 8:52 AM
To: [email protected]
Subject: Re: Obtain CXF Request?
On 06/11/12 14:40, Calvert, Zach (Zach)** CTR ** wrote:
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.getRemoteAd
dr(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?
I think HttpServletRequest has to be visible to CXF endpoints starting from
Camel 2.10.2, as well the as the latest 2.9.x. Are you working with the older
version ?
Cheers, Sergey
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