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.