You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "iris ding (JIRA)" <ji...@apache.org> on 2015/04/27 04:47:39 UTC

[jira] [Created] (CXF-6374) f no OPTIONS defined and has no sub resource, OPTIONS will fails with 404

iris ding created CXF-6374:
------------------------------

             Summary: f no OPTIONS defined and has no sub resource, OPTIONS will fails with 404
                 Key: CXF-6374
                 URL: https://issues.apache.org/jira/browse/CXF-6374
             Project: CXF
          Issue Type: Bug
          Components: JAX-RS
    Affects Versions: 2.7.14, 3.0.3, 3.0.0
            Reporter: iris ding


My resource class is as below:
@Path(value = "/GetTest")
public class HttpMethodGetTest {

	
	@GET
	@Path(value = "/sub")
	public Response getSub() {
		return Response.ok("test")
				.header("MY-HEAD", "sub-text-plain").build();
	}

	@GET
	@Path(value = "/sub")
	@Produces(value = "text/html")
	public Response headSub() {
		return Response.ok("test").header("MY-HEAD", "sub-text-html")
				.build();
	}

	@Path("{id}")
	public int getAbstractResource(@PathParam("id") int id) {
		return 1;
	}

	
}

Then if I send an OPTIONS request to http://localhost:9080/xxxx/GetTest/sub it fails with 404 error.

[WARNING ] javax.ws.rs.NotFoundException: HTTP 404 Not Found
	at org.apache.cxf.jaxrs.utils.SpecExceptions.toNotFoundException(SpecExceptions.java:89)
	at org.apache.cxf.jaxrs.utils.ExceptionUtils.toNotFoundException(ExceptionUtils.java:126)
	at org.apache.cxf.jaxrs.utils.InjectionUtils.handleParameter(InjectionUtils.java:389)
	at org.apache.cxf.jaxrs.utils.InjectionUtils.createParameterObject(InjectionUtils.java:962)
	at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromUriParam(JAXRSUtils.java:1194)
	at org.apache.cxf.jaxrs.utils.JAXRSUtils.createHttpParameterValue(JAXRSUtils.java:877)
	at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:852)
	at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:802)
	at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:259)
	at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:85)
	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
	at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
	at .....
Caused by: java.lang.NumberFormatException: For input string: "sub"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:492)
	at java.lang.Integer.valueOf(Integer.java:582)
	at org.apache.cxf.common.util.PrimitiveUtils.read(PrimitiveUtils.java:60)
	at org.apache.cxf.jaxrs.utils.InjectionUtils.handleParameter(InjectionUtils.java:377)
	... 27 more


After analysis, I found out the problem is  in org.apache.cxf.jaxrs.utils.JAXRSUtils.findTargetMethod,

We can fix this via below change in this method:

if (!candidateList.isEmpty()) {
            Map.Entry<OperationResourceInfo, MultivaluedMap<String, String>> firstEntry =
                            candidateList.entrySet().iterator().next();
            matchedValues.clear();
            matchedValues.putAll(firstEntry.getValue());
            OperationResourceInfo ori = firstEntry.getKey();
            if (headMethodPossible(ori.getHttpMethod(), httpMethod)) {
                LOG.info(new org.apache.cxf.common.i18n.Message("GET_INSTEAD_OF_HEAD",
                                BUNDLE, ori.getClassResourceInfo().getServiceClass().getName(),
                                ori.getMethodToInvoke().getName()).toString());
            }
            if (isFineLevelLoggable) {
                LOG.fine(new org.apache.cxf.common.i18n.Message("OPER_SELECTED",
                                BUNDLE, ori.getMethodToInvoke().getName(),
                                ori.getClassResourceInfo().getServiceClass().getName()).toString());
            }
            if (!ori.isSubResourceLocator()) {
                MediaType responseMediaType = intersectSortMediaTypes(acceptContentTypes,
                                                                      ori.getProduceTypes(),
                                                                      false).get(0);
                message.getExchange().put(Message.CONTENT_TYPE, mediaTypeToString(responseMediaType,
                                                                                  MEDIA_TYPE_Q_PARAM,
                                                                                  MEDIA_TYPE_QS_PARAM));
            }
            //Propsed Change start
            // need to check httpmethod as well for OPTIONS 
            if (!("OPTIONS".equalsIgnoreCase(httpMethod) && ori.getHttpMethod() == null))
            {

                pushOntoStack(ori, matchedValues, message);
                return ori;

            }
            //Proposed Change end
        }





--
This message was sent by Atlassian JIRA
(v6.3.4#6332)