Prevent loading Feature/DynamicFeature services multiple times.
Signed-off-by: jansupol <jan.supol@oracle.com>
diff --git a/core-common/src/main/java/org/glassfish/jersey/AbstractFeatureConfigurator.java b/core-common/src/main/java/org/glassfish/jersey/AbstractFeatureConfigurator.java
index dbc4308..61b7eb5 100644
--- a/core-common/src/main/java/org/glassfish/jersey/AbstractFeatureConfigurator.java
+++ b/core-common/src/main/java/org/glassfish/jersey/AbstractFeatureConfigurator.java
@@ -24,6 +24,7 @@
import javax.ws.rs.RuntimeType;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -62,7 +63,7 @@
* @param features list of features to be registered
* @param bootstrapBag place where features are being registered
*/
- protected void registerFeatures(List<Class<T>> features,
+ protected void registerFeatures(Collection<Class<T>> features,
BootstrapBag bootstrapBag) {
final List<AutoDiscoverable> autoDiscoverables = new ArrayList<>();
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/DynamicFeatureConfigurator.java b/core-common/src/main/java/org/glassfish/jersey/internal/DynamicFeatureConfigurator.java
index ed2c8fb..f8ea866 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/DynamicFeatureConfigurator.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/DynamicFeatureConfigurator.java
@@ -22,8 +22,10 @@
import javax.ws.rs.RuntimeType;
import javax.ws.rs.container.DynamicFeature;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* Registers JAX-RS {@link DynamicFeature} which are listed as SPIs for registration.
@@ -51,7 +53,8 @@
public void init(InjectionManager injectionManager, BootstrapBag bootstrapBag) {
final Map<String, Object> properties = bootstrapBag.getConfiguration().getProperties();
if (PropertiesHelper.isJaxRsServiceLoadingEnabled(properties)) {
- final List<Class<DynamicFeature>> dynamicFeatures = loadImplementations(properties);
+ final Set<Class<DynamicFeature>> dynamicFeatures = new HashSet<>();
+ dynamicFeatures.addAll(loadImplementations(properties));
dynamicFeatures.addAll(loadImplementations(properties, DynamicFeature.class.getClassLoader()));
registerFeatures(dynamicFeatures, bootstrapBag);
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/FeatureConfigurator.java b/core-common/src/main/java/org/glassfish/jersey/internal/FeatureConfigurator.java
index 24a24fb..4985407 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/FeatureConfigurator.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/FeatureConfigurator.java
@@ -22,8 +22,9 @@
import javax.ws.rs.RuntimeType;
import javax.ws.rs.core.Feature;
-import java.util.List;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
/**
* Registers JAX-RS {@link Feature} which are listed as SPIs for registration.
@@ -44,7 +45,8 @@
public void init(InjectionManager injectionManager, BootstrapBag bootstrapBag) {
final Map<String, Object> properties = bootstrapBag.getConfiguration().getProperties();
if (PropertiesHelper.isJaxRsServiceLoadingEnabled(properties)) {
- final List<Class<Feature>> features = loadImplementations(properties);
+ final Set<Class<Feature>> features = new HashSet<>();
+ features.addAll(loadImplementations(properties));
features.addAll(loadImplementations(properties, Feature.class.getClassLoader()));
registerFeatures(features, bootstrapBag);