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) {