You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2021/05/01 10:36:32 UTC

[tomee] branch master updated: TOMEE-3180 jaxrs.spec.provider.exceptionmapper mappedExceptionTest

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

dblevins pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomee.git


The following commit(s) were added to refs/heads/master by this push:
     new cde8a81  TOMEE-3180 jaxrs.spec.provider.exceptionmapper mappedExceptionTest
cde8a81 is described below

commit cde8a81113d3c25eb49615e48dc73d9c190fc5ce
Author: David Blevins <da...@gmail.com>
AuthorDate: Sat May 1 03:35:44 2021 -0700

    TOMEE-3180 jaxrs.spec.provider.exceptionmapper mappedExceptionTest
---
 .../openejb/server/cxf/rs/CxfRsHttpListener.java   | 28 ++++++++++++++++++----
 1 file changed, 24 insertions(+), 4 deletions(-)

diff --git a/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
index d45f001..55482da 100644
--- a/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
+++ b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
@@ -119,7 +119,11 @@ import javax.ws.rs.core.Application;
 import javax.ws.rs.core.MultivaluedHashMap;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.ContextResolver;
 import javax.ws.rs.ext.ExceptionMapper;
+import javax.ws.rs.ext.MessageBodyReader;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.ws.rs.ext.ParamConverterProvider;
 import javax.ws.rs.ext.Provider;
 import java.io.IOException;
 import java.io.InputStream;
@@ -435,7 +439,7 @@ public class CxfRsHttpListener implements RsHttpListener {
         Thread.currentThread().setContextClassLoader(CxfUtil.initBusLoader());
         try {
             final JAXRSServerFactoryBean factory = newFactory(address, createServiceJmxName(clazz.getClassLoader()), createEndpointName(app));
-            configureFactory(additionalProviders, configuration, factory, webBeansContext);
+            configureFactory(additionalProviders, configuration, factory, webBeansContext, app);
             factory.setResourceClasses(clazz);
             context = contextRoot;
             if (context == null) {
@@ -649,7 +653,7 @@ public class CxfRsHttpListener implements RsHttpListener {
         Thread.currentThread().setContextClassLoader(CxfUtil.initBusLoader());
         try {
             final JAXRSServerFactoryBean factory = newFactory(prefix, createServiceJmxName(classLoader), createEndpointName(application));
-            configureFactory(additionalProviders, serviceConfiguration, factory, owbCtx);
+            configureFactory(additionalProviders, serviceConfiguration, factory, owbCtx, application);
             factory.setApplication(application);
 
             final List<Class<?>> classes = new ArrayList<>();
@@ -980,7 +984,7 @@ public class CxfRsHttpListener implements RsHttpListener {
     private void configureFactory(final Collection<Object> givenAdditionalProviders,
                                   final ServiceConfiguration serviceConfiguration,
                                   final JAXRSServerFactoryBean factory,
-                                  final WebBeansContext ctx) {
+                                  final WebBeansContext ctx, final Application application) {
         CxfUtil.configureEndpoint(factory, serviceConfiguration, CXF_JAXRS_PREFIX);
 
         boolean enforceCxfBvalMapper = false;
@@ -1111,7 +1115,14 @@ public class CxfRsHttpListener implements RsHttpListener {
         // the other one is more generic but need another file
         final String key = CXF_JAXRS_PREFIX + "skip-provider-scanning";
         final boolean ignoreAutoProviders = "true".equalsIgnoreCase(SystemInstance.get().getProperty(key, serviceConfiguration.getProperties().getProperty(key, "false")));
-        final Collection<Object> additionalProviders = ignoreAutoProviders ? Collections.emptyList() : givenAdditionalProviders;
+        final List<Object> additionalProviders = new ArrayList<Object>(ignoreAutoProviders ? Collections.EMPTY_LIST : givenAdditionalProviders);
+
+        for (final Class<?> clzz : application.getClasses()) {
+            if (isProvider(clzz) && !additionalProviders.contains(clzz)) {
+                additionalProviders.add(clzz);
+            }
+        }
+
         List<Object> providers = null;
         if (providersConfig != null) {
             providers = ServiceInfos.resolve(services, providersConfig.toArray(new String[providersConfig.size()]), OpenEJBProviderFactory.INSTANCE);
@@ -1143,6 +1154,15 @@ public class CxfRsHttpListener implements RsHttpListener {
         }
     }
 
+    private boolean isProvider(final Class<?> clazz) {
+        return ContextResolver.class.isAssignableFrom(clazz)
+                || ExceptionMapper.class.isAssignableFrom(clazz)
+                || MessageBodyReader.class.isAssignableFrom(clazz)
+                || MessageBodyWriter.class.isAssignableFrom(clazz)
+                || ParamConverterProvider.class.isAssignableFrom(clazz)
+                ;
+    }
+
     private Object getServiceObject(final Message message) {
         final OperationResourceInfo ori = message.getExchange().get(OperationResourceInfo.class);
         if (ori == null) {