Hi Gabo
according to this table, what happens is that when you specify a Content-Type (application/xml) which does not match the one
used by the resource class (text/xml), you see a @GET annotated getMyObject() invoked for borth PUT and POST invocations on
tomcat/iplanet but not on jetty. Moreover, in the interceptor you can see that it is still PUT/POST but in the method it
suddenly becomes GET...If you specify a correct content type (text/xml) then all works as expected.
This is quite unusual to say the least :-). JAXRSInInterceptor can reset the HTTP method, but only if the following conditions
are true :
- X-HTTP-Method-Override header has been set, ex, you have issued POST but X-HTTP-Method-Override=GET has been added either at
the client side or by the server-side admin filter
- _method=GET query has been added to the request URI
RequestPreprocessor is the only place where it might happen. Can you verify please neither X-HTTP-Method-Override header nor
_method query are available ?
The other confusing bit is that this method substitution occurs only if we have an application/xml vs text/xml case. This does
not quite make sense. I'll try to rerun the test on Tomcat (like yourself, I confirmed it was working ok on Jetty). I feel
though that if you could just download the CXF source and debug it then it would be the fastest way forward. It is very likely
there's some production-specific condition that is afffecting it all which I won't be able to reproduce locally
thanks, Sergey
----- Original Message ----- From: Gabo Manuel To: users@cxf.apache.org
Sent: Thursday, January 28, 2010 6:47 AM
Subject: Re: [Fwd: Re: [CXF-2.2.5][Spring2.5.5][jre1.5] No mapped method]
Hi Sergey,
Some corrections:
payload type http method jetty tomcat iplanet submitted interceptor method invoked http method on invoke method
invoked http method on invoke method invoked http method on invoke application/xml PUT PUT error: no method mapped n/a
getMyObject GET 401 n/a text/xml PUT PUT insertMyObject PUT insertMyObject PUT 401 n/a application/xml POST POST
error: no method mapped n/a getMyObject GET 401 n/a text/xml POST POST updateMyObject POST updateMyObject POST
updateMyObject POST
Gabo
Gabo Manuel wrote:
----------------------------------------------------------------------------
Subject: Re: [CXF-2.2.5][Spring2.5.5][jre1.5] No mapped method From: Gabo Manuel <kman...@solegysystems.com>
Date: Thu, 28 Jan 2010 06:44:21 +0000 To: users@cxf.apache.org To: users@cxf.apache.org
Hi Sergey,
I added the following details:
1. I have the interceptor that processes the authentication details display
the http method.
2. I have the methods display the http method
The code I used to retrieve the method is as follows:
PhaseInterceptorChain.getCurrentMessage().getExchange().getInMessage().get(Message.HTTP_REQUEST_METHOD)
The result:
payload type http method jetty tomcat iplanet submitted interceptor method invoked http method on invoke
method invoked http method on invoke method invoked http method on invoke application/xml PUT PUT error: no method mapped n/a
getMyObject GET 401 n/a text/xml PUT PUT insertMyObject PUT insertMyObject PUT 401 n/a application/xml POST
POST error: no method mapped n/a POST GET 401 n/a text/xml POST POST updateMyObject POST updateMyObject POST
updateMyObject POST
where Jetty is as the supplied server class in the previously posted
archive.
Gabo
Sergey Beryozkin wrote: I did a quick test by creating a servlet based endpoint (using MyService, MyServiceImpl,
MyObject and SearchFilter from the test.zip) and POSTing a MyObject instance to it and I got a POST-annotated
MyServiceImpl.updateMyObject invoked...
Not sure how you see a @GET-annotated method invoked. The code responsible for the selection compares the HTTP methods
(the actual request verb and the one which is accociated with a given method through @GET, etc).
Please do some debugging and let me know what you've found, ex, add a breakpoint in JAXRSInInterceptor and see how an
operation is being selected.
cheers, Sergey
Hi Gabo
Hi Sergey,
Sorry for the troubles. It's a red herring, something to do with the securities set by our Sys Admin. I see the the
transactions recorded as:
222.127.215.98 - - [25/Jan/2010:04:40:53 +0000] "POST /MyService/?comment=test HTTP/1.1" 401 0
222.127.215.98 - - [25/Jan/2010:04:40:53 +0000] "POST /MyService/?comment=test HTTP/1.1" 400 116
But the transaction still goes into my app. It is just odd that even if the interceptor retrieves the HttpMethod as
POST, the method selection somehow gets a GET:
So do you still get a @GET annotated method invoked even when HttpMethod=POST ? Does not look like a red herring
to me :-).
2010-01-25 04:40:53,397 [INFO ][ee-2][ RestInHandler] - exchange at end:
{password=89f2b9fbd6c6b2c0e5ab90ce18adc0e9, org.apache.cxf.binding.binding=org.apache.cxf.binding.xml.xmlbind...@192322e,
HttpMethod=POST, transactiosnType=ReST, org.apache.cxf.bus=org.apache.cxf.bus.cxfbusi...@11ca33b, ...
Again, my apologies for this.
No problems :-), I'm still confused a bit. Is the resource class code you posted in the first message of this thread
close enough to the actual code that you use ? I'd like to do a test and see what is being invoked...
thanks, Sergey
Gabo
Sergey Beryozkin wrote:
Hi
Hi All,
Found the cause for most. Still an odd error though. So here is
the cause:
The service explicitely says @Consumes("text/xml") , while my
client specified:
RequestEntity re = new FileRequestEntity( new File("somefile.txt"),
"application/xml; charset=ISO-8859-1");
After changing this to text/xml. POST and DELETE succeeded.
OK...
Remaining issue:
1. Why was no exception thrown? 2. Why did it
revert to GET?
I'll need some help here. Can you verify it is GET ? Any chance you can attach a simple test case to a JIRA ?
I honestly do not see POST being mapped to GET happening....Does request get modified somehow by some interceptor ?
cheers, Sergey
3. PUT still requires that basic authentication, although I would be checking with our SysAdmin. I think this
would be server specific.
Gabo