Uploaded image for project: 'CXF'
  1. CXF
  2. CXF-7456

empty query string injects into enum type will lead 404 error

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Won't Fix
    • 3.1.11
    • None
    • Core, JAX-RS
    • None
    • Unknown

    Description

      This issue is similar to CXF-7307.

      The http request:
      GET /demo-provider/v1.0/users/beanparam?a= HTTP/1.1
      HOST: localhost:8080
      accept: application/json
      content-type: application/json

      The resource method returns null:
      public String beanParam(@QueryParam("a") MyEnum a)

      { return ""+a; }

      javax.ws.rs.ClientErrorException: HTTP 404 Not Found

      {{
      2017-07-27 14:51:34.325 [Default Executor-thread-117] DEBUG d.k.i.a.e.h.WebApplicationExceptionHandler toResponse[30]: Build webapplication error response [exceptionMessage=HTTP 404 Not Found]
      javax.ws.rs.WebApplicationException: HTTP 404 Not Found
      at org.apache.cxf.jaxrs.utils.InjectionUtils.evaluateFactoryMethods(InjectionUtils.java:546)
      at org.apache.cxf.jaxrs.utils.InjectionUtils.handleParameter(InjectionUtils.java:457)
      at org.apache.cxf.jaxrs.utils.InjectionUtils.injectIntoCollectionOrArray(InjectionUtils.java:931)
      at org.apache.cxf.jaxrs.utils.InjectionUtils.createParameterObject(InjectionUtils.java:1003)
      at org.apache.cxf.jaxrs.utils.JAXRSUtils.readQueryString(JAXRSUtils.java:1192)
      at org.apache.cxf.jaxrs.utils.JAXRSUtils.createHttpParameterValue(JAXRSUtils.java:868)
      at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:838)
      at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:789)
      at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:212)
      at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:77)
      at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
      at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
      at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:262)
      at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)
      at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)
      at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)
      at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:180)
      at de.CXFServlet.invoke(CXFServlet.java:71)
      at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:299)
      at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:223)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:575)
      at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:274)
      at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1290)
      ...
      at java.lang.Thread.run(Thread.java:745)
      Caused by: java.lang.IllegalArgumentException: No enum constant de.MyEnum.
      at java.lang.Enum.valueOf(Enum.java:236)
      at de.MyEnum.valueOf(EndpointType.java:1)
      at sun.reflect.GeneratedMethodAccessor1111.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java)
      at java.lang.reflect.Method.invoke(Method.java:606)
      at org.apache.cxf.jaxrs.utils.InjectionUtils.evaluateFactoryMethod(InjectionUtils.java:560)
      at org.apache.cxf.jaxrs.utils.InjectionUtils.evaluateFactoryMethods(InjectionUtils.java:527)
      ... 51 common frames omitted
      }}

      org.apache.cxf.jaxrs.utils.InjectionUtils.handleParameter(String, boolean, Class<T>, Type, Annotation[], ParameterType, Message)
      -> calls org.apache.cxf.jaxrs.utils.InjectionUtils.evaluateFactoryMethods(String, ParameterType, Object, Class<?>, String[])
      using "fromString", "fromValue", "valueOf"
      -> evaluateFactoryMethods continues with next method, if the first method returns null
      -> as "fromString" returns "null" now (it is implemented), "fromValue" does not exists, it calls "valueOf" and that one cannot handle null, empty or blank Strings
      -> and even, if evaluateFactoryMethods would return null, the handleParameter contains this check, that forbids null:
      — SNIP —
      if (result == null)

      { reportServerError("WRONG_PARAMETER_TYPE", pClass.getName()); }

      — SNAP —

      Attachments

        Activity

          People

            sergey_beryozkin Sergey Beryozkin
            Michael D. Michael Decker
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: