[ 
https://issues.apache.org/jira/browse/CXF-2903?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12902578#action_12902578
 ] 

Sergey Beryozkin commented on CXF-2903:
---------------------------------------

Well, I got a bit confused yesterday while writing that long comment above :-). 
I'm still mostly standing by it, except that there's indeed a bug in CXF 
leading to 404 being returned despite the fact that in the example webapp we 
have a case of

2 path matches
2 produce matches
1 method mismatch (405)
1 consume mismatch (415)

The code like this :

int status;
        
        // criteria matched the least number of times will determine the error 
code;
        // priority : path, method, consumes, produces;
        if (pathMatched <= methodMatched && pathMatched <= consumeMatched && 
pathMatched <= produceMatched) {
            status = 404;
        } else if (methodMatched <= pathMatched && methodMatched <= 
consumeMatched 
            && methodMatched <= produceMatched) {
            status = 405;
        } else if (consumeMatched <= pathMatched && consumeMatched <= 
methodMatched 
            && consumeMatched <= produceMatched) {
            status = 415;
        } else {
            status = 406;
        }

will ensure that in the case of multiple non-matches the least matched criteria 
will be used to determine the error code, so if we have say consumes matching 
only once while the method has been matched twice in the case of two resource 
methods, then 415 will definitely be returned, etc. 

But in this particular case we'll get 405 simply because of the order of 
branches above. Changing the order would make it more precise in this case but 
will likely be less in other cases.

What you can do is to spread methods dealing with GET, PUT, etc across multiple 
root resources.
And, if needed (if such resources have identical class-level @Path value), 
register a custom ResourceComparator as a jaxrs provider :
http://svn.apache.org/repos/asf/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/ResourceComparator.java

which will have a map like this :

"GET" : ReadableRootResource
"PUT" : UpdatableRootResource
etc

and then in the comparator you can get the Message.HTTP_REQUEST_METHOD and 
select the root resource class which will be used to find the resource method.

This will ensure you always get correct 415 or 406 in case of consumes or 
produces non-matches





> Unexpected HTTP response code for @Consumes mismatch
> ----------------------------------------------------
>
>                 Key: CXF-2903
>                 URL: https://issues.apache.org/jira/browse/CXF-2903
>             Project: CXF
>          Issue Type: Bug
>          Components: JAX-RS
>    Affects Versions: 2.2.9, 2.2.10
>            Reporter: Donal Fellows
>         Attachments: example.zip, taverna.log
>
>
> I have an interface with a method annotated as accepting XML (with 
> {...@consumes("application/xml")}} and {...@post}}) and a class that 
> implements that interface; the {...@path}} is not matched for {...@post}} by 
> any other method. When I call it and pass in content with that MIME type, it 
> all works. When I pass in content of another MIME type, I get a 404 response; 
> this is unexpected, as I'd expect a 406 (Not Acceptable) response that tells 
> me to pass in XML (to be clear, this _is_ an error case). Having to work 
> around this by accepting all types and doing my own content type negotiation 
> is unacceptable, especially since that decreases the utility of the generated 
> WADL file significantly. Surely CXF should be doing this sort of work for me?

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to