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 2022/11/06 14:37:27 UTC

[cxf] branch 3.4.x-fixes updated: CXF-8785: Make Jsonb lazy initializable in the JsrJsonbProvider

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

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


The following commit(s) were added to refs/heads/3.4.x-fixes by this push:
     new 79dfce65c5 CXF-8785: Make Jsonb lazy initializable in the JsrJsonbProvider
79dfce65c5 is described below

commit 79dfce65c516fbe2fffdf8e1e08044885b051eeb
Author: Andriy Redko <dr...@gmail.com>
AuthorDate: Sat Nov 5 12:32:09 2022 -0400

    CXF-8785: Make Jsonb lazy initializable in the JsrJsonbProvider
    
    (cherry picked from commit eac13c71f065fbf384aecfc54992140de7b8ae02)
    (cherry picked from commit f2721d3ae67c9ed35064729a85f60e243905990e)
---
 .../jaxrs/provider/jsrjsonb/JsrJsonbProvider.java  | 34 +++++++++++++++++++---
 1 file changed, 30 insertions(+), 4 deletions(-)

diff --git a/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/jsrjsonb/JsrJsonbProvider.java b/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/jsrjsonb/JsrJsonbProvider.java
index 621d667c8a..2c4a037904 100644
--- a/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/jsrjsonb/JsrJsonbProvider.java
+++ b/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/jsrjsonb/JsrJsonbProvider.java
@@ -31,11 +31,14 @@ import javax.json.bind.JsonbBuilder;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.ContextResolver;
 import javax.ws.rs.ext.MessageBodyReader;
 import javax.ws.rs.ext.MessageBodyWriter;
 import javax.ws.rs.ext.Provider;
+import javax.ws.rs.ext.Providers;
 
 import org.apache.cxf.jaxrs.utils.ExceptionUtils;
 
@@ -54,9 +57,17 @@ import org.apache.cxf.jaxrs.utils.ExceptionUtils;
 @Provider
 public class JsrJsonbProvider implements MessageBodyReader<Object>, MessageBodyWriter<Object> {
     private final Jsonb jsonb;
+    @Context private Providers providers;
+
+    /**
+     * Create and capture only singleton instance of the Jsonb, if needed.
+     */
+    private static class DefaultJsonbSupplier {
+        private static final Jsonb INSTANCE = JsonbBuilder.create();
+    }
      
     public JsrJsonbProvider() {
-        this(JsonbBuilder.create()); 
+        this(null); 
     }
     
     public JsrJsonbProvider(Jsonb jsonb) {
@@ -72,7 +83,7 @@ public class JsrJsonbProvider implements MessageBodyReader<Object>, MessageBodyW
     public void writeTo(Object t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType,
             MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) 
                 throws IOException, WebApplicationException {
-        jsonb.toJson(t, type, entityStream);
+        jsonbFor(type).toJson(t, type, entityStream);
     }
 
     @Override
@@ -86,9 +97,9 @@ public class JsrJsonbProvider implements MessageBodyReader<Object>, MessageBodyW
                 throws IOException, WebApplicationException {
         try {
             if (genericType == null) {
-                return jsonb.fromJson(entityStream, type);
+                return jsonbFor(type).fromJson(entityStream, type);
             } else {
-                return jsonb.fromJson(entityStream, genericType);
+                return jsonbFor(type).fromJson(entityStream, genericType);
             }
         } catch (JsonException ex) {
             throw ExceptionUtils.toBadRequestException(ex, null);
@@ -105,4 +116,19 @@ public class JsrJsonbProvider implements MessageBodyReader<Object>, MessageBodyW
         }
     }
 
+    private Jsonb jsonbFor(Class<?> type) {
+        if (providers != null) {
+            final ContextResolver<Jsonb> contextResolver = providers
+                .getContextResolver(Jsonb.class, MediaType.APPLICATION_JSON_TYPE);
+            if (contextResolver != null) {
+                return contextResolver.getContext(type);
+            }
+        }
+
+        if (jsonb != null) {
+            return jsonb;
+        } else {
+            return DefaultJsonbSupplier.INSTANCE;
+        }
+    }
 }