[ https://issues.apache.org/jira/browse/CXF-6374?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14514127#comment-14514127 ]
iris ding commented on CXF-6374: -------------------------------- Hi Sergey, see Spec 3.3.5 HEAD and OPTIONS: On receipt of an OPTIONS request an implementation MUST either: 1. Call a method annotated with a request method designator for OPTIONS or, if none present, 2. Generate an automatic response using the metadata provided by the JAX-RS annotations on the matching class and its methods. My CTS test should go to #2, no OPTIONS defined. in such case, we should not give a 404. > If no OPTIONS defined , OPTIONS request will fail with 404 > ---------------------------------------------------------- > > Key: CXF-6374 > URL: https://issues.apache.org/jira/browse/CXF-6374 > Project: CXF > Issue Type: Bug > Components: JAX-RS > Affects Versions: 3.0.0, 3.0.3, 2.7.14 > Reporter: iris ding > Assignee: Sergey Beryozkin > Fix For: 3.1.0, 3.0.5 > > > 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)