[ https://issues.apache.org/jira/browse/CXF-6297?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Dmitry Kozlov updated CXF-6297: ------------------------------- Description: With {{JAXRSBeanValidationFeature}} enabled CXF fails to process request to sub-resource with exception like this: {code} 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] ... {code} The example resource code: {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 {code} NPE happens at [ValidationUtils.java:39|https://github.com/apache/cxf/blob/c79696bfc1aee1d1204cbd592f6bc5c83c0d9dae/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/ValidationUtils.java#L39], since {{resourceProvider}} retrieved on previous line is {{null}}: {code:java|firstline=33|highlight=39} 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); } {code} This happens only during invocation of {{JAXRSBeanValidationOutInterceptor}} and only when calling sub-resources as in example above. h3. Partial Workaround The partial workaround is to enable in-interceptor only. But this won't work for people wishing to validate response entities as well. was: With {{JAXRSBeanValidationFeature}} enabled CXF fails to process request to sub-resource with exception like this: {code} 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] ... {code} The example resource code: {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 {code} NPE happens at [ValidationUtils.java:39|https://github.com/apache/cxf/blob/c79696bfc1aee1d1204cbd592f6bc5c83c0d9dae/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/ValidationUtils.java#L39], since {{resourceProvider}} retrieved on previous line is {{null}}: {code:java|firstline=33|highlight=39} 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); } {code} This happens only during invocation of {{JAXRSBeanValidationOutInterceptor}} and only when calling sub-resources as in example above. > JAX-RS BeanValidation feature fails with NPE on sub-resource call in > JAXRSBeanValidationOutInterceptor > ------------------------------------------------------------------------------------------------------ > > Key: CXF-6297 > URL: https://issues.apache.org/jira/browse/CXF-6297 > Project: CXF > Issue Type: Bug > Components: JAX-RS > Affects Versions: 3.0.4 > Reporter: Dmitry Kozlov > > With {{JAXRSBeanValidationFeature}} enabled CXF fails to process request to > sub-resource with exception like this: > {code} > 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] > ... > {code} > The example resource code: > {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 > {code} > NPE happens at > [ValidationUtils.java:39|https://github.com/apache/cxf/blob/c79696bfc1aee1d1204cbd592f6bc5c83c0d9dae/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/ValidationUtils.java#L39], > since {{resourceProvider}} retrieved on previous line is {{null}}: > {code:java|firstline=33|highlight=39} > 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); > } > {code} > This happens only during invocation of {{JAXRSBeanValidationOutInterceptor}} > and only when calling sub-resources as in example above. > h3. Partial Workaround > The partial workaround is to enable in-interceptor only. But this won't work > for people wishing to validate response entities as well. -- This message was sent by Atlassian JIRA (v6.3.4#6332)