You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by GitBox <gi...@apache.org> on 2019/01/15 20:35:57 UTC

[cxf] Diff for: [GitHub] coheigea merged pull request #487: Ensure JAXB and javax.activation are not required for JAX-RS

diff --git a/core/src/main/java/org/apache/cxf/service/model/EndpointInfo.java b/core/src/main/java/org/apache/cxf/service/model/EndpointInfo.java
index 9d5dcc298e5..90c054aad88 100644
--- a/core/src/main/java/org/apache/cxf/service/model/EndpointInfo.java
+++ b/core/src/main/java/org/apache/cxf/service/model/EndpointInfo.java
@@ -21,8 +21,8 @@
 
 import javax.xml.namespace.QName;
 
+import org.apache.cxf.ws.addressing.AttributedURIType;
 import org.apache.cxf.ws.addressing.EndpointReferenceType;
-import org.apache.cxf.ws.addressing.EndpointReferenceUtils;
 
 /**
  * The EndpointInfo contains the information for a web service 'port' inside of a service.
@@ -94,9 +94,17 @@ public String getAddress() {
 
     public void setAddress(String addr) {
         if (null == address) {
-            address = EndpointReferenceUtils.getEndpointReference(addr);
+            // address = EndpointReferenceUtils.getEndpointReference(addr); loads jaxb and we want to avoid it
+            final EndpointReferenceType reference = new EndpointReferenceType();
+            final AttributedURIType a = new AttributedURIType();
+            a.setValue(addr);
+            reference.setAddress(a);
+            address = reference;
         } else {
-            EndpointReferenceUtils.setAddress(address, addr);
+            final AttributedURIType a = new AttributedURIType();
+            a.setValue(addr);
+            address.setAddress(a);
+            // EndpointReferenceUtils.setAddress(address, addr);
         }
     }
 
diff --git a/core/src/main/java/org/apache/cxf/transport/AbstractDestination.java b/core/src/main/java/org/apache/cxf/transport/AbstractDestination.java
index 91abb63a853..e7e89ec49cf 100644
--- a/core/src/main/java/org/apache/cxf/transport/AbstractDestination.java
+++ b/core/src/main/java/org/apache/cxf/transport/AbstractDestination.java
@@ -25,6 +25,7 @@
 import org.apache.cxf.Bus;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.service.model.EndpointInfo;
+import org.apache.cxf.ws.addressing.AttributedURIType;
 import org.apache.cxf.ws.addressing.EndpointReferenceType;
 import org.apache.cxf.ws.addressing.EndpointReferenceUtils;
 
@@ -95,7 +96,7 @@ public void shutdown() {
     protected abstract class AbstractBackChannelConduit extends AbstractConduit {
 
         public AbstractBackChannelConduit() {
-            super(EndpointReferenceUtils.getAnonymousEndpointReference());
+            super(getAnonymousEndpointReference());
         }
 
         /**
@@ -112,6 +113,15 @@ protected Logger getLogger() {
         }
     }
 
+    // EndpointReferenceUtils#getAnonymousEndpointReference would load jaxb, avoid it
+    private static EndpointReferenceType getAnonymousEndpointReference() {
+        final EndpointReferenceType reference = new EndpointReferenceType();
+        final AttributedURIType a = new AttributedURIType();
+        a.setValue(EndpointReferenceUtils.ANONYMOUS_ADDRESS);
+        reference.setAddress(a);
+        return reference;
+    }
+
     /**
      * {@inheritDoc}
      */
diff --git a/core/src/main/java/org/apache/cxf/ws/addressing/ContextJAXBUtils.java b/core/src/main/java/org/apache/cxf/ws/addressing/ContextJAXBUtils.java
new file mode 100644
index 00000000000..58a909e93a4
--- /dev/null
+++ b/core/src/main/java/org/apache/cxf/ws/addressing/ContextJAXBUtils.java
@@ -0,0 +1,77 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.ws.addressing;
+
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+
+import org.apache.cxf.common.jaxb.JAXBContextCache;
+import org.apache.cxf.common.jaxb.JAXBContextCache.CachedContextAndSchemas;
+
+/**
+ * Holder for utility methods relating to contexts, allows to lazily load JAXB compared to ContextUtils.
+ */
+public final class ContextJAXBUtils {
+    private static JAXBContext jaxbContext;
+    private static Set<Class<?>> jaxbContextClasses;
+
+   /**
+    * Prevents instantiation.
+    */
+    private ContextJAXBUtils() {
+    }
+
+    /**
+     * Retrieve a JAXBContext for marshalling and unmarshalling JAXB generated
+     * types.
+     *
+     * @return a JAXBContext
+     */
+    public static JAXBContext getJAXBContext() throws JAXBException {
+        synchronized (ContextJAXBUtils.class) {
+            if (jaxbContext == null || jaxbContextClasses == null) {
+                Set<Class<?>> tmp = new HashSet<>();
+                JAXBContextCache.addPackage(tmp, ContextUtils.WSA_OBJECT_FACTORY.getClass().getPackage().getName(),
+                            ContextUtils.WSA_OBJECT_FACTORY.getClass().getClassLoader());
+                JAXBContextCache.scanPackages(tmp);
+                CachedContextAndSchemas ccs
+                    = JAXBContextCache.getCachedContextAndSchemas(tmp, null, null, null, false);
+                jaxbContextClasses = ccs.getClasses();
+                jaxbContext = ccs.getContext();
+            }
+        }
+        return jaxbContext;
+    }
+
+    /**
+     * Set the encapsulated JAXBContext (used by unit tests).
+     *
+     * @param ctx JAXBContext
+     */
+    public static void setJAXBContext(JAXBContext ctx) {
+        synchronized (ContextJAXBUtils.class) {
+            jaxbContext = ctx;
+            jaxbContextClasses = new HashSet<>();
+        }
+    }
+}
diff --git a/core/src/main/java/org/apache/cxf/ws/addressing/ContextUtils.java b/core/src/main/java/org/apache/cxf/ws/addressing/ContextUtils.java
index 69362f7b8a8..61e2c916d9a 100644
--- a/core/src/main/java/org/apache/cxf/ws/addressing/ContextUtils.java
+++ b/core/src/main/java/org/apache/cxf/ws/addressing/ContextUtils.java
@@ -22,18 +22,11 @@
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.HashSet;
-import java.util.Set;
 import java.util.UUID;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-
 import org.apache.cxf.Bus;
-import org.apache.cxf.common.jaxb.JAXBContextCache;
-import org.apache.cxf.common.jaxb.JAXBContextCache.CachedContextAndSchemas;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.common.util.StringUtils;
 import org.apache.cxf.endpoint.Endpoint;
@@ -59,8 +52,7 @@
     public static final ObjectFactory WSA_OBJECT_FACTORY = new ObjectFactory();
     public static final String ACTION = ContextUtils.class.getName() + ".ACTION";
 
-    private static final EndpointReferenceType NONE_ENDPOINT_REFERENCE =
-        EndpointReferenceUtils.getEndpointReference(Names.WSA_NONE_ADDRESS);
+    private static final EndpointReferenceType NONE_ENDPOINT_REFERENCE = new EndpointReferenceType();
 
     private static final Logger LOG = LogUtils.getL7dLogger(ContextUtils.class);
 
@@ -69,9 +61,6 @@
      */
     private static final String URN_UUID = "urn:uuid:";
 
-    private static JAXBContext jaxbContext;
-    private static Set<Class<?>> jaxbContextClasses;
-
     /**
      * Used by MAPAggregator to cache bad MAP fault name
      */
@@ -90,6 +79,11 @@
     private static final String PARTIAL_RESPONSE_SENT_PROPERTY =
         "org.apache.cxf.ws.addressing.partial.response.sent";
 
+    static {
+        NONE_ENDPOINT_REFERENCE.setAddress(new AttributedURIType());
+        NONE_ENDPOINT_REFERENCE.getAddress().setValue(Names.WSA_NONE_ADDRESS);
+    }
+
    /**
     * Prevents instantiation.
     */
@@ -515,41 +509,6 @@ public static boolean retrieveAsyncPostResponseDispatch(Message message) {
         return ret != null && ret.booleanValue();
     }
 
-    /**
-     * Retrieve a JAXBContext for marshalling and unmarshalling JAXB generated
-     * types.
-     *
-     * @return a JAXBContext
-     */
-    public static JAXBContext getJAXBContext() throws JAXBException {
-        synchronized (ContextUtils.class) {
-            if (jaxbContext == null || jaxbContextClasses == null) {
-                Set<Class<?>> tmp = new HashSet<>();
-                JAXBContextCache.addPackage(tmp, WSA_OBJECT_FACTORY.getClass().getPackage().getName(),
-                                            WSA_OBJECT_FACTORY.getClass().getClassLoader());
-                JAXBContextCache.scanPackages(tmp);
-                CachedContextAndSchemas ccs
-                    = JAXBContextCache.getCachedContextAndSchemas(tmp, null, null, null, false);
-                jaxbContextClasses = ccs.getClasses();
-                jaxbContext = ccs.getContext();
-            }
-        }
-        return jaxbContext;
-    }
-
-    /**
-     * Set the encapsulated JAXBContext (used by unit tests).
-     *
-     * @param ctx JAXBContext
-     */
-    public static void setJAXBContext(JAXBContext ctx) throws JAXBException {
-        synchronized (ContextUtils.class) {
-            jaxbContext = ctx;
-            jaxbContextClasses = new HashSet<>();
-        }
-    }
-
-
     /**
      * @return a generated UUID
      */
diff --git a/core/src/main/java/org/apache/cxf/ws/addressing/EndpointReferenceUtils.java b/core/src/main/java/org/apache/cxf/ws/addressing/EndpointReferenceUtils.java
index 3ced5511d18..e9451b9a6fa 100644
--- a/core/src/main/java/org/apache/cxf/ws/addressing/EndpointReferenceUtils.java
+++ b/core/src/main/java/org/apache/cxf/ws/addressing/EndpointReferenceUtils.java
@@ -752,7 +752,7 @@ public static EndpointReferenceType getEndpointReference(AttributedURIType addre
      * @return EndpointReferenceType - the endpoint reference
      */
     public static EndpointReferenceType getAnonymousEndpointReference() {
-        EndpointReferenceType reference = new EndpointReferenceType();
+        final EndpointReferenceType reference = new EndpointReferenceType();
         setAddress(reference, ANONYMOUS_ADDRESS);
         return reference;
     }
diff --git a/core/src/main/java/org/apache/cxf/ws/addressing/VersionTransformer.java b/core/src/main/java/org/apache/cxf/ws/addressing/VersionTransformer.java
index 68b98e5dcf7..2704ebcf5c2 100644
--- a/core/src/main/java/org/apache/cxf/ws/addressing/VersionTransformer.java
+++ b/core/src/main/java/org/apache/cxf/ws/addressing/VersionTransformer.java
@@ -482,7 +482,7 @@ public static EndpointReferenceType convertToNative(Object exposed) {
     public static JAXBContext getExposedJAXBContext(String exposedURI) throws JAXBException {
 
         return NATIVE_VERSION.equals(exposedURI)
-            ? ContextUtils.getJAXBContext() : Names200408.WSA_NAMESPACE_NAME.equals(exposedURI) ? Names200408
+            ? ContextJAXBUtils.getJAXBContext() : Names200408.WSA_NAMESPACE_NAME.equals(exposedURI) ? Names200408
                 .getJAXBContext() : Names200403.WSA_NAMESPACE_NAME.equals(exposedURI) ? Names200403
                 .getJAXBContext() : null;
     }
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
index 38068cc95af..f3f8e2f3fc1 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
@@ -192,10 +192,10 @@ public void init(List<ClassResourceInfo> cris) {
             if (cris != null) {
                 allTypes = new HashSet<>(ResourceUtils.getAllRequestResponseTypes(cris, true)
                     .getAllTypes().keySet());
-                context = ResourceUtils.createJaxbContext(allTypes, extraClass, cProperties);
+                context = org.apache.cxf.jaxrs.utils.JAXBUtils.createJaxbContext(allTypes, extraClass, cProperties);
             } else if (extraClass != null) {
                 allTypes = new HashSet<>(Arrays.asList(extraClass));
-                context = ResourceUtils.createJaxbContext(allTypes, null, cProperties);
+                context = org.apache.cxf.jaxrs.utils.JAXBUtils.createJaxbContext(allTypes, null, cProperties);
             }
 
             if (context != null) {
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
index 8e2eb379715..855d655025f 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
@@ -139,17 +139,18 @@ protected static ProviderCache initCache(Bus theBus) {
         return new ProviderCache(checkAll);
     }
     protected static void initFactory(ProviderFactory factory) {
+        // ensure to not load providers not available in a module environment if not needed
         factory.setProviders(false,
                              false,
                      new BinaryDataProvider<Object>(),
                      new SourceProvider<Object>(),
-                     new DataSourceProvider<Object>(),
+                     tryCreateInstance("org.apache.cxf.jaxrs.provider.DataSourceProvider"),
                      new FormEncodingProvider<Object>(),
                      new StringTextProvider(),
                      new PrimitiveTextProvider<Object>(),
-                     new JAXBElementProvider<Object>(),
-                     new JAXBElementTypedProvider(),
-                     new MultipartProvider());
+                     tryCreateInstance(JAXB_PROVIDER_NAME),
+                     tryCreateInstance("org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider"),
+                     tryCreateInstance("org.apache.cxf.jaxrs.provider.MultipartProvider"));
         Object prop = factory.getBus().getProperty("skip.default.json.provider.registration");
         if (!PropertyUtils.isTrue(prop)) {
             factory.setProviders(false, false, createProvider(JSON_PROVIDER_NAME, factory.getBus()));
@@ -157,6 +158,16 @@ protected static void initFactory(ProviderFactory factory) {
 
     }
 
+    protected static Object tryCreateInstance(final String className) {
+        try {
+            final Class<?> cls = ClassLoaderUtils.loadClass(className, ProviderFactory.class);
+            return cls.getConstructor().newInstance();
+        } catch (final Throwable ex) {
+            LOG.fine(className + " not available, skipping");
+        }
+        return null;
+    }
+
     protected static Object createProvider(String className, Bus bus) {
 
         try {
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/AnnotationUtils.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/AnnotationUtils.java
index 7ad6030cb69..4f3e2925440 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/AnnotationUtils.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/AnnotationUtils.java
@@ -20,6 +20,7 @@
 package org.apache.cxf.jaxrs.utils;
 
 import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Collections;
 import java.util.HashSet;
@@ -27,7 +28,6 @@
 import java.util.Set;
 import java.util.logging.Logger;
 
-import javax.annotation.Priority;
 import javax.ws.rs.BeanParam;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.CookieParam;
@@ -48,6 +48,10 @@
 
 public final class AnnotationUtils {
     private static final Logger LOG = LogUtils.getL7dLogger(AnnotationUtils.class);
+    private static final Class<? extends Annotation> PRIORITY_API =
+            (Class<? extends Annotation>) loadClassOrNull("javax.annotation.Priority");
+    private static final Method PRIORITY_VALUE = getMethodOrNull(PRIORITY_API, "value");
+
     private static final Set<Class<?>> PARAM_ANNOTATION_CLASSES;
     private static final Set<Class<?>> METHOD_ANNOTATION_CLASSES;
     static {
@@ -59,6 +63,25 @@ private AnnotationUtils() {
 
     }
 
+    private static Method getMethodOrNull(final Class<?> type, final String name) {
+        if (type == null) {
+            return null;
+        }
+        try {
+            return type.getMethod(name);
+        } catch (final NoSuchMethodException e) {
+            return null;
+        }
+    }
+
+    private static Class<?> loadClassOrNull(final String name) {
+        try {
+            return org.apache.cxf.common.classloader.ClassLoaderUtils.loadClass(
+                    name, AnnotationUtils.class);
+        } catch (final ClassNotFoundException e) {
+            return null;
+        }
+    }
 
     private static Set<Class<?>> initParamAnnotationClasses() {
         Set<Class<?>> classes = new HashSet<>();
@@ -82,8 +105,15 @@ private AnnotationUtils() {
     }
 
     public static int getBindingPriority(Class<?> providerCls) {
-        Priority b = getClassAnnotation(providerCls, Priority.class);
-        return b == null ? Priorities.USER : b.value();
+        if (PRIORITY_API == null) {
+            return Priorities.USER;
+        }
+        Annotation b = getClassAnnotation(providerCls, PRIORITY_API);
+        try {
+            return b == null ? Priorities.USER : Integer.class.cast(PRIORITY_VALUE.invoke(b));
+        } catch (final IllegalAccessException | InvocationTargetException e) {
+            return Priorities.USER;
+        }
     }
     public static Set<String> getNameBindings(Annotation[] targetAnns) {
         if (targetAnns.length == 0) {
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXBUtils.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXBUtils.java
index 5e6196f1a50..357e477da10 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXBUtils.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXBUtils.java
@@ -22,9 +22,13 @@
 import java.io.IOException;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
+import java.util.Map;
+import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
 import javax.xml.bind.Unmarshaller;
 import javax.xml.bind.annotation.adapters.XmlAdapter;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@@ -37,6 +41,24 @@
     private JAXBUtils() {
 
     }
+
+    public static JAXBContext createJaxbContext(Set<Class<?>> classes, Class<?>[] extraClass,
+                                                Map<String, Object> contextProperties) {
+        if (classes == null || classes.isEmpty()) {
+            return null;
+        }
+        org.apache.cxf.common.jaxb.JAXBUtils.scanPackages(classes, extraClass, null);
+
+        JAXBContext ctx;
+        try {
+            ctx = JAXBContext.newInstance(classes.toArray(new Class[0]), contextProperties);
+            return ctx;
+        } catch (JAXBException ex) {
+            LOG.log(Level.SEVERE, "No JAXB context can be created", ex);
+        }
+        return null;
+    }
+
     public static void closeUnmarshaller(Unmarshaller u) {
         if (u instanceof Closeable) {
             //need to do this to clear the ThreadLocal cache
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java
index 89368f2abb4..a2bbbfede90 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java
@@ -67,9 +67,6 @@
 import javax.ws.rs.core.Response;
 import javax.ws.rs.ext.MessageBodyWriter;
 import javax.ws.rs.ext.Provider;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBElement;
-import javax.xml.bind.JAXBException;
 import javax.xml.namespace.QName;
 
 import org.w3c.dom.Document;
@@ -79,7 +76,6 @@
 import org.apache.cxf.BusFactory;
 import org.apache.cxf.common.classloader.ClassLoaderUtils;
 import org.apache.cxf.common.i18n.BundleUtils;
-import org.apache.cxf.common.jaxb.JAXBUtils;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.common.util.StringUtils;
 import org.apache.cxf.feature.Feature;
@@ -658,6 +654,13 @@ private static void getAllTypesForResource(ClassResourceInfo resource,
                                                ResourceTypes types,
                                                boolean jaxbOnly,
                                                MessageBodyWriter<?> jaxbWriter) {
+        Class<?> jaxbElement = null;
+        try {
+            jaxbElement = ClassLoaderUtils.loadClass("javax.xml.bind.JAXBElement", ResourceUtils.class);
+        } catch (final ClassNotFoundException e) {
+            // no-op
+        }
+
         for (OperationResourceInfo ori : resource.getMethodDispatcher().getOperationResourceInfos()) {
             Method method = ori.getAnnotatedMethod() == null ? ori.getMethodToInvoke() : ori.getAnnotatedMethod();
             Class<?> realReturnType = method.getReturnType();
@@ -668,7 +671,7 @@ private static void getAllTypesForResource(ClassResourceInfo resource,
             Type type = method.getGenericReturnType();
             if (jaxbOnly) {
                 checkJaxbType(resource.getServiceClass(), cls, realReturnType == Response.class || ori.isAsync()
-                    ? cls : type, types, method.getAnnotations(), jaxbWriter);
+                    ? cls : type, types, method.getAnnotations(), jaxbWriter, jaxbElement);
             } else {
                 types.getAllTypes().put(cls, type);
             }
@@ -680,7 +683,7 @@ private static void getAllTypesForResource(ClassResourceInfo resource,
                         Type paramType = method.getGenericParameterTypes()[pm.getIndex()];
                         if (jaxbOnly) {
                             checkJaxbType(resource.getServiceClass(), inType, paramType, types,
-                                          method.getParameterAnnotations()[pm.getIndex()], jaxbWriter);
+                                          method.getParameterAnnotations()[pm.getIndex()], jaxbWriter, jaxbElement);
                         } else {
                             types.getAllTypes().put(inType, paramType);
                         }
@@ -712,7 +715,8 @@ private static void checkJaxbType(Class<?> serviceClass,
                                       Type genericType,
                                       ResourceTypes types,
                                       Annotation[] anns,
-                                      MessageBodyWriter<?> jaxbWriter) {
+                                      MessageBodyWriter<?> jaxbWriter,
+                                      Class<?> jaxbElement) {
         boolean isCollection = false;
         if (InjectionUtils.isSupportedCollectionOrArray(type)) {
             type = InjectionUtils.getActualType(genericType);
@@ -727,7 +731,7 @@ private static void checkJaxbType(Class<?> serviceClass,
         }
         if (type == null
             || InjectionUtils.isPrimitive(type)
-            || JAXBElement.class.isAssignableFrom(type)
+            || (jaxbElement != null && jaxbElement.isAssignableFrom(type))
             || Response.class.isAssignableFrom(type)
             || type.isInterface()) {
             return;
@@ -1022,23 +1026,4 @@ private static boolean isValidApplicationClass(Class<?> c, Set<Object> singleton
         return true;
     }
 
-    //TODO : consider moving JAXBDataBinding.createContext to JAXBUtils
-    public static JAXBContext createJaxbContext(Set<Class<?>> classes, Class<?>[] extraClass,
-                                          Map<String, Object> contextProperties) {
-        if (classes == null || classes.isEmpty()) {
-            return null;
-        }
-        JAXBUtils.scanPackages(classes, extraClass, null);
-
-        JAXBContext ctx;
-        try {
-            ctx = JAXBContext.newInstance(classes.toArray(new Class[0]),
-                                          contextProperties);
-            return ctx;
-        } catch (JAXBException ex) {
-            LOG.log(Level.SEVERE, "No JAXB context can be created", ex);
-        }
-        return null;
-    }
-
 }
diff --git a/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java b/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java
index 805e854b896..926d42d4dfb 100644
--- a/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java
+++ b/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java
@@ -327,7 +327,8 @@ public StringBuilder generateWADL(String baseURI,
 
         JAXBContext jaxbContext = null;
         if (useJaxbContextForQnames && !allTypes.isEmpty()) {
-            jaxbContext = ResourceUtils.createJaxbContext(new HashSet<>(allTypes), null, jaxbContextProperties);
+            jaxbContext = org.apache.cxf.jaxrs.utils.JAXBUtils
+                    .createJaxbContext(new HashSet<>(allTypes), null, jaxbContextProperties);
             if (jaxbContext == null) {
                 LOG.warning("JAXB Context is null: possibly due to one of input classes being not accepted");
             }
diff --git a/rt/ws/addr/src/test/java/org/apache/cxf/ws/addressing/soap/MAPCodecTest.java b/rt/ws/addr/src/test/java/org/apache/cxf/ws/addressing/soap/MAPCodecTest.java
index cf3f87e77e1..324c1f872ca 100644
--- a/rt/ws/addr/src/test/java/org/apache/cxf/ws/addressing/soap/MAPCodecTest.java
+++ b/rt/ws/addr/src/test/java/org/apache/cxf/ws/addressing/soap/MAPCodecTest.java
@@ -43,6 +43,7 @@
 import org.apache.cxf.message.MessageImpl;
 import org.apache.cxf.ws.addressing.AddressingProperties;
 import org.apache.cxf.ws.addressing.AttributedURIType;
+import org.apache.cxf.ws.addressing.ContextJAXBUtils;
 import org.apache.cxf.ws.addressing.ContextUtils;
 import org.apache.cxf.ws.addressing.EndpointReferenceType;
 import org.apache.cxf.ws.addressing.EndpointReferenceUtils;
@@ -91,7 +92,7 @@ public void tearDown() throws Exception {
         expectedNamespaceURI = null;
         mimeHeaders = null;
         correlatedExchange = null;
-        ContextUtils.setJAXBContext(null);
+        ContextJAXBUtils.setJAXBContext(null);
         nonReplyRelationship = null;
     }
 
@@ -310,7 +311,7 @@ public Element getHeader(SoapVersion version) {
         });
         List<Header> headers = message.getHeaders();
         JAXBContext jaxbContext = control.createMock(JAXBContext.class);
-        ContextUtils.setJAXBContext(jaxbContext);
+        ContextJAXBUtils.setJAXBContext(jaxbContext);
         Names200408.setJAXBContext(jaxbContext);
         Names200403.setJAXBContext(jaxbContext);
         if (outbound) {
@@ -345,7 +346,7 @@ private void setUpEncode(boolean requestor, SoapMessage message, Element header,
     private void setUpDecode(SoapMessage message, List<Header> headers, AddressingProperties maps,
                              String mapProperty, boolean requestor) throws Exception {
         Unmarshaller unmarshaller = control.createMock(Unmarshaller.class);
-        ContextUtils.getJAXBContext().createUnmarshaller();
+        ContextJAXBUtils.getJAXBContext().createUnmarshaller();
         EasyMock.expectLastCall().andReturn(unmarshaller);
         String uri = maps.getNamespaceURI();
         boolean exposedAsNative = Names.WSA_NAMESPACE_NAME.equals(uri);


With regards,
Apache Git Services