You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2018/02/01 13:02:14 UTC

[cxf] branch master updated: [CXF-7473] Workawround to avoid picking up wrong ExceptionMappers

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 46fd17d  [CXF-7473] Workawround to avoid picking up wrong ExceptionMappers
46fd17d is described below

commit 46fd17ddf1dd1c8223f39e2adbd9f11b20377453
Author: Sergey Beryozkin <sb...@gmail.com>
AuthorDate: Thu Feb 1 13:01:58 2018 +0000

    [CXF-7473] Workawround to avoid picking up wrong ExceptionMappers
---
 .../apache/cxf/jaxrs/provider/ProviderFactory.java | 22 +++++++++++++++++++---
 .../cxf/jaxrs/provider/ServerProviderFactory.java  |  2 +-
 ...iderFactoryHierarchicalExceptionMapperTest.java |  2 --
 3 files changed, 20 insertions(+), 6 deletions(-)

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 ed4ce0a..d254fe9 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
@@ -290,13 +290,22 @@ public abstract class ProviderFactory {
                                        Message m,
                                        Class<?> providerClass,
                                        boolean injectContext) {
+        return handleMapper(em, expectedType, m, providerClass, null, injectContext);
+    }
+    
+    protected <T> boolean handleMapper(ProviderInfo<T> em,
+                                       Class<?> expectedType,
+                                       Message m,
+                                       Class<?> providerClass,
+                                       Class<?> commonBaseClass,
+                                       boolean injectContext) {
 
         Class<?> mapperClass = ClassHelper.getRealClass(bus, em.getProvider());
         Type[] types;
         if (m != null && MessageUtils.getContextualBoolean(m, IGNORE_TYPE_VARIABLES)) {
             types = new Type[]{mapperClass};
         } else {
-            types = getGenericInterfaces(mapperClass, expectedType);
+            types = getGenericInterfaces(mapperClass, expectedType, commonBaseClass);
         }
         for (Type t : types) {
             if (t instanceof ParameterizedType) {
@@ -1075,6 +1084,10 @@ public abstract class ProviderFactory {
     }
 
     private static Type[] getGenericInterfaces(Class<?> cls, Class<?> expectedClass) {
+        return getGenericInterfaces(cls, expectedClass, Object.class);
+    }
+    private static Type[] getGenericInterfaces(Class<?> cls, Class<?> expectedClass,
+                                               Class<?> commonBaseCls) {
         if (Object.class == cls) {
             return new Type[]{};
         }
@@ -1084,7 +1097,10 @@ public abstract class ProviderFactory {
                 Class<?> actualType = InjectionUtils.getActualType(genericSuperType);
                 if (actualType != null && actualType.isAssignableFrom(expectedClass)) {
                     return new Type[]{genericSuperType};
-                } else if (expectedClass.isAssignableFrom(actualType)) {
+                } else if (commonBaseCls != null && commonBaseCls != Object.class 
+                           && commonBaseCls.isAssignableFrom(expectedClass)
+                           && commonBaseCls.isAssignableFrom(actualType)
+                           || expectedClass.isAssignableFrom(actualType)) {
                     return new Type[]{};
                 }
             }
@@ -1093,7 +1109,7 @@ public abstract class ProviderFactory {
         if (types.length > 0) {
             return types;
         }
-        return getGenericInterfaces(cls.getSuperclass(), expectedClass);
+        return getGenericInterfaces(cls.getSuperclass(), expectedClass, commonBaseCls);
     }
 
     protected static class AbstractPriorityComparator {
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
index 611ab47..bf4ddf1 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
@@ -188,7 +188,7 @@ public final class ServerProviderFactory extends ProviderFactory {
             MessageUtils.getContextualBoolean(m, MAKE_DEFAULT_WAE_LEAST_SPECIFIC, false);
         
         return (ExceptionMapper<T>)exceptionMappers.stream()
-                .filter(em -> handleMapper(em, exceptionType, m, ExceptionMapper.class, true))
+                .filter(em -> handleMapper(em, exceptionType, m, ExceptionMapper.class, Throwable.class, true))
                 .sorted(new ExceptionProviderInfoComparator(exceptionType,
                                                             makeDefaultWaeLeastSpecific))
                 .map(ProviderInfo::getProvider)
diff --git a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryHierarchicalExceptionMapperTest.java b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryHierarchicalExceptionMapperTest.java
index db122b7..13850ea 100644
--- a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryHierarchicalExceptionMapperTest.java
+++ b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryHierarchicalExceptionMapperTest.java
@@ -25,7 +25,6 @@ import org.apache.cxf.message.MessageImpl;
 
 import org.junit.Assert;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -59,7 +58,6 @@ public class ProviderFactoryHierarchicalExceptionMapperTest {
                 IllegalStateExceptionMapper.class, exceptionMapper.getClass());
     }
 
-    @Ignore("To be fixed in CXF-7473")
     @Test
     public void testNoMatch() {
         ExceptionMapper<?> exceptionMapper = pf.createExceptionMapper(UnmappedRuntimeException.class,

-- 
To stop receiving notification emails like this one, please contact
sergeyb@apache.org.