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

JAX-RS BeanValidation feature fails with NPE on sub-resource call in JAXRSBeanValidationOutInterceptor

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Duplicate
    • 3.0.4
    • None
    • JAX-RS
    • None
    • Moderate

    Description

      With JAXRSBeanValidationFeature enabled CXF fails to process request to sub-resource with exception like this:

      23:58:16.049 [qtp457732796-28] WARN  o.a.cxf.phase.PhaseInterceptorChain - Interceptor for {http://example.com/}MainResource has thrown exception, unwinding now
      java.lang.NullPointerException: null
          at org.apache.cxf.jaxrs.validation.ValidationUtils.getResourceInstance(ValidationUtils.java:39) ~[cxf-rt-frontend-jaxrs-3.0.4.jar:3.0.4]
          at org.apache.cxf.jaxrs.validation.JAXRSBeanValidationOutInterceptor.getServiceObject(JAXRSBeanValidationOutInterceptor.java:44) ~[cxf-rt-frontend-jaxrs-3.0.4.jar:3.0.4]
          at org.apache.cxf.validation.AbstractValidationInterceptor.handleMessage(AbstractValidationInterceptor.java:60) ~[cxf-core-3.0.4.jar:3.0.4]
          at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307) [cxf-core-3.0.4.jar:3.0.4]
          at org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:83) [cxf-core-3.0.4.jar:3.0.4]
          at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307) [cxf-core-3.0.4.jar:3.0.4]
          at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) [cxf-core-3.0.4.jar:3.0.4]
          at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:251) [cxf-rt-transports-http-3.0.4.jar:3.0.4]
          at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234) [cxf-rt-transports-http-3.0.4.jar:3.0.4]
          at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208) [cxf-rt-transports-http-3.0.4.jar:3.0.4]
          at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160) [cxf-rt-transports-http-3.0.4.jar:3.0.4]
          at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:171) [cxf-rt-transports-http-3.0.4.jar:3.0.4]
          at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:293) [cxf-rt-transports-http-3.0.4.jar:3.0.4]
          at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:217) [cxf-rt-transports-http-3.0.4.jar:3.0.4]
          at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) [javax.servlet-api-3.1.0.jar:3.1.0]
          at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:268) [cxf-rt-transports-http-3.0.4.jar:3.0.4]
          ...
      

      The example resource code:

      @Path("/main")
      public interface MainResource {
          @Path("/sub/{id}")
          SubResource subResource(@PathParam @Size(min=3, max=255) String id);
      }
      
      -----
      
      public interface SubResource {
          @GET
          @Path("/items")
          List<String> items();
      }
      
      GET http://example.com/main/sub/123/items
      

      NPE happens at ValidationUtils.java:39, since resourceProvider retrieved on previous line is null:

          public static Object getResourceInstance(Message message) {
              final OperationResourceInfo ori = message.getExchange().get(OperationResourceInfo.class);
              if (ori == null) {
                  return null;
              }
              final ResourceProvider resourceProvider = ori.getClassResourceInfo().getResourceProvider();
              if (!resourceProvider.isSingleton()) {
                  String error = "Service object is not a singleton, use a custom invoker to validate";
                  LOG.warning(error);
                  return null;
              } else {
                  return resourceProvider.getInstance(message);
              }
      

      This happens only during invocation of JAXRSBeanValidationOutInterceptor and only when calling sub-resources as in example above.

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              kozlovda Dmitry Kozlov
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: