Optional Injection-less client side for SE (#5232)

Signed-off-by: jansupol <jan.supol@oracle.com>
diff --git a/core-client/src/main/java/org/glassfish/jersey/client/ChunkedInputReader.java b/core-client/src/main/java/org/glassfish/jersey/client/ChunkedInputReader.java
index f480447..e0179ba 100644
--- a/core-client/src/main/java/org/glassfish/jersey/client/ChunkedInputReader.java
+++ b/core-client/src/main/java/org/glassfish/jersey/client/ChunkedInputReader.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -43,10 +43,15 @@
 @ConstrainedTo(RuntimeType.CLIENT)
 class ChunkedInputReader implements MessageBodyReader<ChunkedInput> {
 
+    private final Provider<MessageBodyWorkers> messageBodyWorkers;
+    private final Provider<PropertiesDelegate> propertiesDelegateProvider;
+
     @Inject
-    private Provider<MessageBodyWorkers> messageBodyWorkers;
-    @Inject
-    private Provider<PropertiesDelegate> propertiesDelegateProvider;
+    public ChunkedInputReader(Provider<MessageBodyWorkers> messageBodyWorkers,
+                              Provider<PropertiesDelegate> propertiesDelegateProvider) {
+        this.messageBodyWorkers = messageBodyWorkers;
+        this.propertiesDelegateProvider = propertiesDelegateProvider;
+    }
 
     @Override
     public boolean isReadable(Class<?> aClass, Type type, Annotation[] annotations, MediaType mediaType) {
diff --git a/core-client/src/main/java/org/glassfish/jersey/client/ClientConfig.java b/core-client/src/main/java/org/glassfish/jersey/client/ClientConfig.java
index 89e87f1..d5983c8 100644
--- a/core-client/src/main/java/org/glassfish/jersey/client/ClientConfig.java
+++ b/core-client/src/main/java/org/glassfish/jersey/client/ClientConfig.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2018 Payara Foundation and/or its affiliates.
  *
  * This program and the accompanying materials are made available under the
@@ -35,6 +35,7 @@
 import org.glassfish.jersey.CommonProperties;
 import org.glassfish.jersey.ExtendedConfig;
 import org.glassfish.jersey.client.internal.LocalizationMessages;
+import org.glassfish.jersey.client.innate.inject.NonInjectionManager;
 import org.glassfish.jersey.client.internal.inject.ParameterUpdaterConfigurator;
 import org.glassfish.jersey.client.spi.Connector;
 import org.glassfish.jersey.client.spi.ConnectorProvider;
@@ -410,7 +411,7 @@
             final State runtimeCfgState = this.copy();
             runtimeCfgState.markAsShared();
 
-            InjectionManager injectionManager = Injections.createInjectionManager();
+            final InjectionManager injectionManager = findInjectionManager();
             injectionManager.register(new ClientBinder(runtimeCfgState.getProperties()));
 
             final ClientBootstrapBag bootstrapBag = new ClientBootstrapBag();
@@ -471,6 +472,14 @@
             return crt;
         }
 
+        private final InjectionManager findInjectionManager() {
+            try {
+                return Injections.createInjectionManager(RuntimeType.CLIENT);
+            } catch (IllegalStateException ise) {
+                return new NonInjectionManager(true);
+            }
+        }
+
         @Override
         public boolean equals(final Object o) {
             if (this == o) {
diff --git a/core-client/src/main/java/org/glassfish/jersey/client/filter/EncodingFilter.java b/core-client/src/main/java/org/glassfish/jersey/client/filter/EncodingFilter.java
index bd15ec4..cdd21d8 100644
--- a/core-client/src/main/java/org/glassfish/jersey/client/filter/EncodingFilter.java
+++ b/core-client/src/main/java/org/glassfish/jersey/client/filter/EncodingFilter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -49,10 +49,15 @@
  * @author Martin Matula
  */
 public final class EncodingFilter implements ClientRequestFilter {
-    @Inject
-    private InjectionManager injectionManager;
+
+    private final InjectionManager injectionManager;
     private volatile List<Object> supportedEncodings = null;
 
+    @Inject
+    public EncodingFilter(InjectionManager injectionManager) {
+        this.injectionManager = injectionManager;
+    }
+
     @Override
     public void filter(ClientRequestContext request) throws IOException {
         if (getSupportedEncodings().isEmpty()) {
diff --git a/core-client/src/main/java/org/glassfish/jersey/client/innate/inject/NonInjectionManager.java b/core-client/src/main/java/org/glassfish/jersey/client/innate/inject/NonInjectionManager.java
new file mode 100644
index 0000000..74ccd8c
--- /dev/null
+++ b/core-client/src/main/java/org/glassfish/jersey/client/innate/inject/NonInjectionManager.java
@@ -0,0 +1,1029 @@
+/*
+ * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package org.glassfish.jersey.client.innate.inject;
+
+import org.glassfish.jersey.client.internal.LocalizationMessages;
+import org.glassfish.jersey.internal.inject.Binder;
+import org.glassfish.jersey.internal.inject.Binding;
+import org.glassfish.jersey.internal.inject.ClassBinding;
+import org.glassfish.jersey.internal.inject.DisposableSupplier;
+import org.glassfish.jersey.internal.inject.ForeignDescriptor;
+import org.glassfish.jersey.internal.inject.InjectionManager;
+import org.glassfish.jersey.internal.inject.InstanceBinding;
+import org.glassfish.jersey.internal.inject.PerThread;
+import org.glassfish.jersey.internal.inject.ServiceHolder;
+import org.glassfish.jersey.internal.inject.ServiceHolderImpl;
+import org.glassfish.jersey.internal.inject.SupplierClassBinding;
+import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
+import org.glassfish.jersey.internal.util.collection.LazyValue;
+import org.glassfish.jersey.internal.util.collection.Value;
+import org.glassfish.jersey.internal.util.collection.Values;
+import org.glassfish.jersey.process.internal.RequestScope;
+import org.glassfish.jersey.process.internal.RequestScoped;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.inject.Inject;
+import javax.inject.Provider;
+import javax.inject.Singleton;
+import javax.ws.rs.ConstrainedTo;
+import javax.ws.rs.RuntimeType;
+import javax.ws.rs.core.MultivaluedHashMap;
+import javax.ws.rs.core.MultivaluedMap;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Executable;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Proxy;
+import java.lang.reflect.Type;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.function.Supplier;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.stream.Collectors;
+
+@ConstrainedTo(RuntimeType.CLIENT)
+public final class NonInjectionManager implements InjectionManager {
+    private static final Logger logger = Logger.getLogger(NonInjectionManager.class.getName());
+
+    private final MultivaluedMap<Class<?>, InstanceBinding<?>> instanceBindings = new MultivaluedHashMap<>();
+    private final MultivaluedMap<Class<?>, ClassBinding<?>> contractBindings = new MultivaluedHashMap<>();
+    private final MultivaluedMap<Class<?>, SupplierInstanceBinding<?>> supplierInstanceBindings = new MultivaluedHashMap<>();
+    private final MultivaluedMap<Class<?>, SupplierClassBinding<?>> supplierClassBindings = new MultivaluedHashMap<>();
+    private final MultivaluedMap<Type, InstanceBinding<?>> instanceTypeBindings = new MultivaluedHashMap<>();
+    private final MultivaluedMap<Type, ClassBinding<?>> contractTypeBindings = new MultivaluedHashMap<>();
+    private final MultivaluedMap<Type, SupplierInstanceBinding<?>> supplierTypeInstanceBindings = new MultivaluedHashMap<>();
+    private final MultivaluedMap<Type, SupplierClassBinding<?>> supplierTypeClassBindings = new MultivaluedHashMap<>();
+
+    private final MultivaluedMap<DisposableSupplier, Object> disposableSupplierObjects = new MultivaluedHashMap<>();
+
+    private final Instances instances = new Instances();
+    private final Types types = new Types();
+
+    private volatile boolean isRequestScope = false;
+    private volatile boolean shutdown = false;
+
+    /**
+     * A class that holds singleton instances and thread-scope instances. Provides thread safe access to singletons
+     * and thread-scope instances. The instances are created for Type (ParametrizedType) and for a Class.
+     * @param <TYPE> the type for which the instance is created, either Class, or ParametrizedType (for instance
+     * Provider&lt;SomeClass&gt;).
+     */
+    private class TypedInstances<TYPE> {
+        private final MultivaluedMap<TYPE, InstanceContext<?>> singletonInstances = new MultivaluedHashMap<>();
+        private final ThreadLocal<MultivaluedMap<TYPE, InstanceContext<?>>> threadInstances = new ThreadLocal<>();
+        private final List<Object> threadPredestroyables = Collections.synchronizedList(new LinkedList<>());
+
+        private <T> List<InstanceContext<?>> _getSingletons(TYPE clazz) {
+            List<InstanceContext<?>> si;
+            synchronized (singletonInstances) {
+                si = singletonInstances.get(clazz);
+            }
+            return si;
+        }
+
+        @SuppressWarnings("unchecked")
+        <T> T _addSingleton(TYPE clazz, T instance, Binding<?, ?> binding, Annotation[] qualifiers) {
+            synchronized (singletonInstances) {
+                // check existing singleton with a qualifier already created by another thread io a meantime
+                List<InstanceContext<?>> values = singletonInstances.get(clazz);
+                if (values != null) {
+                    List<InstanceContext<?>> qualified
+                            = values.stream()
+                                    .filter(ctx -> ctx.hasQualifiers(qualifiers))
+                                    .collect(Collectors.toList());
+                    if (!qualified.isEmpty()) {
+                        return (T) qualified.get(0).instance;
+                    }
+                }
+                singletonInstances.add(clazz, new InstanceContext<>(instance, binding, qualifiers));
+                threadPredestroyables.add(instance);
+                return instance;
+            }
+        }
+
+        @SuppressWarnings("unchecked")
+        <T> T addSingleton(TYPE clazz, T t, Binding<?, ?> binding, Annotation[] instanceQualifiers) {
+            T t2  = _addSingleton(clazz, t, binding, instanceQualifiers);
+            if (t2 == t) {
+                for (Type contract : binding.getContracts()) {
+                    if (!clazz.equals(contract) && isClass(contract)) {
+                        _addSingleton((TYPE) contract, t, binding, instanceQualifiers);
+                    }
+                }
+            }
+            return t2;
+        }
+
+        private List<InstanceContext<?>> _getThreadInstances(TYPE clazz) {
+            MultivaluedMap<TYPE, InstanceContext<?>> ti = threadInstances.get();
+            List<InstanceContext<?>> list = ti == null ? null : new LinkedList<>();
+            if (ti != null) {
+                return ti.get(clazz);
+            }
+            return list;
+        }
+
+        private <T> void _addThreadInstance(TYPE clazz, T instance, Binding<T, ?> binding, Annotation[] qualifiers) {
+            MultivaluedMap<TYPE, InstanceContext<?>> map = threadInstances.get();
+            if (map == null) {
+                map = new MultivaluedHashMap<>();
+                threadInstances.set(map);
+            }
+            map.add(clazz, new InstanceContext<>(instance, binding, qualifiers));
+            threadPredestroyables.add(instance);
+        }
+
+        <T> void addThreadInstance(TYPE clazz, T t, Binding<T, ?> binding, Annotation[] instanceQualifiers) {
+            _addThreadInstance(clazz, t, binding, instanceQualifiers);
+            for (Type contract : binding.getContracts()) {
+                if (!clazz.equals(contract) && isClass(contract)) {
+                    _addThreadInstance((TYPE) contract, t, binding, instanceQualifiers);
+                }
+            }
+        }
+
+        private <T> List<T> getInstances(TYPE clazz, Annotation[] annotations) {
+            List<InstanceContext<?>> i = _getContexts(clazz);
+            return InstanceContext.toInstances(i, annotations);
+        }
+
+        <T> List<InstanceContext<?>> getContexts(TYPE clazz, Annotation[] annotations) {
+            List<InstanceContext<?>> i = _getContexts(clazz);
+            return InstanceContext.filterInstances(i, annotations);
+        }
+
+        private <T> List<InstanceContext<?>> _getContexts(TYPE clazz) {
+            List<InstanceContext<?>> si = _getSingletons(clazz);
+            List<InstanceContext<?>> ti = _getThreadInstances(clazz);
+            if (si == null && ti != null) {
+                si = ti;
+            } else if (ti != null) {
+                si.addAll(ti);
+            }
+            return si;
+        }
+
+        <T> T getInstance(TYPE clazz, Annotation[] annotations) {
+            List<T> i = getInstances(clazz, annotations);
+            if (i != null) {
+                checkUnique(i);
+                return i.get(0);
+            }
+            return null;
+        }
+
+        void dispose() {
+            singletonInstances.forEach((clazz, instances) -> instances.forEach(instance -> preDestroy(instance.getInstance())));
+            threadPredestroyables.forEach(NonInjectionManager.this::preDestroy);
+        }
+    }
+
+    private class Instances extends TypedInstances<Class<?>> {
+    }
+
+    private class Types extends TypedInstances<Type> {
+    }
+
+    public NonInjectionManager() {
+    }
+
+    public NonInjectionManager(boolean warning) {
+        if (warning) {
+            logger.warning(LocalizationMessages.NONINJECT_FALLBACK());
+        } else {
+            logger.log(Level.FINER, LocalizationMessages.NONINJECT_FALLBACK());
+        }
+    }
+
+    @Override
+    public void completeRegistration() {
+        instances._addSingleton(InjectionManager.class, this, new InjectionManagerBinding(), null);
+    }
+
+    @Override
+    public void shutdown() {
+        shutdown = true;
+
+        disposableSupplierObjects.forEach((supplier, objects) -> objects.forEach(supplier::dispose));
+        disposableSupplierObjects.clear();
+
+        instances.dispose();
+        types.dispose();
+    }
+
+    @Override
+    public boolean isShutdown() {
+        return shutdown;
+    }
+
+    private void checkShutdown() {
+        if (shutdown) {
+            throw new IllegalStateException(LocalizationMessages.NONINJECT_SHUTDOWN());
+        }
+    }
+
+    @Override
+    public void register(Binding binding) {
+        checkShutdown();
+        if (InstanceBinding.class.isInstance(binding)) {
+            InstanceBinding instanceBinding = (InstanceBinding) binding;
+            Class<?> mainType = binding.getImplementationType();
+            if (!instanceBindings.containsKey(mainType)) { // the class could be registered twice, for reader & for writer
+                instanceBindings.add(mainType, (InstanceBinding) binding);
+            }
+            for (Type type : (Iterable<Type>) instanceBinding.getContracts()) {
+                if (isClass(type)) {
+                    if (!mainType.equals(type)) {
+                        instanceBindings.add((Class<?>) type, instanceBinding);
+                    }
+                } else {
+                    instanceTypeBindings.add(type, instanceBinding);
+                }
+            }
+        } else if (ClassBinding.class.isInstance(binding)) {
+            ClassBinding<?> contractBinding = (ClassBinding<?>) binding;
+            Class<?> mainType = binding.getImplementationType();
+            if (!contractBindings.containsKey(mainType)) { // the class could be registered twice, for reader & for writer
+                contractBindings.add(mainType, contractBinding);
+            }
+            for (Type type : contractBinding.getContracts()) {
+                if (isClass(type)) {
+                    if (!mainType.equals(type)) {
+                        contractBindings.add((Class<?>) type, contractBinding);
+                    }
+                } else {
+                    contractTypeBindings.add(type, contractBinding);
+                }
+            }
+        } else if (SupplierInstanceBinding.class.isInstance(binding)) {
+            SupplierInstanceBinding<?> supplierBinding = (SupplierInstanceBinding<?>) binding;
+            for (Type type : supplierBinding.getContracts()) {
+                if (isClass(type)) {
+                    supplierInstanceBindings.add((Class<?>) type, supplierBinding);
+                } else {
+                    supplierTypeInstanceBindings.add(type, supplierBinding);
+                }
+            }
+        } else if (SupplierClassBinding.class.isInstance(binding)) {
+            SupplierClassBinding<?> supplierBinding = (SupplierClassBinding<?>) binding;
+            for (Type type : supplierBinding.getContracts()) {
+                if (isClass(type)) {
+                    supplierClassBindings.add((Class<?>) type, supplierBinding);
+                } else {
+                    supplierTypeClassBindings.add(type, supplierBinding);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void register(Iterable<Binding> descriptors) {
+        checkShutdown();
+        for (Binding binding : descriptors) {
+            register(binding);
+        }
+    }
+
+    @Override
+    public void register(Binder binder) {
+        checkShutdown();
+        binder.getBindings().stream().iterator().forEachRemaining(this::register);
+    }
+
+    @Override
+    public void register(Object provider) throws IllegalArgumentException {
+        throw new UnsupportedOperationException("Register " + provider);
+    }
+
+    @Override
+    public boolean isRegistrable(Class<?> clazz) {
+        return false; // for external creators
+    }
+
+    @Override
+    public <T> List<ServiceHolder<T>> getAllServiceHolders(Class<T> contractOrImpl, Annotation... qualifiers) {
+        checkShutdown();
+
+        ClassBindings<T> classBindings = classBindings(contractOrImpl, qualifiers);
+        return classBindings.getAllServiceHolders(qualifiers);
+    }
+
+    @Override
+    public <T> T getInstance(Class<T> contractOrImpl, Annotation... qualifiers) {
+        checkShutdown();
+
+        ClassBindings<T> classBindings = classBindings(contractOrImpl, qualifiers);
+        classBindings.matchQualifiers(qualifiers);
+        return classBindings.getInstance();
+    }
+
+    @Override
+    public <T> T getInstance(Class<T> contractOrImpl, String classAnalyzer) {
+        throw new UnsupportedOperationException("getInstance(Class, String)");
+    }
+
+    @Override
+    public <T> T getInstance(Class<T> contractOrImpl) {
+        checkShutdown();
+
+        T instance = instances.getInstance(contractOrImpl, null);
+        if (instance != null) {
+            return instance;
+        }
+        return create(contractOrImpl);
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public <T> T getInstance(Type contractOrImpl) {
+        checkShutdown();
+
+        if (ParameterizedType.class.isInstance(contractOrImpl)) {
+            T instance = types.getInstance(contractOrImpl, null);
+            if (instance != null) {
+                return instance;
+            }
+
+            TypeBindings<T> typeBindings = typeBindings(contractOrImpl);
+            return typeBindings.getInstance();
+        } else if (isClass(contractOrImpl)) {
+            return getInstance((Class<? extends T>) contractOrImpl);
+        }
+        throw new IllegalStateException(LocalizationMessages.NONINJECT_UNSATISFIED(contractOrImpl));
+    }
+
+    private static boolean isClass(Type type) {
+        return Class.class.isAssignableFrom(type.getClass());
+    }
+
+    @Override
+    public Object getInstance(ForeignDescriptor foreignDescriptor) {
+        throw new UnsupportedOperationException("getInstance(ForeignDescriptor foreignDescriptor) ");
+    }
+
+    @Override
+    public ForeignDescriptor createForeignDescriptor(Binding binding) {
+        throw new UnsupportedOperationException("createForeignDescriptor(Binding binding) ");
+    }
+
+    @Override
+    public <T> List<T> getAllInstances(Type contractOrImpl) {
+        checkShutdown();
+
+        if (!isClass(contractOrImpl)) {
+            TypeBindings<T> typeBindings = typeBindings(contractOrImpl);
+            return typeBindings.allInstances();
+        }
+
+        @SuppressWarnings("unchecked")
+        ClassBindings<T> classBindings = classBindings((Class<T>) contractOrImpl);
+        return classBindings.allInstances();
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T> T create(Class<T> createMe) {
+        checkShutdown();
+
+        if (InjectionManager.class.equals(createMe)) {
+            return (T) this;
+        }
+        if (RequestScope.class.equals(createMe)) {
+            if (!isRequestScope) {
+                isRequestScope = true;
+                return (T) new NonInjectionRequestScope();
+            } else {
+                throw new IllegalStateException(LocalizationMessages.NONINJECT_REQUESTSCOPE_CREATED());
+            }
+        }
+
+        ClassBindings<T> classBindings = classBindings(createMe);
+        return classBindings.create();
+    }
+
+    private <T> T justCreate(Class<T> createMe) {
+        T result = null;
+        try {
+            Constructor<T> mostArgConstructor = findConstructor(createMe);
+            if (mostArgConstructor != null) {
+                int argCount = mostArgConstructor.getParameterCount();
+                if (argCount == 0) {
+                    ensureAccessible(mostArgConstructor);
+                    result = mostArgConstructor.newInstance();
+                } else if (argCount > 0) {
+                    Object[] args = getArguments(mostArgConstructor, argCount);
+                    if (args != null) {
+                        ensureAccessible(mostArgConstructor);
+                        result = mostArgConstructor.newInstance(args);
+                    }
+                }
+            }
+            if (result == null) {
+                throw new IllegalStateException(LocalizationMessages.NONINJECT_NO_CONSTRUCTOR(createMe.getName()));
+            }
+        } catch (Exception e) {
+            throw new IllegalStateException(e);
+        }
+
+        inject(result);
+        return result;
+    }
+
+    private static <T> Constructor<T> findConstructor(Class<T> forClass) {
+        Constructor<T>[] constructors = (Constructor<T>[]) forClass.getDeclaredConstructors();
+        Constructor<T> mostArgConstructor = null;
+        int argCount = -1;
+        for (Constructor<T> constructor : constructors) {
+            if (constructor.isAnnotationPresent(Inject.class) || constructor.getParameterCount() == 0) {
+                if (constructor.getParameterCount() > argCount) {
+                    mostArgConstructor = constructor;
+                    argCount = constructor.getParameterCount();
+                }
+            }
+        }
+        return mostArgConstructor;
+    }
+
+    private Object[] getArguments(Executable executable, int argCount) {
+        if (executable == null) {
+            return null;
+        }
+        Object[] args = new Object[argCount];
+        for (int i = 0; i != argCount; i++) {
+            Type type = executable.getAnnotatedParameterTypes()[i].getType();
+            args[i] = isClass(type) ? getInstance((Class<?>) type) : getInstance(type);
+        }
+        return args;
+    }
+
+    private static void ensureAccessible(Executable executable) {
+        try {
+            if (!executable.isAccessible()) {
+                executable.setAccessible(true);
+            }
+        } catch (Exception e) {
+            // consume. It will fail later with invoking the executable
+        }
+    }
+
+    private void checkUnique(List<?> list) {
+        if (list.size() != 1) {
+            throw new IllegalStateException(LocalizationMessages.NONINJECT_AMBIGUOUS_SERVICES(list.get(0)));
+        }
+    }
+
+    @Override
+    public <T> T createAndInitialize(Class<T> createMe) {
+        return justCreate(createMe);
+    }
+
+    @Override
+    public void inject(Object injectMe) {
+        Method postConstruct = getAnnotatedMethod(injectMe, PostConstruct.class);
+        if (postConstruct != null) {
+            ensureAccessible(postConstruct);
+            try {
+                postConstruct.invoke(injectMe);
+            } catch (Exception e) {
+                throw new IllegalStateException(e);
+            }
+        }
+    }
+
+    @Override
+    public void inject(Object injectMe, String classAnalyzer) {
+        throw new UnsupportedOperationException("inject(Object injectMe, String classAnalyzer)");
+    }
+
+    @Override
+    public void preDestroy(Object preDestroyMe) {
+        Method preDestroy = getAnnotatedMethod(preDestroyMe, PreDestroy.class);
+        if (preDestroy != null) {
+            ensureAccessible(preDestroy);
+            try {
+                preDestroy.invoke(preDestroyMe);
+            } catch (Exception e) {
+                throw new IllegalStateException(e);
+            }
+        }
+    }
+
+    private static Method getAnnotatedMethod(Object object, Class<? extends Annotation> annotation) {
+        Class<?> clazz = object.getClass();
+        for (Method method : clazz.getMethods()) {
+            if (method.isAnnotationPresent(annotation)
+                    && /* do not invoke interceptors */ method.getParameterCount() == 0) {
+                return method;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Some {@link Binding} requires the proxy to be created rather than just the instance,
+     * for instance a proxy of an instance supplied by a supplier that is not known at a time of the proxy creation.
+     * @param createProxy the nullable {@link Binding#isProxiable()} information
+     * @param iface the type of which the proxy is created
+     * @param supplier the reference to the supplier
+     * @param <T> the type the supplier should supply
+     * @return The proxy for the instance supplied by a supplier or the instance if not required to be proxied.
+     */
+    @SuppressWarnings("unchecked")
+    private <T> T createSupplierProxyIfNeeded(Boolean createProxy, Class<T> iface, Supplier<T> supplier) {
+        if (createProxy != null && createProxy && iface.isInterface()) {
+            T proxy = (T) Proxy.newProxyInstance(iface.getClassLoader(), new Class[]{iface}, new InvocationHandler() {
+                final SingleRegisterSupplier<T> singleSupplierRegister = new SingleRegisterSupplier<>(supplier);
+                @Override
+                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+                    T t = singleSupplierRegister.get();
+                    Object ret = method.invoke(t, args);
+                    return ret;
+                }
+            });
+            return proxy;
+        } else {
+            return registerDisposableSupplierAndGet(supplier);
+        }
+    }
+
+    /**
+     * A holder class making sure the Supplier (especially the {@link DisposableSupplier}) supplying the instance
+     * supplies (and is registered for being disposed at the end of the lifecycle) only once.
+     * @param <T>
+     */
+    private class SingleRegisterSupplier<T> {
+        private final LazyValue<T> once;
+
+        private SingleRegisterSupplier(Supplier<T> supplier) {
+            once = Values.lazy((Value<T>) () -> registerDisposableSupplierAndGet(supplier));
+        }
+
+        T get() {
+            return once.get();
+        }
+    }
+
+    private <T> T registerDisposableSupplierAndGet(Supplier<T> supplier) {
+        T instance = supplier.get();
+        if (DisposableSupplier.class.isInstance(supplier)) {
+            disposableSupplierObjects.add((DisposableSupplier<T>) supplier, instance);
+        }
+        return instance;
+    }
+
+    /**
+     * Create {@link ClassBindings} instance containing bindings and instances for the given Type.
+     * @param clazz the given class.
+     * @param instancesQualifiers The qualifiers the expected instances of the given class should have.
+     * @param <T> Expected return class type.
+     * @return the {@link ClassBindings}.
+     */
+    @SuppressWarnings("unchecked")
+    private <T> ClassBindings<T> classBindings(Class<T> clazz, Annotation... instancesQualifiers) {
+        ClassBindings<T> classBindings = new ClassBindings<>(clazz, instancesQualifiers);
+        List<InstanceBinding<?>> ib = instanceBindings.get(clazz);
+        if (ib != null) {
+            ib.forEach(binding -> classBindings.instanceBindings.add((InstanceBinding<T>) binding));
+        }
+        List<SupplierInstanceBinding<?>> sib = supplierInstanceBindings.get(clazz);
+        if (sib != null) {
+            sib.forEach(binding -> classBindings.supplierInstanceBindings.add((SupplierInstanceBinding<T>) binding));
+        }
+        List<ClassBinding<?>> cb = contractBindings.get(clazz);
+        if (cb != null) {
+            cb.forEach(binding -> classBindings.classBindings.add((ClassBinding<T>) binding));
+        }
+        List<SupplierClassBinding<?>> scb = supplierClassBindings.get(clazz);
+        if (scb != null) {
+            scb.forEach(binding -> classBindings.supplierClassBindings.add((SupplierClassBinding<T>) binding));
+        }
+        return classBindings;
+    }
+
+    /**
+     * Create {@link TypeBindings} instance containing bindings and instances for the given Type.
+     * @param type the given type.
+     * @param <T> Expected return type.
+     * @return the {@link TypeBindings}.
+     */
+    @SuppressWarnings("unchecked")
+    private <T> TypeBindings<T> typeBindings(Type type) {
+        TypeBindings<T> typeBindings = new TypeBindings<>(type);
+        List<InstanceBinding<?>> ib = instanceTypeBindings.get(type);
+        if (ib != null) {
+            ib.forEach(binding -> typeBindings.instanceBindings.add((InstanceBinding<T>) binding));
+        }
+        List<SupplierInstanceBinding<?>> sib = supplierTypeInstanceBindings.get(type);
+        if (sib != null) {
+            sib.forEach(binding -> typeBindings.supplierInstanceBindings.add((SupplierInstanceBinding<T>) binding));
+        }
+        List<ClassBinding<?>> cb = contractTypeBindings.get(type);
+        if (cb != null) {
+            cb.forEach(binding -> typeBindings.classBindings.add((ClassBinding<T>) binding));
+        }
+        List<SupplierClassBinding<?>> scb = supplierTypeClassBindings.get(type);
+        if (scb != null) {
+            scb.forEach(binding -> typeBindings.supplierClassBindings.add((SupplierClassBinding<T>) binding));
+        }
+        return typeBindings;
+    }
+
+    /**
+     * <p>
+     * A class that contains relevant bindings for a given TYPE, filtered from all registered bindings.
+     * The TYPE is either Type (ParametrizedType) or Class.
+     * </p>
+     * <p>
+     * The class also filters any bindings for which the singleton or thread-scoped instance already is created.
+     * The class either provides the existing instance, or all instances of the TYPE, or {@link ServiceHolder}s.
+     * </p>
+     * @param <X> The expected return type for the TYPE.
+     * @param <TYPE> The Type for which a {@link Binding} has been created.
+     */
+    private abstract class XBindings<X, TYPE> {
+
+        protected final List<InstanceBinding<X>> instanceBindings = new LinkedList<>();
+        protected final List<SupplierInstanceBinding<X>> supplierInstanceBindings = new LinkedList<>();
+        protected final List<ClassBinding<X>> classBindings = new LinkedList<>();
+        protected final List<SupplierClassBinding<X>> supplierClassBindings = new LinkedList<>();
+
+        protected final TYPE type;
+        protected final Annotation[] instancesQualifiers;
+        protected final TypedInstances<TYPE> instances;
+
+        protected XBindings(TYPE type, Annotation[] instancesQualifiers, TypedInstances<TYPE> instances) {
+            this.type = type;
+            this.instancesQualifiers = instancesQualifiers;
+            this.instances = instances;
+        }
+
+        int size() {
+            return instanceBindings.size()
+                    + supplierInstanceBindings.size()
+                    + classBindings.size()
+                    + supplierClassBindings.size();
+        }
+
+        private void _checkUnique() {
+            if (size() > 1) {
+                throw new IllegalStateException(LocalizationMessages.NONINJECT_AMBIGUOUS_SERVICES(type));
+            }
+        }
+
+        void filterBinding(Binding binding) {
+            if (InstanceBinding.class.isInstance(binding)) {
+                instanceBindings.remove(binding);
+            } else if (ClassBinding.class.isInstance(binding)) {
+                classBindings.remove(binding);
+            } else if (SupplierInstanceBinding.class.isInstance(binding)) {
+                supplierInstanceBindings.remove(binding);
+            } else if (SupplierClassBinding.class.isInstance(binding)) {
+                supplierClassBindings.remove(binding);
+            }
+        }
+
+        /**
+         * Match the binging qualifiers
+         * @param bindingQualifiers the qualifiers registered with the bindings
+         */
+        void matchQualifiers(Annotation... bindingQualifiers) {
+            if (bindingQualifiers != null) {
+                _filterRequested(instanceBindings, bindingQualifiers);
+                _filterRequested(classBindings, bindingQualifiers);
+                _filterRequested(supplierInstanceBindings, bindingQualifiers);
+                _filterRequested(supplierClassBindings, bindingQualifiers);
+            }
+        }
+
+        @SuppressWarnings("unchecked")
+        private void _filterRequested(List<? extends Binding<?, ?>> bindingList, Annotation... requestedQualifiers) {
+            for (Iterator<? extends Binding> bindingIterator = bindingList.iterator(); bindingIterator.hasNext();) {
+                Binding<X, ?> binding = bindingIterator.next();
+                classLoop:
+                for (Annotation requestedQualifier : requestedQualifiers) {
+                    for (Annotation bindingQualifier : binding.getQualifiers()) {
+                        if (requestedQualifier.annotationType().isInstance(bindingQualifier)) {
+                            continue classLoop;
+                        }
+                    }
+                    bindingIterator.remove();
+                }
+            }
+        }
+
+        protected boolean _isPerThread(Class<? extends Annotation> scope) {
+            return RequestScoped.class.equals(scope) || PerThread.class.equals(scope);
+        }
+
+        private X _getInstance(InstanceBinding<X> instanceBinding) {
+            return instanceBinding.getService();
+        }
+
+        private X _create(SupplierInstanceBinding<X> binding) {
+            Supplier<X> supplier = binding.getSupplier();
+            X t = registerDisposableSupplierAndGet(supplier);
+            if (Singleton.class.equals(binding.getScope())) {
+                _addInstance(t, binding);
+            } else if (_isPerThread(binding.getScope())) {
+                _addThreadInstance(t, binding);
+            }
+            return t;
+        }
+
+        X create() {
+            _checkUnique();
+            if (!instanceBindings.isEmpty()) {
+                return _getInstance(instanceBindings.get(0));
+            } else if (!supplierInstanceBindings.isEmpty()) {
+                return _create(supplierInstanceBindings.get(0));
+            } else if (!classBindings.isEmpty()) {
+                return _createAndStore(classBindings.get(0));
+            } else if (!supplierClassBindings.isEmpty()) {
+                return _create(supplierClassBindings.get(0));
+            }
+
+            throw new IllegalStateException(LocalizationMessages.NONINJECT_NO_BINDING(type));
+        }
+
+        protected X getInstance() {
+            X instance = instances.getInstance(type, instancesQualifiers);
+            if (instance != null) {
+                return instance;
+            }
+            return create();
+        }
+
+        List<X> allInstances() {
+            List<X> list = new LinkedList<>();
+            List<InstanceContext<?>> instanceContextList;
+
+            instanceContextList = instances.getContexts(type, instancesQualifiers);
+            if (instanceContextList != null) {
+                instanceContextList.forEach(instanceContext -> filterBinding(instanceContext.getBinding()));
+                instanceContextList.forEach(instanceContext -> list.add((X) instanceContext.getInstance()));
+            }
+
+            list.addAll(instanceBindings.stream()
+                    .map(this::_getInstance)
+                    .collect(Collectors.toList()));
+
+            list.addAll(classBindings.stream()
+                    .map(this::_createAndStore)
+                    .collect(Collectors.toList()));
+
+            list.addAll(supplierInstanceBindings.stream()
+                    .map(this::_create)
+                    .collect(Collectors.toList()));
+
+            list.addAll(supplierClassBindings.stream()
+                    .map(this::_create)
+                    .collect(Collectors.toList()));
+
+            return list;
+        }
+
+        protected abstract X _create(SupplierClassBinding<X> binding);
+
+        protected abstract X _createAndStore(ClassBinding<X> binding);
+
+        protected <T> T _addInstance(TYPE type, T instance, Binding<?, ?> binding) {
+            return instances.addSingleton(type, instance, binding, instancesQualifiers);
+        }
+
+        protected void _addThreadInstance(TYPE type, Object instance, Binding binding) {
+            instances.addThreadInstance(type, instance, binding, instancesQualifiers);
+        }
+
+        protected <T> T _addInstance(T instance, Binding<?, ?> binding) {
+            return instances.addSingleton(type, instance, binding, instancesQualifiers);
+        }
+
+        protected void _addThreadInstance(Object instance, Binding binding) {
+            instances.addThreadInstance(type, instance, binding, instancesQualifiers);
+        }
+    }
+
+
+    private class ClassBindings<T> extends XBindings<T, Class<?>> {
+        private ClassBindings(Class<T> clazz, Annotation[] instancesQualifiers) {
+            super(clazz, instancesQualifiers, NonInjectionManager.this.instances);
+        }
+
+        @SuppressWarnings("unchecked")
+        List<ServiceHolder<T>> getAllServiceHolders(Annotation... qualifiers) {
+            matchQualifiers(qualifiers);
+
+            List<ServiceHolder<T>> holders = new LinkedList<>();
+            List<InstanceContext<?>> instanceContextList;
+
+            instanceContextList = instances.getContexts(type, qualifiers);
+
+            if (instanceContextList != null) {
+                instanceContextList.forEach(instanceContext -> filterBinding(instanceContext.getBinding()));
+                instanceContextList.forEach(instanceContext -> holders.add(new ServiceHolderImpl<T>(
+                        (T) instanceContext.getInstance(),
+                        (Class<T>) instanceContext.getInstance().getClass(),
+                        instanceContext.getBinding().getContracts(),
+                        instanceContext.getBinding().getRank() == null ? 0 : instanceContext.getBinding().getRank())
+                ));
+            }
+
+            List<ServiceHolder<T>> instanceBindingHolders = instanceBindings.stream()
+                    .map(this::_serviceHolder)
+                    .collect(Collectors.toList());
+            holders.addAll(instanceBindingHolders);
+
+            List<ServiceHolder<T>> classBindingHolders = classBindings.stream()
+                    .filter(binding -> NonInjectionManager.this.findConstructor(binding.getService()) != null)
+                    .map(this::_serviceHolder)
+                    .collect(Collectors.toList());
+            holders.addAll(classBindingHolders);
+
+            return holders;
+        }
+
+        private <T> ServiceHolderImpl<T> _serviceHolder(InstanceBinding<T> binding) {
+            return new ServiceHolderImpl<T>(
+                    binding.getService(),
+                    binding.getImplementationType(),
+                    binding.getContracts(),
+                    binding.getRank() == null ? 0 : binding.getRank());
+        }
+
+        private <T> ServiceHolderImpl<T> _serviceHolder(ClassBinding<T> binding) {
+            return new ServiceHolderImpl<T>(
+                    NonInjectionManager.this.create(binding.getService()),
+                    binding.getImplementationType(),
+                    binding.getContracts(),
+                    binding.getRank() == null ? 0 : binding.getRank());
+        }
+
+        protected T _create(SupplierClassBinding<T> binding) {
+            Supplier<T> supplier = instances.getInstance(binding.getSupplierClass(), null);
+            if (supplier == null) {
+                supplier = justCreate(binding.getSupplierClass());
+                if (Singleton.class.equals(binding.getSupplierScope())) {
+                    supplier = instances.addSingleton(binding.getSupplierClass(), supplier, binding, null);
+                } else if (_isPerThread(binding.getSupplierScope())) {
+                    instances.addThreadInstance(binding.getSupplierClass(), supplier, binding, null);
+                }
+            }
+
+            T t = createSupplierProxyIfNeeded(binding.isProxiable(), (Class<T>) type, supplier);
+            if (Singleton.class.equals(binding.getScope())) {
+                t = _addInstance(type, t, binding);
+            } else if (_isPerThread(binding.getScope())) {
+                _addThreadInstance(type, t, binding);
+            }
+            return t;
+        }
+
+        protected T _createAndStore(ClassBinding<T> binding) {
+            T result = justCreate(binding.getService());
+            result = _addInstance(binding.getService(), result, binding);
+            return result;
+        }
+    }
+
+    private class TypeBindings<T> extends XBindings<T, Type> {
+        private TypeBindings(Type type) {
+            super(type, null, types);
+        }
+
+        protected T _create(SupplierClassBinding<T> binding) {
+            Supplier<T> supplier = justCreate(binding.getSupplierClass());
+
+            T t = registerDisposableSupplierAndGet(supplier);
+            if (Singleton.class.equals(binding.getScope())) {
+                t = _addInstance(type, t, binding);
+            } else if (_isPerThread(binding.getScope())) {
+                _addThreadInstance(type, t, binding);
+            }
+            return t;
+        }
+
+        @Override
+        protected T _createAndStore(ClassBinding<T> binding) {
+            T result = justCreate(binding.getService());
+            result = _addInstance(type, result, binding);
+            return result;
+        }
+
+        @SuppressWarnings("unchecked")
+        @Override
+        T create() {
+            if (ParameterizedType.class.isInstance(type)) {
+                ParameterizedType pt = (ParameterizedType) type;
+                if (Provider.class.equals(pt.getRawType())) {
+                    return (T) new Provider<Object>() {
+                        final SingleRegisterSupplier<Object> supplier = new SingleRegisterSupplier<>(new Supplier<Object>() {
+                            @Override
+                            public Object get() {
+                                Type actualTypeArgument = pt.getActualTypeArguments()[0];
+                                if (isClass(actualTypeArgument)) {
+                                    return NonInjectionManager.this.getInstance((Class<? extends T>) actualTypeArgument);
+                                } else {
+                                    return NonInjectionManager.this.getInstance(actualTypeArgument);
+                                }
+                            }
+                        });
+
+                        @Override
+                        public Object get() {
+                            return supplier.get(); //Not disposable
+                        }
+                    };
+                }
+            }
+            return super.create();
+        }
+    }
+
+    /**
+     * A triplet of created instance, the registered {@link Binding} that prescribed the creation of the instance
+     * and {@link Annotation qualifiers} the instance was created with.
+     * @param <T> type of the instance.
+     * @see NonInjectionManager#getInstance(Class, Annotation[])
+     */
+    private static class InstanceContext<T> {
+        private final T instance;
+        private final Binding<?, ?> binding;
+        private final Annotation[] createdWithQualifiers;
+
+        private InstanceContext(T instance, Binding<?, ?> binding, Annotation[] qualifiers) {
+            this.instance = instance;
+            this.binding = binding;
+            this.createdWithQualifiers = qualifiers;
+        }
+
+        public Binding<?, ?> getBinding() {
+            return binding;
+        }
+
+        public T getInstance() {
+            return instance;
+        }
+
+        @SuppressWarnings("unchecked")
+        static <T> List<T> toInstances(List<InstanceContext<?>> instances, Annotation[] qualifiers) {
+            return instances != null
+                    ? instances.stream()
+                        .filter(instance -> instance.hasQualifiers(qualifiers))
+                        .map(pair -> (T) pair.getInstance())
+                        .collect(Collectors.toList())
+                    : null;
+        }
+
+        private static List<InstanceContext<?>> filterInstances(List<InstanceContext<?>> instances, Annotation... qualifiers) {
+            return instances != null
+                    ? instances.stream()
+                        .filter(instance -> instance.hasQualifiers(qualifiers))
+                        .collect(Collectors.toList())
+                    : null;
+        }
+
+        private boolean hasQualifiers(Annotation[] requested) {
+            if (requested != null) {
+                classLoop:
+                for (Annotation req : requested) {
+                    if (createdWithQualifiers != null) {
+                        for (Annotation cur : createdWithQualifiers) {
+                            if (cur.annotationType().isInstance(req)) {
+                                continue classLoop;
+                            }
+                        }
+                        return false;
+                    }
+                }
+            }
+            return true;
+        }
+    }
+
+    /**
+     * Singleton Binding this {@link NonInjectionManager} was supposed to be created based upon.
+     */
+    private static final class InjectionManagerBinding extends Binding<InjectionManager, Binding<?, ?>> {
+    }
+
+}
diff --git a/core-client/src/main/java/org/glassfish/jersey/client/innate/inject/NonInjectionRequestScope.java b/core-client/src/main/java/org/glassfish/jersey/client/innate/inject/NonInjectionRequestScope.java
new file mode 100644
index 0000000..258780d
--- /dev/null
+++ b/core-client/src/main/java/org/glassfish/jersey/client/innate/inject/NonInjectionRequestScope.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package org.glassfish.jersey.client.innate.inject;
+
+import org.glassfish.jersey.internal.util.ExtendedLogger;
+import org.glassfish.jersey.internal.util.LazyUid;
+import org.glassfish.jersey.process.internal.RequestScope;
+
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class NonInjectionRequestScope extends RequestScope {
+    @Override
+    public org.glassfish.jersey.process.internal.RequestContext createContext() {
+        return new Instance();
+    }
+
+    /**
+     * Implementation of the request scope instance.
+     */
+    public static final class Instance implements org.glassfish.jersey.process.internal.RequestContext {
+
+        private static final ExtendedLogger logger = new ExtendedLogger(Logger.getLogger(Instance.class.getName()), Level.FINEST);
+
+        /*
+         * Scope instance UUID.
+         *
+         * For performance reasons, it's only generated if toString() method is invoked,
+         * e.g. as part of some low-level logging.
+         */
+        private final LazyUid id = new LazyUid();
+
+        /**
+         * Holds the number of snapshots of this scope.
+         */
+        private final AtomicInteger referenceCounter;
+
+        private Instance() {
+            this.referenceCounter = new AtomicInteger(1);
+        }
+
+        /**
+         * Get a "new" reference of the scope instance. This will increase
+         * the internal reference counter which prevents the scope instance
+         * to be destroyed until a {@link #release()} method is explicitly
+         * called (once per each {@code getReference()} method call).
+         *
+         * @return referenced scope instance.
+         */
+        @Override
+        public NonInjectionRequestScope.Instance getReference() {
+            // TODO: replace counter with a phantom reference + reference queue-based solution
+            referenceCounter.incrementAndGet();
+            return this;
+        }
+
+
+        /**
+         * Release a single reference to the current request scope instance.
+         * <p>
+         * Once all instance references are released, the instance will be recycled.
+         */
+        @Override
+        public void release() {
+            referenceCounter.decrementAndGet();
+        }
+
+        @Override
+        public String toString() {
+            return "Instance{"
+                    + "id=" + id
+                    + ", referenceCounter=" + referenceCounter
+                    + '}';
+        }
+    }
+}
diff --git a/core-client/src/main/resources/org/glassfish/jersey/client/internal/localization.properties b/core-client/src/main/resources/org/glassfish/jersey/client/internal/localization.properties
index e66ceab..ee80184 100644
--- a/core-client/src/main/resources/org/glassfish/jersey/client/internal/localization.properties
+++ b/core-client/src/main/resources/org/glassfish/jersey/client/internal/localization.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License v. 2.0, which is available at
@@ -48,7 +48,14 @@
   Using default cached thread pool.
 negative.chunk.size=Negative chunked HTTP transfer coding chunk size value specified in the client configuration property: [{0}] \
   Reverting to programmatically set default: [{1}]
-negative.input.parameter="Input parameter {0} must not be negative."
+negative.input.parameter="Input parameter {0} must not be negative1."
+noninject.ambiguous.services=Ambiguous providing services ${0}.
+noninject.fallback=Falling back to injection-less client.
+noninject.no.constructor=No applicable constructor for ${0} found.
+noninject.no.binding=No binding found for ${0}.
+noninject.requestscope.created=RequestScope already created.
+noninject.shutdown=InjectionManager is already shutdown.
+noninject.unsatisfied=Unsatisfied dependency for ${0}.
 null.connector.provider=ConnectorProvider must not be set to null.
 null.executor.service=ExecutorService must not be set to null.
 null.input.parameter=Input method parameter {0} must not be null.
diff --git a/core-client/src/test/java/org/glassfish/jersey/client/ClientConfigTest.java b/core-client/src/test/java/org/glassfish/jersey/client/ClientConfigTest.java
index eff6b19..9dc98e5 100644
--- a/core-client/src/test/java/org/glassfish/jersey/client/ClientConfigTest.java
+++ b/core-client/src/test/java/org/glassfish/jersey/client/ClientConfigTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -112,7 +112,7 @@
     }
 
     @Provider
-    public class MyProvider implements ContextResolver<String> {
+    public static class MyProvider implements ContextResolver<String> {
 
         @Override
         public String getContext(final Class<?> type) {
diff --git a/core-client/src/test/java/org/glassfish/jersey/client/JerseyClientTest.java b/core-client/src/test/java/org/glassfish/jersey/client/JerseyClientTest.java
index 41d9efb..fbee0e5 100644
--- a/core-client/src/test/java/org/glassfish/jersey/client/JerseyClientTest.java
+++ b/core-client/src/test/java/org/glassfish/jersey/client/JerseyClientTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -272,8 +272,12 @@
     }
 
     public static class CustomProvider implements ClientRequestFilter {
+        private final CustomContract customContract;
+
         @Inject
-        private CustomContract customContract;
+        CustomProvider(CustomContract customContract) {
+            this.customContract = customContract;
+        }
 
         @Override
         public void filter(ClientRequestContext requestContext) throws IOException {
diff --git a/core-client/src/test/java/org/glassfish/jersey/client/JerseyCompletionStageRxInvokerTest.java b/core-client/src/test/java/org/glassfish/jersey/client/JerseyCompletionStageRxInvokerTest.java
index 53c9c28..0b1818d 100644
--- a/core-client/src/test/java/org/glassfish/jersey/client/JerseyCompletionStageRxInvokerTest.java
+++ b/core-client/src/test/java/org/glassfish/jersey/client/JerseyCompletionStageRxInvokerTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -34,7 +34,6 @@
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsString;
@@ -71,7 +70,6 @@
     }
 
     @Test
-    @Disabled("TODO JAX-RS 2.1")
     public void testNewClientExecutor() throws Exception {
         testClient(ClientBuilder.newBuilder()
                                 .executorService(executor)
diff --git a/core-client/src/test/java/org/glassfish/jersey/client/spi/PreInvocationInterceptorTest.java b/core-client/src/test/java/org/glassfish/jersey/client/spi/PreInvocationInterceptorTest.java
index a438a58..d121b44 100644
--- a/core-client/src/test/java/org/glassfish/jersey/client/spi/PreInvocationInterceptorTest.java
+++ b/core-client/src/test/java/org/glassfish/jersey/client/spi/PreInvocationInterceptorTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -22,13 +22,13 @@
 import org.junit.jupiter.api.Test;
 
 import javax.annotation.Priority;
+import javax.inject.Inject;
 import javax.ws.rs.ProcessingException;
 import javax.ws.rs.client.ClientBuilder;
 import javax.ws.rs.client.ClientRequestContext;
 import javax.ws.rs.client.ClientRequestFilter;
 import javax.ws.rs.client.Invocation;
 import javax.ws.rs.core.Configuration;
-import javax.ws.rs.core.Context;
 import javax.ws.rs.core.Response;
 import java.io.IOException;
 import java.util.concurrent.ExecutionException;
@@ -263,8 +263,12 @@
     }
 
     private static class InjectedPreInvocationInterceptor implements PreInvocationInterceptor {
-        @Context
-        Configuration configuration;
+        private final Configuration configuration;
+
+        @Inject
+        public InjectedPreInvocationInterceptor(Configuration configuration) {
+            this.configuration = configuration;
+        }
 
         @Override
         public void beforeRequest(ClientRequestContext requestContext) {
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/JaxrsProviders.java b/core-common/src/main/java/org/glassfish/jersey/internal/JaxrsProviders.java
index 81364a1..d88730f 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/JaxrsProviders.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/JaxrsProviders.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -62,12 +62,18 @@
         }
     }
 
+    private final Provider<MessageBodyWorkers> workers;
+    private final Provider<ContextResolvers> resolvers;
+    private final Provider<ExceptionMappers> mappers;
+
     @Inject
-    private Provider<MessageBodyWorkers> workers;
-    @Inject
-    private Provider<ContextResolvers> resolvers;
-    @Inject
-    private Provider<ExceptionMappers> mappers;
+    public JaxrsProviders(Provider<MessageBodyWorkers> workers,
+                          Provider<ContextResolvers> resolvers,
+                          Provider<ExceptionMappers> mappers) {
+        this.workers = workers;
+        this.resolvers = resolvers;
+        this.mappers = mappers;
+    }
 
     @Override
     public <T> MessageBodyReader<T> getMessageBodyReader(Class<T> type,
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/Injections.java b/core-common/src/main/java/org/glassfish/jersey/internal/inject/Injections.java
index d2ff00d..f944637 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/Injections.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/inject/Injections.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -20,6 +20,8 @@
 import java.util.List;
 import java.util.Optional;
 
+import javax.ws.rs.ConstrainedTo;
+import javax.ws.rs.RuntimeType;
 import javax.ws.rs.WebApplicationException;
 
 import org.glassfish.jersey.internal.LocalizationMessages;
@@ -36,22 +38,32 @@
 public class Injections {
 
     /**
-     * Creates a {@link InjectionManager} without parent and initial binder.
+     * Creates an {@link InjectionManager} without parent and initial binder.
      *
-     * @return a injection manager with all the bindings.
+     * @return an injection manager with all the bindings.
      */
     public static InjectionManager createInjectionManager() {
-        return lookupInjectionManagerFactory().create();
+        return lookupInjectionManagerFactory(RuntimeType.SERVER).create();
+    }
+
+    /**
+     * Creates an {@link InjectionManager} without parent and initial binder.
+     * @param type {@link RuntimeType} the {@link InjectionManagerFactory} must be {@link ConstrainedTo} if annotated.
+     *
+     * @return an injection manager with all the bindings.
+     */
+    public static InjectionManager createInjectionManager(RuntimeType type) {
+        return lookupInjectionManagerFactory(type).create();
     }
 
     /**
      * Creates a {@link InjectionManager} with initial binder that is immediately registered.
      *
      * @param binder custom the {@link Binder binder}.
-     * @return a injection manager with all the bindings.
+     * @return an injection manager with all the bindings.
      */
     public static InjectionManager createInjectionManager(Binder binder) {
-        InjectionManagerFactory injectionManagerFactory = lookupInjectionManagerFactory();
+        InjectionManagerFactory injectionManagerFactory = lookupInjectionManagerFactory(RuntimeType.SERVER);
         InjectionManager injectionManager = injectionManagerFactory.create();
         injectionManager.register(binder);
         return injectionManager;
@@ -66,11 +78,11 @@
      * @return an injection manager with all the bindings.
      */
     public static InjectionManager createInjectionManager(Object parent) {
-        return lookupInjectionManagerFactory().create(parent);
+        return lookupInjectionManagerFactory(RuntimeType.SERVER).create(parent);
     }
 
-    private static InjectionManagerFactory lookupInjectionManagerFactory() {
-        return lookupService(InjectionManagerFactory.class)
+    private static InjectionManagerFactory lookupInjectionManagerFactory(RuntimeType type) {
+        return lookupService(InjectionManagerFactory.class, type)
                 .orElseThrow(() -> new IllegalStateException(LocalizationMessages.INJECTION_MANAGER_FACTORY_NOT_FOUND()));
     }
 
@@ -80,12 +92,17 @@
      *
      * @param clazz type of service to look for.
      * @param <T>   type of service to look for.
+     * @param type {@link RuntimeType} the {@link InjectionManagerFactory} must be {@link ConstrainedTo} if annotated.
      * @return instance of service with highest priority or {@code null} if service of given type cannot be found.
      * @see javax.annotation.Priority
      */
-    private static <T> Optional<T> lookupService(final Class<T> clazz) {
+    private static <T> Optional<T> lookupService(final Class<T> clazz, RuntimeType type) {
         List<RankedProvider<T>> providers = new LinkedList<>();
         for (T provider : ServiceFinder.find(clazz)) {
+            ConstrainedTo constrain = provider.getClass().getAnnotation(ConstrainedTo.class);
+            if (constrain != null && type != constrain.value()) {
+                continue;
+            }
             providers.add(new RankedProvider<>(provider));
         }
         providers.sort(new RankedComparator<>(RankedComparator.Order.DESCENDING));
diff --git a/core-common/src/main/java/org/glassfish/jersey/message/internal/SourceProvider.java b/core-common/src/main/java/org/glassfish/jersey/message/internal/SourceProvider.java
index acd27d8..f140dfc 100644
--- a/core-common/src/main/java/org/glassfish/jersey/message/internal/SourceProvider.java
+++ b/core-common/src/main/java/org/glassfish/jersey/message/internal/SourceProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -22,11 +22,11 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
+import javax.inject.Inject;
 import javax.ws.rs.BadRequestException;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.InternalServerErrorException;
 import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.ext.MessageBodyReader;
@@ -95,7 +95,8 @@
 
         private final Provider<SAXParserFactory> spf;
 
-        public SaxSourceReader(@Context Provider<SAXParserFactory> spf) {
+        @Inject
+        public SaxSourceReader(Provider<SAXParserFactory> spf) {
             this.spf = spf;
         }
 
@@ -135,7 +136,8 @@
 
         private final Provider<DocumentBuilderFactory> dbf;
 
-        public DomSourceReader(@Context Provider<DocumentBuilderFactory> dbf) {
+        @Inject
+        public DomSourceReader(Provider<DocumentBuilderFactory> dbf) {
             this.dbf = dbf;
         }
 
@@ -176,8 +178,9 @@
         private final Provider<SAXParserFactory> saxParserFactory;
         private final Provider<TransformerFactory> transformerFactory;
 
-        public SourceWriter(@Context Provider<SAXParserFactory> spf,
-                @Context Provider<TransformerFactory> tf) {
+        @Inject
+        public SourceWriter(Provider<SAXParserFactory> spf,
+                            Provider<TransformerFactory> tf) {
             this.saxParserFactory = spf;
             this.transformerFactory = tf;
         }
diff --git a/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/EntityInspectorImpl.java b/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/EntityInspectorImpl.java
index 0e353f4..d5f4d71 100644
--- a/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/EntityInspectorImpl.java
+++ b/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/EntityInspectorImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -51,9 +51,7 @@
 @Singleton
 final class EntityInspectorImpl implements EntityInspector {
     private final List<EntityProcessor> entityProcessors;
-
-    @Inject
-    private EntityGraphProvider graphProvider;
+    private final EntityGraphProvider graphProvider;
 
     /**
      * Constructor expecting {@link InjectionManager} to be injected.
@@ -61,10 +59,11 @@
      * @param injectionManager injection manager to be injected.
      */
     @Inject
-    public EntityInspectorImpl(final InjectionManager injectionManager) {
+    public EntityInspectorImpl(final InjectionManager injectionManager, EntityGraphProvider graphProvider) {
         Spliterator<EntityProcessor> entities =
                 Providers.getAllProviders(injectionManager, EntityProcessor.class, new RankedComparator<>()).spliterator();
         this.entityProcessors = StreamSupport.stream(entities, false).collect(Collectors.toList());
+        this.graphProvider = graphProvider;
     }
 
     @Override
diff --git a/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/ObjectGraphProvider.java b/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/ObjectGraphProvider.java
index 5f911e3..6c8e85f 100644
--- a/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/ObjectGraphProvider.java
+++ b/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/ObjectGraphProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -17,7 +17,12 @@
 package org.glassfish.jersey.message.filtering;
 
 import org.glassfish.jersey.message.filtering.spi.AbstractObjectProvider;
+import org.glassfish.jersey.message.filtering.spi.EntityGraphProvider;
+import org.glassfish.jersey.message.filtering.spi.EntityInspector;
 import org.glassfish.jersey.message.filtering.spi.ObjectGraph;
+import org.glassfish.jersey.message.filtering.spi.ScopeProvider;
+
+import javax.inject.Inject;
 
 /**
  * {@link org.glassfish.jersey.message.filtering.spi.ObjectProvider Object provider} and
@@ -28,6 +33,13 @@
  */
 final class ObjectGraphProvider extends AbstractObjectProvider<ObjectGraph> {
 
+    @Inject
+    public ObjectGraphProvider(ScopeProvider scopeProvider,
+                                  EntityInspector entityInspector,
+                                  EntityGraphProvider graphProvider) {
+        super(scopeProvider, entityInspector, graphProvider);
+    }
+
     @Override
     public ObjectGraph transform(final ObjectGraph graph) {
         return graph;
diff --git a/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/spi/AbstractObjectProvider.java b/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/spi/AbstractObjectProvider.java
index 94118cd..4793f21 100644
--- a/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/spi/AbstractObjectProvider.java
+++ b/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/spi/AbstractObjectProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -46,15 +46,18 @@
 
     private final Cache<EntityContext, T> filteringObjects = CacheBuilder.newBuilder().maximumSize(PROVIDER_CACHE_SIZE).build();
 
-    @Inject
     private ScopeProvider scopeProvider;
-
-    @Inject
     private EntityInspector entityInspector;
-
-    @Inject
     private EntityGraphProvider graphProvider;
 
+    public AbstractObjectProvider(ScopeProvider scopeProvider,
+                                  EntityInspector entityInspector,
+                                  EntityGraphProvider graphProvider) {
+        this.scopeProvider = scopeProvider;
+        this.entityInspector = entityInspector;
+        this.graphProvider = graphProvider;
+    }
+
     @Override
     public final T getFilteringObject(final Type genericType, final boolean forWriter, final Annotation... annotations) {
         return getFilteringObject(FilteringHelper.getEntityClass(genericType), forWriter, annotations);
diff --git a/ext/metainf-services/src/test/java/org/glassfish/jersey/message/MetaInfServicesTest.java b/ext/metainf-services/src/test/java/org/glassfish/jersey/message/MetaInfServicesTest.java
index f1ad7da..cb0c845 100644
--- a/ext/metainf-services/src/test/java/org/glassfish/jersey/message/MetaInfServicesTest.java
+++ b/ext/metainf-services/src/test/java/org/glassfish/jersey/message/MetaInfServicesTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -22,13 +22,13 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
+import javax.inject.Inject;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.client.Entity;
 import javax.ws.rs.core.Application;
 import javax.ws.rs.core.Configuration;
-import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
@@ -72,7 +72,10 @@
 
     public static class MessageProvider implements MessageBodyReader<MetaInf>, MessageBodyWriter<MetaInf> {
 
-        @Context
+        @Inject
+        MessageProvider(Configuration configuration) {
+            this.config = configuration;
+        }
         private Configuration config;
 
         @Override
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/injector/JerseyProxyResolverTest.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/injector/JerseyProxyResolverTest.java
index 521b805..486aad0 100644
--- a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/injector/JerseyProxyResolverTest.java
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/injector/JerseyProxyResolverTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -96,7 +96,7 @@
 
     @Test
     public void testProxyCreated() {
-        MyInjectionResolver injectionResolver = new MyInjectionResolver(new JaxrsProviders());
+        MyInjectionResolver injectionResolver = new MyInjectionResolver(new JaxrsProviders(null, null, null));
         InjecteeImpl injectee = new InjecteeImpl();
         injectee.setRequiredType(Providers.class);
         injectee.setParent(FIELDS[0]);
@@ -108,7 +108,7 @@
 
     @Test
     public void testProxyCached() {
-        MyInjectionResolver injectionResolver = new MyInjectionResolver(new JaxrsProviders());
+        MyInjectionResolver injectionResolver = new MyInjectionResolver(new JaxrsProviders(null, null, null));
         InjecteeImpl injectee1 = new InjecteeImpl();
         injectee1.setRequiredType(Providers.class);
         injectee1.setParent(FIELDS[0]);
@@ -125,7 +125,7 @@
 
     @Test
     public void testProxyCacheNotMismatched() {
-        MyInjectionResolver injectionResolver1 = new MyInjectionResolver(new JaxrsProviders());
+        MyInjectionResolver injectionResolver1 = new MyInjectionResolver(new JaxrsProviders(null, null, null));
         InjecteeImpl injectee1 = new InjecteeImpl();
         injectee1.setRequiredType(Providers.class);
         injectee1.setParent(FIELDS[0]);
diff --git a/incubator/injectless-client/pom.xml b/incubator/injectless-client/pom.xml
new file mode 100644
index 0000000..91b14fd
--- /dev/null
+++ b/incubator/injectless-client/pom.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+
+    This program and the accompanying materials are made available under the
+    terms of the Eclipse Public License v. 2.0, which is available at
+    http://www.eclipse.org/legal/epl-2.0.
+
+    This Source Code may also be made available under the following Secondary
+    Licenses when the conditions for such availability set forth in the
+    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+    version 2 with the GNU Classpath Exception, which is available at
+    https://www.gnu.org/software/classpath/license.html.
+
+    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.glassfish.jersey.incubator</groupId>
+        <artifactId>project</artifactId>
+        <version>2.39-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>jersey-injectless-client</artifactId>
+    <packaging>jar</packaging>
+    <name>jersey-inject-injectless-client</name>
+
+    <description>Client side support of no injection mechanism</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.glassfish.jersey.core</groupId>
+            <artifactId>jersey-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.core</groupId>
+            <artifactId>jersey-client</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <inherited>true</inherited>
+                <extensions>true</extensions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/incubator/injectless-client/src/main/java/org/glassfish/jersey/inject/injectless/NonInjectionManagerFactory.java b/incubator/injectless-client/src/main/java/org/glassfish/jersey/inject/injectless/NonInjectionManagerFactory.java
new file mode 100644
index 0000000..43b17aa
--- /dev/null
+++ b/incubator/injectless-client/src/main/java/org/glassfish/jersey/inject/injectless/NonInjectionManagerFactory.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+package org.glassfish.jersey.inject.injectless;
+
+import org.glassfish.jersey.client.innate.inject.NonInjectionManager;
+import org.glassfish.jersey.internal.inject.InjectionManager;
+import org.glassfish.jersey.internal.inject.InjectionManagerFactory;
+
+import javax.annotation.Priority;
+import javax.inject.Inject;
+import javax.ws.rs.ConstrainedTo;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.RuntimeType;
+
+/**
+ * <p>
+ *     This {@link InjectionManagerFactory} implementation provides a special {@link InjectionManager}. The highest priority
+ *     of this injection manager is not to require any DI container. It is designed for pure REST client performing a request
+ *     without a further requirements for performing injections in the customer client classes, such a filter or a provider.
+ *     It means the customer classes do not have any injection points defined by {@link Inject} or {@link Context}.
+ * </p>
+ * <p>
+ *     Using this injection manager does not prevent using any Jersey modules (such as Jersey-Media-Jackson module) from working
+ *     with the client.
+ * </p>
+ */
+@Priority(15)
+@ConstrainedTo(RuntimeType.CLIENT)
+public class NonInjectionManagerFactory implements InjectionManagerFactory {
+    @Override
+    public InjectionManager create(Object parent) {
+        return new NonInjectionManager(false);
+    }
+}
diff --git a/incubator/injectless-client/src/main/resources/META-INF/services/org.glassfish.jersey.internal.inject.InjectionManagerFactory b/incubator/injectless-client/src/main/resources/META-INF/services/org.glassfish.jersey.internal.inject.InjectionManagerFactory
new file mode 100644
index 0000000..8473fa4
--- /dev/null
+++ b/incubator/injectless-client/src/main/resources/META-INF/services/org.glassfish.jersey.internal.inject.InjectionManagerFactory
@@ -0,0 +1 @@
+org.glassfish.jersey.inject.injectless.NonInjectionManagerFactory
\ No newline at end of file
diff --git a/incubator/kryo/src/main/java/org/glassfish/jersey/kryo/internal/KryoMessageBodyProvider.java b/incubator/kryo/src/main/java/org/glassfish/jersey/kryo/internal/KryoMessageBodyProvider.java
index 096c0a8..35c695a 100644
--- a/incubator/kryo/src/main/java/org/glassfish/jersey/kryo/internal/KryoMessageBodyProvider.java
+++ b/incubator/kryo/src/main/java/org/glassfish/jersey/kryo/internal/KryoMessageBodyProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -23,11 +23,10 @@
 import java.lang.reflect.Type;
 import java.util.Optional;
 
+import javax.inject.Inject;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Configuration;
-import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.ext.ContextResolver;
@@ -55,7 +54,8 @@
     private final ContextResolver<Kryo> contextResolver;
     private final Optional<KryoPool> kryoPool;
 
-    public KryoMessageBodyProvider(@Context Providers providers) {
+    @Inject
+    public KryoMessageBodyProvider(Providers providers) {
         final MediaType mediaType = new MediaType("application", "x-kryo");
         contextResolver = providers.getContextResolver(Kryo.class, mediaType);
         kryoPool = getKryoPool();
diff --git a/incubator/pom.xml b/incubator/pom.xml
index 3718fc2..bd095bf 100644
--- a/incubator/pom.xml
+++ b/incubator/pom.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
 
-    Copyright (c) 2011, 2022 Oracle and/or its affiliates. All rights reserved.
+    Copyright (c) 2011, 2023 Oracle and/or its affiliates. All rights reserved.
 
     This program and the accompanying materials are made available under the
     terms of the Eclipse Public License v. 2.0, which is available at
@@ -40,6 +40,7 @@
         <module>declarative-linking</module>
         <module>gae-integration</module>
         <module>html-json</module>
+        <module>injectless-client</module>
         <module>kryo</module>
         <module>open-tracing</module>
     </modules>
diff --git a/inject/cdi2-se/src/test/java/org/glassfish/jersey/inject/cdi/se/injector/JerseyProxyResolverTest.java b/inject/cdi2-se/src/test/java/org/glassfish/jersey/inject/cdi/se/injector/JerseyProxyResolverTest.java
index 5f071b1..b0de0e6 100644
--- a/inject/cdi2-se/src/test/java/org/glassfish/jersey/inject/cdi/se/injector/JerseyProxyResolverTest.java
+++ b/inject/cdi2-se/src/test/java/org/glassfish/jersey/inject/cdi/se/injector/JerseyProxyResolverTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -97,7 +97,7 @@
 
     @Test
     public void testProxyCreated() {
-        MyInjectionResolver injectionResolver = new MyInjectionResolver(new JaxrsProviders());
+        MyInjectionResolver injectionResolver = new MyInjectionResolver(new JaxrsProviders(null, null, null));
         InjecteeImpl injectee = new InjecteeImpl();
         injectee.setRequiredType(Providers.class);
         injectee.setParent(FIELDS[0]);
@@ -109,7 +109,7 @@
 
     @Test
     public void testProxyCached() {
-        MyInjectionResolver injectionResolver = new MyInjectionResolver(new JaxrsProviders());
+        MyInjectionResolver injectionResolver = new MyInjectionResolver(new JaxrsProviders(null, null, null));
         InjecteeImpl injectee1 = new InjecteeImpl();
         injectee1.setRequiredType(Providers.class);
         injectee1.setParent(FIELDS[0]);
@@ -126,7 +126,7 @@
 
     @Test
     public void testProxyCacheNotMismatched() {
-        MyInjectionResolver injectionResolver1 = new MyInjectionResolver(new JaxrsProviders());
+        MyInjectionResolver injectionResolver1 = new MyInjectionResolver(new JaxrsProviders(null, null, null));
         InjecteeImpl injectee1 = new InjecteeImpl();
         injectee1.setRequiredType(Providers.class);
         injectee1.setParent(FIELDS[0]);
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/AbstractCollectionJaxbProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/AbstractCollectionJaxbProvider.java
index 075e866..ec70496 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/AbstractCollectionJaxbProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/AbstractCollectionJaxbProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -39,6 +39,7 @@
 import javax.ws.rs.BadRequestException;
 import javax.ws.rs.InternalServerErrorException;
 import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Configuration;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.NoContentException;
@@ -120,12 +121,12 @@
         }
     };
 
-    public AbstractCollectionJaxbProvider(Providers ps) {
-        super(ps);
+    public AbstractCollectionJaxbProvider(Providers ps, Configuration config) {
+        super(ps, config);
     }
 
-    public AbstractCollectionJaxbProvider(Providers ps, MediaType mt) {
-        super(ps, mt);
+    public AbstractCollectionJaxbProvider(Providers ps, MediaType mt, Configuration config) {
+        super(ps, mt, config);
     }
 
     @Override
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/AbstractJaxbElementProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/AbstractJaxbElementProvider.java
index 78cc2fd..9481a8c 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/AbstractJaxbElementProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/AbstractJaxbElementProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -27,6 +27,7 @@
 import javax.ws.rs.BadRequestException;
 import javax.ws.rs.InternalServerErrorException;
 import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Configuration;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.NoContentException;
@@ -67,8 +68,8 @@
      *
      * @param providers JAX-RS providers.
      */
-    public AbstractJaxbElementProvider(Providers providers) {
-        super(providers);
+    public AbstractJaxbElementProvider(Providers providers, Configuration config) {
+        super(providers, config);
     }
 
     /**
@@ -77,8 +78,8 @@
      * @param providers         JAX-RS providers.
      * @param resolverMediaType JAXB component context resolver media type to be used.
      */
-    public AbstractJaxbElementProvider(Providers providers, MediaType resolverMediaType) {
-        super(providers, resolverMediaType);
+    public AbstractJaxbElementProvider(Providers providers, MediaType resolverMediaType, Configuration config) {
+        super(providers, resolverMediaType, config);
     }
 
     @Override
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/AbstractJaxbProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/AbstractJaxbProvider.java
index f512398..04342c4 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/AbstractJaxbProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/AbstractJaxbProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -25,7 +25,6 @@
 import java.util.logging.Logger;
 
 import javax.ws.rs.core.Configuration;
-import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.ext.ContextResolver;
 import javax.ws.rs.ext.Providers;
@@ -71,8 +70,8 @@
      *
      * @param providers JAX-RS providers.
      */
-    public AbstractJaxbProvider(final Providers providers) {
-        this(providers, null);
+    public AbstractJaxbProvider(final Providers providers, final Configuration config) {
+        this(providers, null, config);
     }
 
     /**
@@ -81,7 +80,7 @@
      * @param providers         JAX-RS providers.
      * @param resolverMediaType JAXB component context resolver media type to be used.
      */
-    public AbstractJaxbProvider(final Providers providers, final MediaType resolverMediaType) {
+    public AbstractJaxbProvider(final Providers providers, final MediaType resolverMediaType, final Configuration config) {
         this.jaxrsProviders = providers;
 
         fixedResolverMediaType = resolverMediaType != null;
@@ -112,10 +111,10 @@
             this.mtUnmarshaller = null;
             this.mtMarshaller = null;
         }
+        setConfiguration(config);
     }
 
     // TODO This provider should be registered and configured via a feature.
-    @Context
     public void setConfiguration(final Configuration config) {
         formattedOutput = Values.lazy(new Value<Boolean>() {
 
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/AbstractRootElementJaxbProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/AbstractRootElementJaxbProvider.java
index 9d686e7..261e982 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/AbstractRootElementJaxbProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/AbstractRootElementJaxbProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -26,6 +26,7 @@
 import javax.ws.rs.BadRequestException;
 import javax.ws.rs.InternalServerErrorException;
 import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Configuration;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.NoContentException;
@@ -69,8 +70,8 @@
      *
      * @param providers JAX-RS providers.
      */
-    public AbstractRootElementJaxbProvider(Providers providers) {
-        super(providers);
+    public AbstractRootElementJaxbProvider(Providers providers, Configuration config) {
+        super(providers, config);
     }
 
     /**
@@ -79,8 +80,8 @@
      * @param providers JAX-RS providers.
      * @param resolverMediaType JAXB component context resolver media type to be used.
      */
-    public AbstractRootElementJaxbProvider(Providers providers, MediaType resolverMediaType) {
-        super(providers, resolverMediaType);
+    public AbstractRootElementJaxbProvider(Providers providers, MediaType resolverMediaType, Configuration config) {
+        super(providers, resolverMediaType, config);
     }
 
     @Override
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/DocumentBuilderFactoryInjectionProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/DocumentBuilderFactoryInjectionProvider.java
index b5b3ec8..064482b 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/DocumentBuilderFactoryInjectionProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/DocumentBuilderFactoryInjectionProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -39,11 +39,11 @@
      */
     // TODO This provider should be registered and configured via a feature.
     @Inject
-    public DocumentBuilderFactoryInjectionProvider(final Configuration config) {
+    public DocumentBuilderFactoryInjectionProvider(final InjectionManager injectionManager, final Configuration config) {
         super(config);
+        this.injectionManager = injectionManager;
     }
 
-    @Inject
     private InjectionManager injectionManager;
 
     @Override
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/DocumentProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/DocumentProvider.java
index b175bc9..6dccd66 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/DocumentProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/DocumentProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -55,10 +55,14 @@
 @Singleton
 public final class DocumentProvider extends AbstractMessageReaderWriterProvider<Document> {
 
+    private final Provider<DocumentBuilderFactory> dbf;
+    private final Provider<TransformerFactory> tf;
+
     @Inject
-    private Provider<DocumentBuilderFactory> dbf;
-    @Inject
-    private Provider<TransformerFactory> tf;
+    public DocumentProvider(Provider<DocumentBuilderFactory> dbf, Provider<TransformerFactory> tf) {
+        this.dbf = dbf;
+        this.tf = tf;
+    }
 
     @Override
     public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/SaxParserFactoryInjectionProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/SaxParserFactoryInjectionProvider.java
index 4b1bbb3..6103bce 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/SaxParserFactoryInjectionProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/SaxParserFactoryInjectionProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -49,11 +49,11 @@
      */
     // TODO This provider should be registered and configured via a feature.
     @Inject
-    public SaxParserFactoryInjectionProvider(final Configuration config) {
+    public SaxParserFactoryInjectionProvider(final InjectionManager injectionManager, final Configuration config) {
         super(config);
+        this.injectionManager = injectionManager;
     }
 
-    @Inject
     private InjectionManager injectionManager;
 
     @Override
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/TransformerFactoryInjectionProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/TransformerFactoryInjectionProvider.java
index fb13b3f..364e9b6 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/TransformerFactoryInjectionProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/TransformerFactoryInjectionProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -45,11 +45,11 @@
      */
     // TODO This provider should be registered and configured via a feature.
     @Inject
-    public TransformerFactoryInjectionProvider(final Configuration config) {
+    public TransformerFactoryInjectionProvider(final InjectionManager injectionManager, final Configuration config) {
         super(config);
+        this.injectionManager = injectionManager;
     }
 
-    @Inject
     private InjectionManager injectionManager;
 
     @Override
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlCollectionJaxbProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlCollectionJaxbProvider.java
index f5e8e1b..b9e4191 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlCollectionJaxbProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlCollectionJaxbProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -24,9 +24,10 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import javax.inject.Inject;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Configuration;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.ext.Providers;
 
@@ -50,14 +51,14 @@
 
     private final Provider<XMLInputFactory> xif;
 
-    XmlCollectionJaxbProvider(Provider<XMLInputFactory> xif, Providers ps) {
-        super(ps);
+    XmlCollectionJaxbProvider(Provider<XMLInputFactory> xif, Providers ps, Configuration config) {
+        super(ps, config);
 
         this.xif = xif;
     }
 
-    XmlCollectionJaxbProvider(Provider<XMLInputFactory> xif, Providers ps, MediaType mt) {
-        super(ps, mt);
+    XmlCollectionJaxbProvider(Provider<XMLInputFactory> xif, Providers ps, MediaType mt, Configuration config) {
+        super(ps, mt, config);
 
         this.xif = xif;
     }
@@ -71,8 +72,9 @@
     @Singleton
     public static final class App extends XmlCollectionJaxbProvider {
 
-        public App(@Context Provider<XMLInputFactory> xif, @Context Providers ps) {
-            super(xif, ps, MediaType.APPLICATION_XML_TYPE);
+        @Inject
+        public App(Provider<XMLInputFactory> xif, Providers ps, Configuration config) {
+            super(xif, ps, MediaType.APPLICATION_XML_TYPE, config);
         }
     }
 
@@ -85,8 +87,9 @@
     @Singleton
     public static final class Text extends XmlCollectionJaxbProvider {
 
-        public Text(@Context Provider<XMLInputFactory> xif, @Context Providers ps) {
-            super(xif, ps, MediaType.TEXT_XML_TYPE);
+        @Inject
+        public Text(Provider<XMLInputFactory> xif, Providers ps, Configuration config) {
+            super(xif, ps, MediaType.TEXT_XML_TYPE, config);
         }
     }
 
@@ -99,8 +102,9 @@
     @Singleton
     public static final class General extends XmlCollectionJaxbProvider {
 
-        public General(@Context Provider<XMLInputFactory> xif, @Context Providers ps) {
-            super(xif, ps);
+        @Inject
+        public General(Provider<XMLInputFactory> xif, Providers ps, Configuration config) {
+            super(xif, ps, config);
         }
 
         @Override
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlInputFactoryInjectionProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlInputFactoryInjectionProvider.java
index 64b48c1..0c5a936 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlInputFactoryInjectionProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlInputFactoryInjectionProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -38,11 +38,11 @@
      */
     // TODO This provider should be registered and configured via a feature.
     @Inject
-    public XmlInputFactoryInjectionProvider(final Configuration config) {
+    public XmlInputFactoryInjectionProvider(final InjectionManager injectionManager, final Configuration config) {
         super(config);
+        this.injectionManager = injectionManager;
     }
 
-    @Inject
     private InjectionManager injectionManager;
 
     @Override
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlJaxbElementProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlJaxbElementProvider.java
index 69e9d46..bd5ee4d 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlJaxbElementProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlJaxbElementProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -20,9 +20,10 @@
 import java.io.OutputStream;
 import java.nio.charset.Charset;
 
+import javax.inject.Inject;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Configuration;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.ext.Providers;
 
@@ -44,14 +45,14 @@
 
     private final Provider<SAXParserFactory> spf;
 
-    public XmlJaxbElementProvider(Provider<SAXParserFactory> spf, Providers ps) {
-        super(ps);
+    public XmlJaxbElementProvider(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+        super(ps, config);
 
         this.spf = spf;
     }
 
-    public XmlJaxbElementProvider(Provider<SAXParserFactory> spf, Providers ps, MediaType mt) {
-        super(ps, mt);
+    public XmlJaxbElementProvider(Provider<SAXParserFactory> spf, Providers ps, MediaType mt, Configuration config) {
+        super(ps, mt, config);
 
         this.spf = spf;
     }
@@ -65,8 +66,9 @@
     @Singleton
     public static final class App extends XmlJaxbElementProvider {
 
-        public App(@Context Provider<SAXParserFactory> spf, @Context Providers ps) {
-            super(spf, ps, MediaType.APPLICATION_XML_TYPE);
+        @Inject
+        public App(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+            super(spf, ps, MediaType.APPLICATION_XML_TYPE, config);
         }
     }
 
@@ -79,8 +81,9 @@
     @Singleton
     public static final class Text extends XmlJaxbElementProvider {
 
-        public Text(@Context Provider<SAXParserFactory> spf, @Context Providers ps) {
-            super(spf, ps, MediaType.TEXT_XML_TYPE);
+        @Inject
+        public Text(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+            super(spf, ps, MediaType.TEXT_XML_TYPE, config);
         }
     }
 
@@ -93,8 +96,9 @@
     @Singleton
     public static final class General extends XmlJaxbElementProvider {
 
-        public General(@Context Provider<SAXParserFactory> spf, @Context Providers ps) {
-            super(spf, ps);
+        @Inject
+        public General(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+            super(spf, ps, config);
         }
 
         @Override
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlRootElementJaxbProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlRootElementJaxbProvider.java
index 6a3f8e3..1418c24 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlRootElementJaxbProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlRootElementJaxbProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -18,9 +18,10 @@
 
 import java.io.InputStream;
 
+import javax.inject.Inject;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Configuration;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.ext.Providers;
 
@@ -45,14 +46,14 @@
     // Delay construction of factory
     private final Provider<SAXParserFactory> spf;
 
-    XmlRootElementJaxbProvider(Provider<SAXParserFactory> spf, Providers ps) {
-        super(ps);
+    XmlRootElementJaxbProvider(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+        super(ps, config);
 
         this.spf = spf;
     }
 
-    XmlRootElementJaxbProvider(Provider<SAXParserFactory> spf, Providers ps, MediaType mt) {
-        super(ps, mt);
+    XmlRootElementJaxbProvider(Provider<SAXParserFactory> spf, Providers ps, MediaType mt, Configuration config) {
+        super(ps, mt, config);
 
         this.spf = spf;
     }
@@ -67,8 +68,9 @@
     @Singleton
     public static final class App extends XmlRootElementJaxbProvider {
 
-        public App(@Context Provider<SAXParserFactory> spf, @Context Providers ps) {
-            super(spf, ps, MediaType.APPLICATION_XML_TYPE);
+        @Inject
+        public App(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+            super(spf, ps, MediaType.APPLICATION_XML_TYPE, config);
         }
     }
 
@@ -82,8 +84,9 @@
     @Singleton
     public static final class Text extends XmlRootElementJaxbProvider {
 
-        public Text(@Context Provider<SAXParserFactory> spf, @Context Providers ps) {
-            super(spf, ps, MediaType.TEXT_XML_TYPE);
+        @Inject
+        public Text(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+            super(spf, ps, MediaType.TEXT_XML_TYPE, config);
         }
     }
 
@@ -97,8 +100,9 @@
     @Singleton
     public static final class General extends XmlRootElementJaxbProvider {
 
-        public General(@Context Provider<SAXParserFactory> spf, @Context Providers ps) {
-            super(spf, ps);
+        @Inject
+        public General(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+            super(spf, ps, config);
         }
 
         @Override
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlRootObjectJaxbProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlRootObjectJaxbProvider.java
index fa0e3ce..b8c2950 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlRootObjectJaxbProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlRootObjectJaxbProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -22,12 +22,13 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
+import javax.inject.Inject;
 import javax.ws.rs.BadRequestException;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.InternalServerErrorException;
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Configuration;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.NoContentException;
@@ -53,14 +54,14 @@
 
     private final Provider<SAXParserFactory> spf;
 
-    XmlRootObjectJaxbProvider(Provider<SAXParserFactory> spf, Providers ps) {
-        super(ps);
+    XmlRootObjectJaxbProvider(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+        super(ps, config);
 
         this.spf = spf;
     }
 
-    XmlRootObjectJaxbProvider(Provider<SAXParserFactory> spf, Providers ps, MediaType mt) {
-        super(ps, mt);
+    XmlRootObjectJaxbProvider(Provider<SAXParserFactory> spf, Providers ps, MediaType mt, Configuration config) {
+        super(ps, mt, config);
 
         this.spf = spf;
     }
@@ -79,8 +80,9 @@
     @Singleton
     public static final class App extends XmlRootObjectJaxbProvider {
 
-        public App(@Context Provider<SAXParserFactory> spf, @Context Providers ps) {
-            super(spf, ps, MediaType.APPLICATION_XML_TYPE);
+        @Inject
+        public App(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+            super(spf, ps, MediaType.APPLICATION_XML_TYPE, config);
         }
     }
 
@@ -93,8 +95,9 @@
     @Singleton
     public static final class Text extends XmlRootObjectJaxbProvider {
 
-        public Text(@Context Provider<SAXParserFactory> spf, @Context Providers ps) {
-            super(spf, ps, MediaType.TEXT_XML_TYPE);
+        @Inject
+        public Text(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+            super(spf, ps, MediaType.TEXT_XML_TYPE, config);
         }
     }
 
@@ -107,8 +110,9 @@
     @Singleton
     public static final class General extends XmlRootObjectJaxbProvider {
 
-        public General(@Context Provider<SAXParserFactory> spf, @Context Providers ps) {
-            super(spf, ps);
+        @Inject
+        public General(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+            super(spf, ps, config);
         }
 
         @Override
diff --git a/media/jaxb/src/test/java/org/glassfish/jersey/jaxb/internal/JaxbStringReaderProviderTest.java b/media/jaxb/src/test/java/org/glassfish/jersey/jaxb/internal/JaxbStringReaderProviderTest.java
index 38793d8..9e9b89a 100644
--- a/media/jaxb/src/test/java/org/glassfish/jersey/jaxb/internal/JaxbStringReaderProviderTest.java
+++ b/media/jaxb/src/test/java/org/glassfish/jersey/jaxb/internal/JaxbStringReaderProviderTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -48,7 +48,7 @@
     public void stringReaderDoesNotReadExternalDtds() {
 
         Provider<SAXParserFactory> saxParserFactoryProvider = new Provider<SAXParserFactory>() {
-            final SaxParserFactoryInjectionProvider spf = new SaxParserFactoryInjectionProvider(
+            final SaxParserFactoryInjectionProvider spf = new SaxParserFactoryInjectionProvider(null,
                     new CommonConfig(RuntimeType.SERVER, ComponentBag.INCLUDE_ALL));
 
             @Override
diff --git a/media/json-binding/src/main/java/org/glassfish/jersey/jsonb/internal/JsonBindingProvider.java b/media/json-binding/src/main/java/org/glassfish/jersey/jsonb/internal/JsonBindingProvider.java
index 3ac8031..f2662c0 100644
--- a/media/json-binding/src/main/java/org/glassfish/jersey/jsonb/internal/JsonBindingProvider.java
+++ b/media/json-binding/src/main/java/org/glassfish/jersey/jsonb/internal/JsonBindingProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -22,11 +22,11 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
+import javax.inject.Inject;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.ProcessingException;
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.NoContentException;
@@ -55,9 +55,10 @@
     private static final String JSON = "json";
     private static final String PLUS_JSON = "+json";
 
-    private Providers providers;
+    private final Providers providers;
 
-    public JsonBindingProvider(@Context Providers providers) {
+    @Inject
+    public JsonBindingProvider(Providers providers) {
         this.providers = providers;
     }
 
diff --git a/media/json-gson/src/main/java/org/glassfish/jersey/gson/internal/JsonGsonProvider.java b/media/json-gson/src/main/java/org/glassfish/jersey/gson/internal/JsonGsonProvider.java
index 3799af1..7375fd3 100644
--- a/media/json-gson/src/main/java/org/glassfish/jersey/gson/internal/JsonGsonProvider.java
+++ b/media/json-gson/src/main/java/org/glassfish/jersey/gson/internal/JsonGsonProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -23,11 +23,11 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
+import javax.inject.Inject;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.ProcessingException;
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.NoContentException;
@@ -56,7 +56,8 @@
 
     private Providers providers;
 
-    public JsonGsonProvider(@Context Providers providers) {
+    @Inject
+    public JsonGsonProvider(Providers providers) {
         this.providers = providers;
     }
 
diff --git a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/DefaultJacksonJaxbJsonProvider.java b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/DefaultJacksonJaxbJsonProvider.java
index a75544c..7a803d8 100644
--- a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/DefaultJacksonJaxbJsonProvider.java
+++ b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/DefaultJacksonJaxbJsonProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -25,26 +25,27 @@
 import java.util.Arrays;
 import java.util.List;
 import javax.annotation.PostConstruct;
+import javax.inject.Inject;
 import javax.inject.Singleton;
 import javax.ws.rs.core.Configuration;
-import javax.ws.rs.core.Context;
+import javax.ws.rs.ext.Providers;
 
 /**
  * Entity Data provider based on Jackson JSON provider.
  */
 @Singleton
 public class DefaultJacksonJaxbJsonProvider extends JacksonJaxbJsonProvider {
-
-    @Context
     private Configuration commonConfig;
 
+    @Inject
+    public DefaultJacksonJaxbJsonProvider(Providers providers, Configuration config) {
+        this.commonConfig = config;
+        _providers = providers;
+    }
+
     //do not register JaxbAnnotationModule because it brakes default annotations processing
     private static final String EXCLUDE_MODULE_NAME = "JaxbAnnotationModule";
 
-    public DefaultJacksonJaxbJsonProvider() {
-        super();
-    }
-
     public DefaultJacksonJaxbJsonProvider(final Annotations... annotationsToUse) {
         super(annotationsToUse);
     }
diff --git a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/FilteringJacksonJaxbJsonProvider.java b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/FilteringJacksonJaxbJsonProvider.java
index 328697c..641a078 100644
--- a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/FilteringJacksonJaxbJsonProvider.java
+++ b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/FilteringJacksonJaxbJsonProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -22,12 +22,14 @@
 import java.lang.reflect.Method;
 import java.lang.reflect.Type;
 
+import javax.ws.rs.core.Configuration;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 
 import javax.inject.Inject;
 import javax.inject.Provider;
 import javax.inject.Singleton;
+import javax.ws.rs.ext.Providers;
 
 import org.glassfish.jersey.internal.util.ReflectionHelper;
 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.cfg.EndpointConfigBase;
@@ -57,8 +59,15 @@
 @Singleton
 public final class FilteringJacksonJaxbJsonProvider extends DefaultJacksonJaxbJsonProvider {
 
+    private final Provider<ObjectProvider<FilterProvider>> provider;
+
     @Inject
-    private Provider<ObjectProvider<FilterProvider>> provider;
+    public FilteringJacksonJaxbJsonProvider(Provider<ObjectProvider<FilterProvider>> provider,
+                                            Providers providers, Configuration config) {
+        super(providers, config);
+        this.provider = provider;
+    }
+
 
     @Override
     protected JsonEndpointConfig _configForWriting(final ObjectMapper mapper, final Annotation[] annotations,
diff --git a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/JacksonObjectProvider.java b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/JacksonObjectProvider.java
index d341486..46f5ebb 100644
--- a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/JacksonObjectProvider.java
+++ b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/JacksonObjectProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -23,6 +23,8 @@
 import java.util.Stack;
 
 import org.glassfish.jersey.message.filtering.spi.AbstractObjectProvider;
+import org.glassfish.jersey.message.filtering.spi.EntityGraphProvider;
+import org.glassfish.jersey.message.filtering.spi.EntityInspector;
 import org.glassfish.jersey.message.filtering.spi.ObjectGraph;
 
 import com.fasterxml.jackson.core.JsonGenerator;
@@ -35,12 +37,22 @@
 import com.fasterxml.jackson.databind.ser.PropertyFilter;
 import com.fasterxml.jackson.databind.ser.PropertyWriter;
 import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
+import org.glassfish.jersey.message.filtering.spi.ScopeProvider;
+
+import javax.inject.Inject;
 
 /**
  * @author Michal Gajdos
  */
 final class JacksonObjectProvider extends AbstractObjectProvider<FilterProvider> {
 
+    @Inject
+    public JacksonObjectProvider(ScopeProvider scopeProvider,
+                                  EntityInspector entityInspector,
+                                  EntityGraphProvider graphProvider) {
+        super(scopeProvider, entityInspector, graphProvider);
+    }
+
     @Override
     public FilterProvider transform(final ObjectGraph graph) {
         // Root entity.
diff --git a/media/json-jackson/src/test/java/org/glassfish/jersey/jackson/internal/DefaultJsonJacksonProviderForDisabledModulesTest.java b/media/json-jackson/src/test/java/org/glassfish/jersey/jackson/internal/DefaultJsonJacksonProviderForDisabledModulesTest.java
index 8d8075c..b34803e 100644
--- a/media/json-jackson/src/test/java/org/glassfish/jersey/jackson/internal/DefaultJsonJacksonProviderForDisabledModulesTest.java
+++ b/media/json-jackson/src/test/java/org/glassfish/jersey/jackson/internal/DefaultJsonJacksonProviderForDisabledModulesTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -55,6 +55,9 @@
     private static class TestJacksonJaxbJsonProvider extends JacksonJaxbJsonProvider {
 
         @Inject
+        public TestJacksonJaxbJsonProvider(Configuration configuration) {
+            this.configuration = configuration;
+        }
         private Configuration configuration;
 
         @PostConstruct
diff --git a/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonJaxbElementProvider.java b/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonJaxbElementProvider.java
index 15feedf..55d302f 100644
--- a/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonJaxbElementProvider.java
+++ b/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonJaxbElementProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -24,9 +24,10 @@
 import java.lang.reflect.Type;
 import java.nio.charset.Charset;
 
+import javax.inject.Inject;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Configuration;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.ext.Providers;
 
@@ -47,12 +48,12 @@
  */
 public class JettisonJaxbElementProvider extends AbstractJaxbElementProvider {
 
-    JettisonJaxbElementProvider(Providers ps) {
-        super(ps);
+    JettisonJaxbElementProvider(Providers ps, Configuration config) {
+        super(ps, config);
     }
 
-    JettisonJaxbElementProvider(Providers ps, MediaType mt) {
-        super(ps, mt);
+    JettisonJaxbElementProvider(Providers ps, MediaType mt, Configuration config) {
+        super(ps, mt, config);
     }
 
     @Override
@@ -69,8 +70,9 @@
     @Consumes("application/json")
     public static final class App extends JettisonJaxbElementProvider {
 
-        public App(@Context Providers ps) {
-            super(ps, MediaType.APPLICATION_JSON_TYPE);
+        @Inject
+        public App(Providers ps, Configuration config) {
+            super(ps, MediaType.APPLICATION_JSON_TYPE, config);
         }
     }
 
@@ -78,8 +80,9 @@
     @Consumes("*/*")
     public static final class General extends JettisonJaxbElementProvider {
 
-        public General(@Context Providers ps) {
-            super(ps);
+        @Inject
+        public General(Providers ps, Configuration config) {
+            super(ps, config);
         }
 
         @Override
diff --git a/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonListElementProvider.java b/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonListElementProvider.java
index 777c000..93338fd 100644
--- a/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonListElementProvider.java
+++ b/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonListElementProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -28,9 +28,10 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import javax.inject.Inject;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Configuration;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.ext.Providers;
 
@@ -54,12 +55,12 @@
  */
 public class JettisonListElementProvider extends AbstractCollectionJaxbProvider {
 
-    JettisonListElementProvider(Providers ps) {
-        super(ps);
+    JettisonListElementProvider(Providers ps, Configuration config) {
+        super(ps, config);
     }
 
-    JettisonListElementProvider(Providers ps, MediaType mt) {
-        super(ps, mt);
+    JettisonListElementProvider(Providers ps, MediaType mt, Configuration config) {
+        super(ps, mt, config);
     }
 
     @Override
@@ -75,9 +76,9 @@
     @Produces("application/json")
     @Consumes("application/json")
     public static final class App extends JettisonListElementProvider {
-
-        public App(@Context Providers ps) {
-            super(ps, MediaType.APPLICATION_JSON_TYPE);
+        @Inject
+        public App(Providers ps, Configuration config) {
+            super(ps, MediaType.APPLICATION_JSON_TYPE, config);
         }
     }
 
@@ -85,8 +86,9 @@
     @Consumes("*/*")
     public static final class General extends JettisonListElementProvider {
 
-        public General(@Context Providers ps) {
-            super(ps);
+        @Inject
+        public General(Providers ps, Configuration config) {
+            super(ps, config);
         }
 
         @Override
diff --git a/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonRootElementProvider.java b/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonRootElementProvider.java
index f8674d0..6a5d7f6 100644
--- a/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonRootElementProvider.java
+++ b/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonRootElementProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -24,9 +24,10 @@
 import java.lang.reflect.Type;
 import java.nio.charset.Charset;
 
+import javax.inject.Inject;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Configuration;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.ext.Providers;
 
@@ -48,12 +49,12 @@
  */
 public class JettisonRootElementProvider extends AbstractRootElementJaxbProvider {
 
-    JettisonRootElementProvider(Providers ps) {
-        super(ps);
+    JettisonRootElementProvider(Providers ps, Configuration config) {
+        super(ps, config);
     }
 
-    JettisonRootElementProvider(Providers ps, MediaType mt) {
-        super(ps, mt);
+    JettisonRootElementProvider(Providers ps, MediaType mt, Configuration config) {
+        super(ps, mt, config);
     }
 
     @Override
@@ -69,18 +70,18 @@
     @Produces("application/json")
     @Consumes("application/json")
     public static final class App extends JettisonRootElementProvider {
-
-        public App(@Context Providers ps) {
-            super(ps, MediaType.APPLICATION_JSON_TYPE);
+        @Inject
+        public App(Providers ps, Configuration config) {
+            super(ps, MediaType.APPLICATION_JSON_TYPE, config);
         }
     }
 
     @Produces("*/*")
     @Consumes("*/*")
     public static final class General extends JettisonRootElementProvider {
-
-        public General(@Context Providers ps) {
-            super(ps);
+        @Inject
+        public General(Providers ps, Configuration config) {
+            super(ps, config);
         }
 
         @Override
diff --git a/media/moxy/src/main/java/org/glassfish/jersey/moxy/internal/MoxyObjectProvider.java b/media/moxy/src/main/java/org/glassfish/jersey/moxy/internal/MoxyObjectProvider.java
index 4fd83f3..c6d7633 100644
--- a/media/moxy/src/main/java/org/glassfish/jersey/moxy/internal/MoxyObjectProvider.java
+++ b/media/moxy/src/main/java/org/glassfish/jersey/moxy/internal/MoxyObjectProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -20,9 +20,12 @@
 import java.util.Map;
 import java.util.Set;
 
+import javax.inject.Inject;
 import javax.xml.bind.JAXBException;
 
 import org.glassfish.jersey.message.filtering.spi.AbstractObjectProvider;
+import org.glassfish.jersey.message.filtering.spi.EntityGraphProvider;
+import org.glassfish.jersey.message.filtering.spi.EntityInspector;
 import org.glassfish.jersey.message.filtering.spi.ObjectGraph;
 
 import org.eclipse.persistence.jaxb.JAXBContext;
@@ -30,6 +33,7 @@
 import org.eclipse.persistence.jaxb.JAXBHelper;
 import org.eclipse.persistence.jaxb.Subgraph;
 import org.eclipse.persistence.jaxb.TypeMappingInfo;
+import org.glassfish.jersey.message.filtering.spi.ScopeProvider;
 
 /**
  * @author Michal Gajdos
@@ -47,6 +51,13 @@
         }
     }
 
+    @Inject
+    public MoxyObjectProvider(ScopeProvider scopeProvider,
+                              EntityInspector entityInspector,
+                              EntityGraphProvider graphProvider) {
+        super(scopeProvider, entityInspector, graphProvider);
+    }
+
     @Override
     public org.eclipse.persistence.jaxb.ObjectGraph transform(final ObjectGraph graph) {
         return createObjectGraph(graph.getEntityClass(), graph);
diff --git a/media/moxy/src/main/java/org/glassfish/jersey/moxy/json/internal/ConfigurableMoxyJsonProvider.java b/media/moxy/src/main/java/org/glassfish/jersey/moxy/json/internal/ConfigurableMoxyJsonProvider.java
index fea9192..afccd4a 100644
--- a/media/moxy/src/main/java/org/glassfish/jersey/moxy/json/internal/ConfigurableMoxyJsonProvider.java
+++ b/media/moxy/src/main/java/org/glassfish/jersey/moxy/json/internal/ConfigurableMoxyJsonProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -26,9 +26,9 @@
 import java.util.Map;
 import java.util.Set;
 
+import javax.inject.Inject;
 import javax.inject.Singleton;
 import javax.ws.rs.core.Configuration;
-import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.ext.ContextResolver;
@@ -77,11 +77,13 @@
         return propertyNames;
     }
 
-    @Context
-    private Providers providers;
+    private final Configuration config;
 
-    @Context
-    private Configuration config;
+    @Inject
+    public ConfigurableMoxyJsonProvider(Providers providers, Configuration config) {
+        this.providers = providers;
+        this.config = config;
+    }
 
     private MoxyJsonConfig globalConfig;
 
diff --git a/media/moxy/src/main/java/org/glassfish/jersey/moxy/json/internal/FilteringMoxyJsonProvider.java b/media/moxy/src/main/java/org/glassfish/jersey/moxy/json/internal/FilteringMoxyJsonProvider.java
index 16ed85b..541d6f3 100644
--- a/media/moxy/src/main/java/org/glassfish/jersey/moxy/json/internal/FilteringMoxyJsonProvider.java
+++ b/media/moxy/src/main/java/org/glassfish/jersey/moxy/json/internal/FilteringMoxyJsonProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -19,12 +19,14 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
+import javax.ws.rs.core.Configuration;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 
 import javax.inject.Inject;
 import javax.inject.Provider;
 import javax.inject.Singleton;
+import javax.ws.rs.ext.Providers;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
@@ -41,9 +43,15 @@
  */
 @Singleton
 public class FilteringMoxyJsonProvider extends ConfigurableMoxyJsonProvider {
+    private final Provider<ObjectProvider<ObjectGraph>> provider;
 
     @Inject
-    private Provider<ObjectProvider<ObjectGraph>> provider;
+    public FilteringMoxyJsonProvider(Provider<ObjectProvider<ObjectGraph>> provider,
+                                     Providers providers,
+                                     Configuration config) {
+        super(providers, config);
+        this.provider = provider;
+    }
 
     @Override
     protected void preWriteTo(final Object object, final Class<?> type, final Type genericType, final Annotation[] annotations,
diff --git a/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartReaderClientSide.java b/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartReaderClientSide.java
index 1511108..a9fa031 100644
--- a/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartReaderClientSide.java
+++ b/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartReaderClientSide.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -32,7 +32,6 @@
 import javax.ws.rs.Consumes;
 import javax.ws.rs.RuntimeType;
 import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Context;
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
@@ -77,16 +76,15 @@
      * Injectable helper to look up appropriate {@link MessageBodyReader}s
      * for our body parts.
      */
-    @Inject
     private Provider<MessageBodyWorkers> messageBodyWorkers;
-
     private final MIMEConfig mimeConfig;
 
     /**
      * Accepts constructor injection of the configuration parameters for this
      * application.
      */
-    public MultiPartReaderClientSide(@Context final Providers providers) {
+    @Inject
+    public MultiPartReaderClientSide(final Providers providers, Provider<MessageBodyWorkers> messageBodyWorkers) {
         final ContextResolver<MultiPartProperties> contextResolver =
                 providers.getContextResolver(MultiPartProperties.class, MediaType.WILDCARD_TYPE);
 
@@ -98,6 +96,7 @@
             properties = new MultiPartProperties();
         }
 
+        this.messageBodyWorkers = messageBodyWorkers;
         mimeConfig = createMimeConfig(properties);
     }
 
diff --git a/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartReaderServerSide.java b/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartReaderServerSide.java
index a7c9623..4858b0c 100644
--- a/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartReaderServerSide.java
+++ b/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartReaderServerSide.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -23,7 +23,6 @@
 
 import javax.ws.rs.ConstrainedTo;
 import javax.ws.rs.RuntimeType;
-import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.ext.MessageBodyReader;
@@ -34,6 +33,7 @@
 import javax.inject.Singleton;
 
 import org.glassfish.jersey.media.multipart.MultiPart;
+import org.glassfish.jersey.message.MessageBodyWorkers;
 import org.glassfish.jersey.server.CloseableService;
 
 import org.jvnet.mimepull.MIMEParsingException;
@@ -52,9 +52,10 @@
     private final Provider<CloseableService> closeableServiceProvider;
 
     @Inject
-    public MultiPartReaderServerSide(@Context final Providers providers,
-                                     final Provider<CloseableService> closeableServiceProvider) {
-        super(providers);
+    public MultiPartReaderServerSide(final Providers providers,
+                                     final Provider<CloseableService> closeableServiceProvider,
+                                     final Provider<MessageBodyWorkers> messageBodyWorkers) {
+        super(providers, messageBodyWorkers);
         this.closeableServiceProvider = closeableServiceProvider;
     }
 
diff --git a/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartWriter.java b/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartWriter.java
index 7eb7b2b..941fb1d 100644
--- a/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartWriter.java
+++ b/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartWriter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -27,9 +27,9 @@
 import java.util.List;
 import java.util.Map;
 
+import javax.inject.Inject;
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Context;
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
@@ -64,7 +64,8 @@
      */
     private final Providers providers;
 
-    public MultiPartWriter(@Context final Providers providers) {
+    @Inject
+    public MultiPartWriter(final Providers providers) {
         this.providers = providers;
     }
 
diff --git a/media/sse/src/main/java/org/glassfish/jersey/media/sse/EventInputReader.java b/media/sse/src/main/java/org/glassfish/jersey/media/sse/EventInputReader.java
index 6fd71cb..f3924c7 100644
--- a/media/sse/src/main/java/org/glassfish/jersey/media/sse/EventInputReader.java
+++ b/media/sse/src/main/java/org/glassfish/jersey/media/sse/EventInputReader.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -31,7 +31,6 @@
 
 import org.glassfish.jersey.internal.PropertiesDelegate;
 import org.glassfish.jersey.message.MessageBodyWorkers;
-import org.glassfish.jersey.message.MessageUtils;
 import org.glassfish.jersey.message.internal.ReaderInterceptorExecutor;
 
 /**
@@ -41,10 +40,14 @@
  */
 class EventInputReader implements MessageBodyReader<EventInput> {
 
+    private final Provider<MessageBodyWorkers> messageBodyWorkers;
+    private final Provider<PropertiesDelegate> propertiesDelegateProvider;
+
     @Inject
-    private Provider<MessageBodyWorkers> messageBodyWorkers;
-    @Inject
-    private Provider<PropertiesDelegate> propertiesDelegateProvider;
+    EventInputReader(Provider<MessageBodyWorkers> messageBodyWorkers, Provider<PropertiesDelegate> propertiesDelegateProvider) {
+        this.messageBodyWorkers = messageBodyWorkers;
+        this.propertiesDelegateProvider = propertiesDelegateProvider;
+    }
 
     @Override
     public boolean isReadable(Class<?> aClass, Type type, Annotation[] annotations, MediaType mediaType) {
diff --git a/media/sse/src/main/java/org/glassfish/jersey/media/sse/InboundEventReader.java b/media/sse/src/main/java/org/glassfish/jersey/media/sse/InboundEventReader.java
index 3ac2ccb..6d48a60 100644
--- a/media/sse/src/main/java/org/glassfish/jersey/media/sse/InboundEventReader.java
+++ b/media/sse/src/main/java/org/glassfish/jersey/media/sse/InboundEventReader.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -49,8 +49,12 @@
     private static final Logger LOGGER = Logger.getLogger(InboundEventReader.class.getName());
     private static final byte[] EOL_DATA = new byte[] {'\n'};
 
+    private final Provider<MessageBodyWorkers> messageBodyWorkers;
+
     @Inject
-    private Provider<MessageBodyWorkers> messageBodyWorkers;
+    InboundEventReader(Provider<MessageBodyWorkers> messageBodyWorkers) {
+        this.messageBodyWorkers = messageBodyWorkers;
+    }
 
     private enum State {
         SKIPPING_PREPENDED_EMPTY_EVENTS,
diff --git a/media/sse/src/main/java/org/glassfish/jersey/media/sse/OutboundEventWriter.java b/media/sse/src/main/java/org/glassfish/jersey/media/sse/OutboundEventWriter.java
index 2dd6b2e..ea2d48f 100644
--- a/media/sse/src/main/java/org/glassfish/jersey/media/sse/OutboundEventWriter.java
+++ b/media/sse/src/main/java/org/glassfish/jersey/media/sse/OutboundEventWriter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -52,8 +52,12 @@
     private static final byte[] DATA_LEAD = "data: ".getBytes(UTF8);
     private static final byte[] EOL = {'\n'};
 
+    private final Provider<MessageBodyWorkers> workersProvider;
+
     @Inject
-    private Provider<MessageBodyWorkers> workersProvider;
+    public OutboundEventWriter(Provider<MessageBodyWorkers> workersProvider) {
+        this.workersProvider = workersProvider;
+    }
 
     @Override
     public boolean isWriteable(final Class<?> type, final Type genericType, final Annotation[] annotations,
diff --git a/security/oauth1-client/src/main/java/org/glassfish/jersey/client/oauth1/OAuth1ClientFilter.java b/security/oauth1-client/src/main/java/org/glassfish/jersey/client/oauth1/OAuth1ClientFilter.java
index 85a9108..bd33378 100644
--- a/security/oauth1-client/src/main/java/org/glassfish/jersey/client/oauth1/OAuth1ClientFilter.java
+++ b/security/oauth1-client/src/main/java/org/glassfish/jersey/client/oauth1/OAuth1ClientFilter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -48,11 +48,14 @@
 @Priority(Priorities.AUTHENTICATION)
 class OAuth1ClientFilter implements ClientRequestFilter {
 
-    @Inject
     private Provider<OAuth1Signature> oAuthSignature;
+    private Provider<MessageBodyWorkers> messageBodyWorkers;
 
     @Inject
-    private Provider<MessageBodyWorkers> messageBodyWorkers;
+    public OAuth1ClientFilter(Provider<OAuth1Signature> oAuthSignature, Provider<MessageBodyWorkers> messageBodyWorkers) {
+        this.oAuthSignature = oAuthSignature;
+        this.messageBodyWorkers = messageBodyWorkers;
+    }
 
     @Override
     public void filter(ClientRequestContext request) throws IOException {
diff --git a/security/oauth2-client/src/main/java/org/glassfish/jersey/client/oauth2/AuthCodeGrantImpl.java b/security/oauth2-client/src/main/java/org/glassfish/jersey/client/oauth2/AuthCodeGrantImpl.java
index f9979d3..9f557d1 100644
--- a/security/oauth2-client/src/main/java/org/glassfish/jersey/client/oauth2/AuthCodeGrantImpl.java
+++ b/security/oauth2-client/src/main/java/org/glassfish/jersey/client/oauth2/AuthCodeGrantImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -354,11 +354,15 @@
     static class DefaultTokenMessageBodyReader implements MessageBodyReader<TokenResult> {
 
         // Provider here prevents circular dependency error from HK2 (workers inject providers and this provider inject workers)
-        @Inject
-        private Provider<MessageBodyWorkers> workers;
+        private final Provider<MessageBodyWorkers> workers;
+        private final Provider<PropertiesDelegate> propertiesDelegateProvider;
 
         @Inject
-        private Provider<PropertiesDelegate> propertiesDelegateProvider;
+        public DefaultTokenMessageBodyReader(Provider<MessageBodyWorkers> workers,
+                                             Provider<PropertiesDelegate> propertiesDelegateProvider) {
+            this.propertiesDelegateProvider = propertiesDelegateProvider;
+            this.workers = workers;
+        }
 
         private static Iterable<ReaderInterceptor> EMPTY_INTERCEPTORS = new ArrayList<>();
 
diff --git a/tests/e2e-client/pom.xml b/tests/e2e-client/pom.xml
index e184c03..28243e0 100644
--- a/tests/e2e-client/pom.xml
+++ b/tests/e2e-client/pom.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
 
-    Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved.
+    Copyright (c) 2017, 2023 Oracle and/or its affiliates. All rights reserved.
 
     This program and the accompanying materials are made available under the
     terms of the Eclipse Public License v. 2.0, which is available at
@@ -46,6 +46,25 @@
                         <sun.net.http.allowRestrictedHeaders>true</sun.net.http.allowRestrictedHeaders>
                     </systemPropertyVariables>
                 </configuration>
+                <executions>
+                    <execution>
+                        <id>WithHK2</id>
+                        <goals>
+                            <goal>test</goal>
+                        </goals>
+                        <configuration>
+                            <excludes>
+                                <exclude>**/NonInjectionManagerTest.java</exclude>
+                            </excludes>
+                            <systemPropertyVariables>
+                                <jersey.injectionmanager.hk2>true</jersey.injectionmanager.hk2>
+                            </systemPropertyVariables>
+                            <classpathDependencyExcludes>
+                                <classpathDependencyExclude>org.glassfish.jersey.incubator:jersey-injectless-client</classpathDependencyExclude>
+                            </classpathDependencyExcludes>
+                        </configuration>
+                    </execution>
+                </executions>
             </plugin>
         </plugins>
     </build>
@@ -177,6 +196,12 @@
             <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.incubator</groupId>
+            <artifactId>jersey-injectless-client</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
 
         <dependency>
             <groupId>org.glassfish.jersey.test-framework</groupId>
diff --git a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/HttpHeadersInjectionTest.java b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/HttpHeadersInjectionTest.java
index 65b86f0..004d4d0 100644
--- a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/HttpHeadersInjectionTest.java
+++ b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/HttpHeadersInjectionTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -20,6 +20,7 @@
 import org.glassfish.jersey.test.JerseyTest;
 import org.junit.jupiter.api.Test;
 
+import javax.inject.Inject;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
@@ -43,7 +44,6 @@
 import javax.ws.rs.ext.WriterInterceptor;
 import javax.ws.rs.ext.WriterInterceptorContext;
 import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -74,10 +74,13 @@
     }
 
     public static class HttpHeadersFilter implements ClientRequestFilter {
-
-        @Context
         HttpHeaders headers;
 
+        @Inject
+        public HttpHeadersFilter(HttpHeaders headers) {
+            this.headers = headers;
+        }
+
         @Override
         public void filter(ClientRequestContext requestContext) throws IOException {
             requestContext.abortWith(Response.ok(headers.getHeaderString(HEADER_NAME)).build());
@@ -85,10 +88,13 @@
     }
 
     public static class HttpHeadersResponseFilter implements ClientResponseFilter {
-
-        @Context
         HttpHeaders headers;
 
+        @Inject
+        public HttpHeadersResponseFilter(HttpHeaders headers) {
+            this.headers = headers;
+        }
+
         private static int headerValue = 0;
 
         public int getHeaderValue() {
@@ -103,9 +109,13 @@
 
     @Produces(MediaType.TEXT_PLAIN)
     public static class StringWriter implements MessageBodyWriter<String> {
-        @Context
         HttpHeaders headers;
 
+        @Inject
+        public StringWriter(HttpHeaders headers) {
+            this.headers = headers;
+        }
+
         @Override
         public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
             return true;
@@ -122,10 +132,13 @@
 
     @Consumes({MediaType.TEXT_PLAIN})
     public static class StringReader implements MessageBodyReader<String> {
-
-        @Context
         HttpHeaders headers;
 
+        @Inject
+        public StringReader(HttpHeaders headers) {
+            this.headers = headers;
+        }
+
         @Override
         public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
             return true;
@@ -140,10 +153,13 @@
     }
 
     public static class HttpHeadersReaderInterceptor implements ReaderInterceptor {
-
-        @Context
         HttpHeaders headers;
 
+        @Inject
+        public HttpHeadersReaderInterceptor(HttpHeaders headers) {
+            this.headers = headers;
+        }
+
         @Override
         public Object aroundReadFrom(ReaderInterceptorContext context) throws IOException, WebApplicationException {
             context.getInputStream().close();
@@ -153,10 +169,13 @@
     }
 
     public static class HttpHeadersWriterInterceptor implements WriterInterceptor {
-
-        @Context
         HttpHeaders headers;
 
+        @Inject
+        public HttpHeadersWriterInterceptor(HttpHeaders headers) {
+            this.headers = headers;
+        }
+
         @Override
         public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
             OutputStreamWriter osw = new OutputStreamWriter(context.getOutputStream());
@@ -177,7 +196,7 @@
     @Test
     public void testHttpHeadersInjectionInResponseFilter() {
         final String value = "1";
-        final HttpHeadersResponseFilter filter = new HttpHeadersResponseFilter();
+        final HttpHeadersResponseFilter filter = new HttpHeadersResponseFilter(null);
         final String response = target().register(HttpHeadersResponseFilter.class).request().header(HEADER_NAME, value)
                 .buildPost(Entity.entity(value, MediaType.TEXT_PLAIN_TYPE)).invoke(String.class);
         assertThat(response, is(value));
diff --git a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/InjectedClientBodyWorker.java b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/InjectedClientBodyWorker.java
index 1414887..3367b1f 100644
--- a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/InjectedClientBodyWorker.java
+++ b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/InjectedClientBodyWorker.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -22,6 +22,7 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
+import javax.inject.Inject;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
@@ -30,7 +31,6 @@
 import javax.ws.rs.client.Entity;
 import javax.ws.rs.core.Application;
 import javax.ws.rs.core.Configuration;
-import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.ext.ContextResolver;
@@ -73,10 +73,13 @@
     @Provider
     @Produces(ProviderType)
     public static class ProvidersInjectedWriter implements MessageBodyWriter<String> {
-
-        @Context
         Providers providers;
 
+        @Inject
+        public ProvidersInjectedWriter(Providers providers) {
+            this.providers = providers;
+        }
+
         @Override
         public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
             return type == String.class;
@@ -105,9 +108,13 @@
     @Consumes(ProviderType)
     public static class ProvidersInjectedReader implements MessageBodyReader<String> {
 
-        @Context
         Providers providers;
 
+        @Inject
+        ProvidersInjectedReader(Providers providers) {
+            this.providers = providers;
+        }
+
         @Override
         public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
             return type == String.class;
@@ -132,9 +139,13 @@
     @Produces(ConfigurationTYPE)
     public static class ConfigurationInjectedWriter implements MessageBodyWriter<String> {
 
-        @Context
         Configuration configuration;
 
+        @Inject
+        public ConfigurationInjectedWriter(Configuration configuration) {
+            this.configuration = configuration;
+        }
+
         @Override
         public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
             return type == String.class;
@@ -158,10 +169,13 @@
     @Provider
     @Consumes(ConfigurationTYPE)
     public static class ConfigurationInjectedReader implements MessageBodyReader<String> {
-
-        @Context
         Configuration configuration;
 
+        @Inject
+        public ConfigurationInjectedReader(Configuration configuration) {
+            this.configuration = configuration;
+        }
+
         @Override
         public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
             return type == String.class;
diff --git a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/NonInjectionManagerTest.java b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/NonInjectionManagerTest.java
new file mode 100644
index 0000000..de940b7
--- /dev/null
+++ b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/NonInjectionManagerTest.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package org.glassfish.jersey.tests.e2e.client;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.ClientRequestFilter;
+import javax.ws.rs.core.Response;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
+
+import org.glassfish.jersey.inject.injectless.NonInjectionManagerFactory;
+
+public class NonInjectionManagerTest {
+    @Test
+    public void testNonInjectionManagerIsUsed() {
+        String value = System.getProperty("jersey.injectionmanager.hk2");
+        if ("true".equals(value)) {
+            return;
+        }
+
+        Records records = new Records();
+        Logger logger = Logger.getLogger(new NonInjectionManagerFactory().create(null).getClass().getName());
+        Level oldLevel = logger.getLevel();
+        logger.setLevel(Level.FINEST);
+        logger.addHandler(records);
+
+        ClientBuilder.newClient().register((ClientRequestFilter) requestContext -> {
+            requestContext.abortWith(Response.ok().build());
+        }).target("http://localhost:9998/nevermind").request().get();
+
+        logger.removeHandler(records);
+        logger.setLevel(oldLevel);
+
+        LogRecord warning = records.records.get(0);
+        Assertions.assertTrue(warning.getMessage().contains("injection-less"));
+    }
+
+    private static class Records extends Handler {
+        private List<LogRecord> records = new LinkedList<>();
+        @Override
+        public void publish(LogRecord record) {
+            records.add(record);
+        }
+
+        @Override
+        public void flush() {
+        }
+
+        @Override
+        public void close() throws SecurityException {
+        }
+    }
+}
diff --git a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/RequestScopedReadEntityTest.java b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/RequestScopedReadEntityTest.java
index f8bd405..72855f0 100644
--- a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/RequestScopedReadEntityTest.java
+++ b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/RequestScopedReadEntityTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -71,9 +71,12 @@
 
     @Produces("text/plain")
     public static class ScopedMessageEntityProvider extends AbstractMessageReaderWriterProvider<Message> {
+        private final Provider<ClientRequest> clientRequestProvider;
 
         @Inject
-        private Provider<ClientRequest> clientRequestProvider;
+        public ScopedMessageEntityProvider(Provider<ClientRequest> clientRequestProvider) {
+            this.clientRequestProvider = clientRequestProvider;
+        }
 
         @Override
         public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
diff --git a/tests/e2e-entity/pom.xml b/tests/e2e-entity/pom.xml
index 8800b0f..56489c2 100644
--- a/tests/e2e-entity/pom.xml
+++ b/tests/e2e-entity/pom.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
 
-    Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved.
+    Copyright (c) 2017, 2023 Oracle and/or its affiliates. All rights reserved.
 
     This program and the accompanying materials are made available under the
     terms of the Eclipse Public License v. 2.0, which is available at
@@ -43,6 +43,19 @@
                     <enableAssertions>false</enableAssertions>
                     <skipTests>${skip.e2e}</skipTests>
                 </configuration>
+                <executions>
+                    <execution>
+                        <id>WithHK2</id>
+                        <goals>
+                            <goal>test</goal>
+                        </goals>
+                        <configuration>
+                            <classpathDependencyExcludes>
+                                <classpathDependencyExclude>org.glassfish.jersey.incubator:jersey-injectless-client</classpathDependencyExclude>
+                            </classpathDependencyExcludes>
+                        </configuration>
+                    </execution>
+                </executions>
             </plugin>
         </plugins>
     </build>
@@ -181,6 +194,12 @@
             <version>${junit-platform-suite.version}</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.incubator</groupId>
+            <artifactId>jersey-injectless-client</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
 
         <dependency>
             <groupId>org.hamcrest</groupId>
diff --git a/tests/e2e-entity/src/test/java/org/glassfish/jersey/tests/e2e/entity/filtering/FilteringMessageBodyProvider.java b/tests/e2e-entity/src/test/java/org/glassfish/jersey/tests/e2e/entity/filtering/FilteringMessageBodyProvider.java
index dcb6ba5..09e739b 100644
--- a/tests/e2e-entity/src/test/java/org/glassfish/jersey/tests/e2e/entity/filtering/FilteringMessageBodyProvider.java
+++ b/tests/e2e-entity/src/test/java/org/glassfish/jersey/tests/e2e/entity/filtering/FilteringMessageBodyProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -52,8 +52,12 @@
 
     private static final Logger LOGGER = Logger.getLogger(FilteringMessageBodyProvider.class.getName());
 
+    private final javax.inject.Provider<ObjectProvider<ObjectGraph>> provider;
+
     @Inject
-    private javax.inject.Provider<ObjectProvider<ObjectGraph>> provider;
+    public FilteringMessageBodyProvider(javax.inject.Provider<ObjectProvider<ObjectGraph>> provider) {
+        this.provider = provider;
+    }
 
     @Override
     public boolean isReadable(final Class<?> type, final Type genericType, final Annotation[] annotations,
diff --git a/tests/e2e-server/pom.xml b/tests/e2e-server/pom.xml
index f753626..e17d856 100644
--- a/tests/e2e-server/pom.xml
+++ b/tests/e2e-server/pom.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
 
-    Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved.
+    Copyright (c) 2017, 2023 Oracle and/or its affiliates. All rights reserved.
 
     This program and the accompanying materials are made available under the
     terms of the Eclipse Public License v. 2.0, which is available at
@@ -43,6 +43,19 @@
                     <enableAssertions>false</enableAssertions>
                     <skipTests>${skip.e2e}</skipTests>
                 </configuration>
+                <executions>
+                    <execution>
+                        <id>WithHK2</id>
+                        <goals>
+                            <goal>test</goal>
+                        </goals>
+                        <configuration>
+                            <classpathDependencyExcludes>
+                                <classpathDependencyExclude>org.glassfish.jersey.incubator:jersey-injectless-client</classpathDependencyExclude>
+                            </classpathDependencyExcludes>
+                        </configuration>
+                    </execution>
+                </executions>
             </plugin>
         </plugins>
     </build>
@@ -174,6 +187,12 @@
             <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.incubator</groupId>
+            <artifactId>jersey-injectless-client</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
 
         <dependency>
             <groupId>org.glassfish.jersey.test-framework</groupId>
diff --git a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/ManagedClientExecutorTest.java b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/ManagedClientExecutorTest.java
index c4581ae..42bcb9b 100644
--- a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/ManagedClientExecutorTest.java
+++ b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/ManagedClientExecutorTest.java
@@ -219,11 +219,15 @@
      */
     public static class SchedulerThreadNameReader implements MessageBodyReader<SchedulerThreadName> {
 
-        @Inject
-        ScheduledExecutorServiceProvider injectedProvider;
+        private final ScheduledExecutorServiceProvider injectedProvider;
+        private final ScheduledExecutorService injectedService;
 
         @Inject
-        ScheduledExecutorService injectedService;
+        public SchedulerThreadNameReader(ScheduledExecutorService injectedService,
+                                         ScheduledExecutorServiceProvider injectedProvider) {
+            this.injectedProvider = injectedProvider;
+            this.injectedService = injectedService;
+        }
 
         @Override
         public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
diff --git a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/validation/validateonexecution/ValidateOnExecutionOverrideTest.java b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/validation/validateonexecution/ValidateOnExecutionOverrideTest.java
index 4a50e47..c062293 100644
--- a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/validation/validateonexecution/ValidateOnExecutionOverrideTest.java
+++ b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/validation/validateonexecution/ValidateOnExecutionOverrideTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -19,6 +19,7 @@
 import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
+import java.util.stream.Collectors;
 
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
@@ -101,8 +102,13 @@
     private void _test(final String path) throws Exception {
         assertThat(target(path).request().get().getStatus(), equalTo(500));
 
-        final List<LogRecord> loggedRecords = getLoggedRecords();
+        final List<LogRecord> loggedRecords = getLoggedRecords()
+                .stream()
+                .filter(log -> log.getSourceClassName().equals(LOGGER_NAME)) // Skip warnings from outside of Validation
+                .collect(Collectors.toList());
         assertThat(loggedRecords.size(), equalTo(1));
         assertThat(loggedRecords.get(0).getThrown(), instanceOf(ValidationException.class));
     }
+
+    private static final String LOGGER_NAME = "org.glassfish.jersey.server.validation.internal.ValidationExceptionMapper";
 }
diff --git a/tests/e2e/src/test/java/org/glassfish/jersey/tests/api/MessageBodyWriterTest.java b/tests/e2e/src/test/java/org/glassfish/jersey/tests/api/MessageBodyWriterTest.java
index ad14824..2726ec9 100644
--- a/tests/e2e/src/test/java/org/glassfish/jersey/tests/api/MessageBodyWriterTest.java
+++ b/tests/e2e/src/test/java/org/glassfish/jersey/tests/api/MessageBodyWriterTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -21,6 +21,7 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
+import javax.inject.Inject;
 import javax.ws.rs.GET;
 import javax.ws.rs.HeaderParam;
 import javax.ws.rs.POST;
@@ -32,7 +33,6 @@
 import javax.ws.rs.client.Entity;
 import javax.ws.rs.core.Application;
 import javax.ws.rs.core.Configuration;
-import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
@@ -75,9 +75,13 @@
     @Provider
     @Produces("text/plain")
     public static class OverridingStringProvider implements MessageBodyWriter<String> {
+        private final Configuration config;
 
-        @Context
-        private Configuration config;
+        @Inject
+        public OverridingStringProvider(Configuration config) {
+            this.config = config;
+        }
+
 
         @Override
         public boolean isWriteable(
@@ -120,10 +124,13 @@
     @Provider
     @Produces("text/html")
     public static class HtmlStringProvider implements MessageBodyWriter<String> {
-
-        @Context
         private Configuration config;
 
+        @Inject
+        public HtmlStringProvider(Configuration config) {
+            this.config = config;
+        }
+
         @Override
         public boolean isWriteable(
                 final Class<?> type,
diff --git a/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/common/LoggingFeatureTest.java b/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/common/LoggingFeatureTest.java
index 5f2020e..8b9145c 100644
--- a/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/common/LoggingFeatureTest.java
+++ b/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/common/LoggingFeatureTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -19,6 +19,7 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.logging.Level;
@@ -707,29 +708,36 @@
 
             // --- client request log entry
             // client added header before request has sent (and logged)
-            assertThat(getLoggedRecords().get(0).getMessage(),
+            Iterator<LogRecord> it = getLoggedRecords().iterator();
+            LogRecord logRecord = it.next();
+            while (logRecord.getLevel() == Level.WARNING) { // Skip any warning at the beginning
+                logRecord = it.next();
+            }
+            assertThat(logRecord.getMessage(),
                     containsString("1 > custom_header: client/request\n"));
 
 
             // --- container request log entry
             // container receives header from client request
-            assertThat(getLoggedRecords().get(1).getMessage(),
+            logRecord = it.next();
+            assertThat(logRecord.getMessage(),
                     containsString("1 > custom_header: client/request\n"));
             // container has added its own header after logging filter logged message
-            assertThat(getLoggedRecords().get(1).getMessage(),
+            assertThat(logRecord.getMessage(),
                     not(containsString("1 > custom_header: container/request\n")));
 
 
             // --- container response log entry
             // container added header to the response and it was logged
-            assertThat(getLoggedRecords().get(2).getMessage(),
+            assertThat(it.next().getMessage(),
                     containsString("1 < custom_header: container/response\n"));
 
             // --- client response log entry
             // client received header
-            assertThat(getLoggedRecords().get(3).getMessage(),
+            logRecord = it.next();
+            assertThat(logRecord.getMessage(),
                     containsString("1 < custom_header: container/response\n"));
-            assertThat(getLoggedRecords().get(3).getMessage(),
+            assertThat(logRecord.getMessage(),
                     not(containsString("1 < custom_header: client/response\n")));
 
         }