camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Calvert, Zach (Zach)** CTR **" <zcalv...@motive.com>
Subject RE: Obtain CXF Request?
Date Tue, 06 Nov 2012 14:40:39 GMT
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:sberyozkin@gmail.com] 
Sent: Tuesday, November 06, 2012 8:13 AM
To: users@camel.apache.org
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&amp;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

Mime
View raw message