You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by re...@apache.org on 2021/06/22 21:52:36 UTC

[cxf] 01/02: Fixing CXF-8514 & CXF-8515, NPE during ResourceContext contextual injection (#817)

This is an automated email from the ASF dual-hosted git repository.

reta pushed a commit to branch 3.3.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git

commit 5e5352eeb29df607822217c7f0276f6752ece071
Author: Andriy Redko <dr...@gmail.com>
AuthorDate: Mon Jun 21 22:04:01 2021 -0400

    Fixing CXF-8514 & CXF-8515, NPE during ResourceContext contextual injection (#817)
    
    (cherry picked from commit 60752e33639c92f912936c72f836bb1c6e6603f4)
    (cherry picked from commit 179f96b1568b30e728e5bc1e9fb5b0679a844f0d)
---
 .../org/apache/cxf/jaxrs/utils/JAXRSUtils.java     |  5 ++-
 .../systest/jaxrs/JAXRS20ClientServerBookTest.java | 38 +++++++++++++++++++++-
 2 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
index 52a8bf1..5923836 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
@@ -1175,7 +1175,10 @@ public final class JAXRSUtils {
         } else if (ResourceInfo.class.isAssignableFrom(clazz)) {
             o = new ResourceInfoImpl(contextMessage);
         } else if (ResourceContext.class.isAssignableFrom(clazz)) {
-            o = new ResourceContextImpl(contextMessage, contextMessage.getExchange().get(OperationResourceInfo.class));
+            final OperationResourceInfo ori = contextMessage.getExchange().get(OperationResourceInfo.class);
+            if (ori != null) {
+                o = new ResourceContextImpl(contextMessage, ori);
+            }
         } else if (Request.class.isAssignableFrom(clazz)) {
             o = new RequestImpl(contextMessage);
         } else if (Providers.class.isAssignableFrom(clazz)) {
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java
index 3a2e996..9c105a1 100644
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java
@@ -45,6 +45,8 @@ import javax.ws.rs.client.Invocation;
 import javax.ws.rs.client.InvocationCallback;
 import javax.ws.rs.client.ResponseProcessingException;
 import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.container.ResourceContext;
+import javax.ws.rs.core.Context;
 import javax.ws.rs.core.Feature;
 import javax.ws.rs.core.FeatureContext;
 import javax.ws.rs.core.GenericEntity;
@@ -240,6 +242,17 @@ public class JAXRS20ClientServerBookTest extends AbstractBusClientServerTestBase
         assertEquals(124L, book.getId());
 
     }
+    
+    @Test
+    public void testGetBookWebTargetInjectableProvider() {
+        String address = "http://localhost:" + PORT + "/bookstore/bookheaders";
+        Client client = ClientBuilder.newClient();
+        client.register(new BookInfoInjectableReader());
+        BookInfo book = client.target(address).path("simple")
+            .request("application/xml").get(BookInfo.class);
+        assertEquals(124L, book.getId());
+
+    }
 
     @Test
     public void testGetBookSyncWithAsync() {
@@ -1061,9 +1074,31 @@ public class JAXRS20ClientServerBookTest extends AbstractBusClientServerTestBase
 
     }
 
-    private static class BookInfoReader implements MessageBodyReader<BookInfo> {
+    private static class BookInfoInjectableReader implements MessageBodyReader<BookInfo> {
+        @Context private ResourceContext resourceContext;
+
+        @Override
+        public boolean isReadable(Class<?> arg0, Type arg1, Annotation[] arg2, MediaType arg3) {
+            return true;
+        }
 
         @Override
+        public BookInfo readFrom(Class<BookInfo> arg0, Type arg1, Annotation[] anns, MediaType mt,
+                                 MultivaluedMap<String, String> headers, InputStream is) throws IOException,
+            WebApplicationException {
+            
+            if (resourceContext == null) {
+                throw new WebApplicationException("The resourceContext should not be null");
+            }
+            
+            Book book = new JAXBElementProvider<Book>().readFrom(Book.class, Book.class, anns, mt, headers, is);
+            return new BookInfo(book);
+        }
+
+    }
+    
+    private static class BookInfoReader implements MessageBodyReader<BookInfo> {
+        @Override
         public boolean isReadable(Class<?> arg0, Type arg1, Annotation[] arg2, MediaType arg3) {
             return true;
         }
@@ -1077,6 +1112,7 @@ public class JAXRS20ClientServerBookTest extends AbstractBusClientServerTestBase
         }
 
     }
+
     private static class ClientTestFeature implements Feature {
 
         @Override