Replace field injection with constructor injection

Cleanup dead code were possible
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/provider/ProviderRegistry.java b/scim-server/src/main/java/org/apache/directory/scim/server/provider/ProviderRegistry.java
index 2c674ff..f382d64 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/provider/ProviderRegistry.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/provider/ProviderRegistry.java
@@ -84,24 +84,21 @@
   private static final String BYTE_ARRAY_TYPE_IDENTIFIER = "class [B";
   private static final String RESOURCE_REFERENCE_TYPE_IDENTIFIER = "class org.apache.directory.scim.spec.schema.ResourceReference$ReferenceType";
 
-  @Inject
-  Registry registry;
+  private final Registry registry;
 
-  @Inject
-  ScimExtensionRegistry scimExtensionRegistry;
+  private final ScimExtensionRegistry scimExtensionRegistry;
 
   // Weld needs the '? extends' or the providers will not be found, some CDI
   // implementations work fine with just <ScimResources>
-  @Inject
-  Instance<Provider<? extends ScimResource>> scimProviderInstances;
+  private Instance<Provider<? extends ScimResource>> scimProviderInstances;
 
   private Map<Class<? extends ScimResource>, Provider<? extends ScimResource>> providerMap = new HashMap<>();
-  
-  public ProviderRegistry() {}
-  
-  public ProviderRegistry(Registry registry, ScimExtensionRegistry scimExtensionRegistry) {
+
+  @Inject
+  public ProviderRegistry(Registry registry, ScimExtensionRegistry scimExtensionRegistry, Instance<Provider<? extends ScimResource>> scimProviderInstances) {
     this.registry = registry;
     this.scimExtensionRegistry = scimExtensionRegistry;
+    this.scimProviderInstances = scimProviderInstances;
   }
 
   @Override
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/provider/UpdateRequest.java b/scim-server/src/main/java/org/apache/directory/scim/server/provider/UpdateRequest.java
index fc58542..a0dcfc6 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/provider/UpdateRequest.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/provider/UpdateRequest.java
@@ -54,8 +54,6 @@
 import org.apache.directory.scim.spec.schema.Schema;
 import org.apache.directory.scim.spec.schema.Schema.Attribute;
 
-import jakarta.inject.Inject;
-import jakarta.inject.Named;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -69,7 +67,6 @@
 import java.util.Set;
 import java.util.stream.Collectors;
 
-@Named
 @Slf4j
 @EqualsAndHashCode
 @ToString
@@ -94,8 +91,7 @@
   private Registry registry;
 
   private Map<Attribute, Integer> addRemoveOffsetMap = new HashMap<>();
-  
-  @Inject
+
   public UpdateRequest(Registry registry) {
     this.registry = registry;
 
@@ -104,6 +100,29 @@
     objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
   }
 
+  public UpdateRequest(String id, T original, T resource, Registry registry) {
+    this(registry);
+    this.id = id;
+    this.original = original;
+    this.resource = resource;
+    this.schema = registry.getSchema(original.getBaseUrn());
+    initialized = true;
+  }
+
+  public UpdateRequest(String id, T original, List<PatchOperation> patchOperations, Registry registry) {
+    this(registry);
+    this.id = id;
+    this.original = original;
+    this.patchOperations = patchOperations;
+    this.schema = registry.getSchema(original.getBaseUrn());
+
+    initialized = true;
+  }
+
+  /**
+   * @deprecated Use equivalent constructor
+   */
+  @Deprecated
   public void initWithResource(String id, T original, T resource) {
     this.id = id;
     schema = registry.getSchema(original.getBaseUrn());
@@ -114,6 +133,10 @@
     initialized = true;
   }
 
+  /**
+   * @deprecated Use equivalent constructor
+   */
+  @Deprecated
   public void initWithPatch(String id, T original, List<PatchOperation> patchOperations) {
     this.id = id;
     this.original = original;
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImpl.java
index c086170..26fdca0 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImpl.java
@@ -29,10 +29,7 @@
 import java.util.Optional;
 import java.util.Set;
 
-import jakarta.enterprise.inject.Instance;
 import jakarta.enterprise.inject.spi.CDI;
-import jakarta.inject.Inject;
-import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.EntityTag;
 import jakarta.ws.rs.core.Request;
 import jakarta.ws.rs.core.Response;
@@ -42,6 +39,7 @@
 import jakarta.ws.rs.core.UriInfo;
 
 import org.apache.directory.scim.server.provider.ProviderRegistry;
+import org.apache.directory.scim.server.schema.Registry;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -61,7 +59,6 @@
 import org.apache.directory.scim.server.provider.extensions.ScimRequestContext;
 import org.apache.directory.scim.server.provider.extensions.exceptions.ClientFilterException;
 import org.apache.directory.scim.server.utility.AttributeUtil;
-import org.apache.directory.scim.server.utility.EndpointUtil;
 import org.apache.directory.scim.server.utility.EtagGenerator;
 import org.apache.directory.scim.spec.adapter.FilterWrapper;
 import org.apache.directory.scim.spec.protocol.BaseResourceTypeResource;
@@ -85,30 +82,24 @@
 
   private static final Logger LOG = LoggerFactory.getLogger(BaseResourceTypeResourceImpl.class);
 
-  @Context
-  UriInfo uriInfo;
+  private final Registry registry;
 
-  @Context
-  Request request;
+  private final ProviderRegistry providerRegistry;
 
-  @Inject
-  ProviderRegistry providerRegistry;
+  private final  AttributeUtil attributeUtil;
 
-  @Inject
-  private AttributeUtil attributeUtil;
+  RequestContext requestContext;
 
-  @Inject
-  private EndpointUtil endpointUtil;
-
-  @Inject
-  private EtagGenerator etagGenerator;
-
-  @Inject
-  private Instance<UpdateRequest<T>> updateRequestInstance;
+  private final  EtagGenerator etagGenerator;
 
   private final Class<T> resourceClass;
 
-  protected BaseResourceTypeResourceImpl(Class<T> resourceClass) {
+  public BaseResourceTypeResourceImpl(Registry registry, ProviderRegistry providerRegistry, AttributeUtil attributeUtil, RequestContext requestContext, EtagGenerator etagGenerator, Class<T> resourceClass) {
+    this.registry = registry;
+    this.providerRegistry = providerRegistry;
+    this.attributeUtil = attributeUtil;
+    this.requestContext = requestContext;
+    this.etagGenerator = etagGenerator;
     this.resourceClass = resourceClass;
   }
 
@@ -126,7 +117,7 @@
 
   @Override
   public Response getById(String id, AttributeReferenceListWrapper attributes, AttributeReferenceListWrapper excludedAttributes) {
-    if (uriInfo.getQueryParameters().getFirst("filter") != null) {
+    if (requestContext.getUriInfo().getQueryParameters().getFirst("filter") != null) {
       return Response.status(Status.FORBIDDEN)
                      .build();
     }
@@ -134,7 +125,6 @@
     try {
       Provider<T> provider = getProviderInternal();
 
-      endpointUtil.process(uriInfo);
       T resource = null;
       try {
         resource = provider.get(id);
@@ -158,7 +148,7 @@
           return createETagErrorResponse();
         }
 
-        ResponseBuilder evaluatePreconditionsResponse = request.evaluatePreconditions(backingETag);
+        ResponseBuilder evaluatePreconditionsResponse = requestContext.getRequest().evaluatePreconditions(backingETag);
 
         if (evaluatePreconditionsResponse != null) {
           return Response.status(Status.NOT_MODIFIED)
@@ -262,7 +252,6 @@
         return createAmbiguousAttributeParametersResponse();
       }
 
-      endpointUtil.process(uriInfo);
       T created;
       try {
         created = provider.create(resource);
@@ -363,7 +352,6 @@
 
       ListResponse<T> listResponse = new ListResponse<>();
 
-      endpointUtil.process(uriInfo);
       FilterResponse<T> filterResp = null;
       try {
         filterResp = provider.find(filter, pageRequest, sortRequest);
@@ -454,7 +442,6 @@
         return createAmbiguousAttributeParametersResponse();
       }
 
-      endpointUtil.process(uriInfo);
       T stored;
       try {
         stored = provider.get(id);
@@ -478,7 +465,7 @@
         return createETagErrorResponse();
       }
 
-      ResponseBuilder evaluatePreconditionsResponse = request.evaluatePreconditions(backingETag);
+      ResponseBuilder evaluatePreconditionsResponse = requestContext.getRequest().evaluatePreconditions(backingETag);
 
       if (evaluatePreconditionsResponse != null) {
         return createPreconditionFailedResponse(id, evaluatePreconditionsResponse);
@@ -486,8 +473,7 @@
 
       T updated;
       try {
-        UpdateRequest<T> updateRequest = updateRequestInstance.get();
-        updateRequest.initWithResource(id, stored, resource);
+        UpdateRequest<T> updateRequest = new UpdateRequest<>(id, stored, resource, registry);
         updated = provider.update(updateRequest);
       } catch (UnableToUpdateResourceException e1) {
         return createGenericExceptionResponse(e1, e1.getStatus());
@@ -556,7 +542,6 @@
         return createAmbiguousAttributeParametersResponse();
       }
 
-      endpointUtil.process(uriInfo);
       T stored;
       try {
         stored = provider.get(id);
@@ -580,7 +565,7 @@
         return createETagErrorResponse();
       }
 
-      ResponseBuilder evaluatePreconditionsResponse = request.evaluatePreconditions(backingETag);
+      ResponseBuilder evaluatePreconditionsResponse = requestContext.getRequest().evaluatePreconditions(backingETag);
 
       if (evaluatePreconditionsResponse != null) {
         return createPreconditionFailedResponse(id, evaluatePreconditionsResponse);
@@ -588,8 +573,7 @@
 
       T updated;
       try {
-        UpdateRequest<T> updateRequest = updateRequestInstance.get();
-        updateRequest.initWithPatch(id, stored, patchRequest.getPatchOperationList());
+        UpdateRequest<T> updateRequest = new UpdateRequest<>(id, stored, patchRequest.getPatchOperationList(), registry);
         updated = provider.update(updateRequest);
       } catch (UnableToUpdateResourceException e1) {
         return createGenericExceptionResponse(e1, e1.getStatus());
@@ -652,7 +636,6 @@
       Provider<T> provider = getProviderInternal();
 
       try {
-        endpointUtil.process(uriInfo);
         response = Response.noContent()
                            .build();
 
@@ -705,7 +688,7 @@
       LOG.warn("Provider must supply an id for a resource");
       id = "unknown";
     }
-    return uriInfo.getAbsolutePathBuilder()
+    return requestContext.getUriInfo().getAbsolutePathBuilder()
                   .path(id)
                   .build();
   }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/BulkResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/BulkResourceImpl.java
index 79c324a..2ccfe40 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/BulkResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/BulkResourceImpl.java
@@ -96,14 +96,15 @@
 //    METHOD_NOT_IMPLEMENTED_STATUS.setCode(METHOD_NOT_IMPLEMENTED);
 //  }
 
-  @Inject
-  Registry registry;
+  private final Registry registry;
+
+  private final ProviderRegistry providerRegistry;
 
   @Inject
-  ProviderRegistry providerRegistry;
-  
-  @Inject
-  Instance<UpdateRequest<ScimResource>> updateRequestInstance;
+  public BulkResourceImpl(Registry registry, ProviderRegistry providerRegistry) {
+    this.registry = registry;
+    this.providerRegistry = providerRegistry;
+  }
 
   @Override
   public Response doBulk(BulkRequest request, UriInfo uriInfo) {
@@ -284,8 +285,7 @@
 
         ScimResource original = provider.get(scimResourceId);
 
-        UpdateRequest<ScimResource> updateRequest = updateRequestInstance.get();
-        updateRequest.initWithResource(scimResourceId, original, scimResource);
+        UpdateRequest<ScimResource> updateRequest = new UpdateRequest<>(scimResourceId, original, scimResource, registry);
         provider.update(updateRequest);
       } catch (UnresolvableOperationException unresolvableOperationException) {
         log.error("Could not complete final resolution pass, unresolvable bulkId", unresolvableOperationException);
@@ -454,8 +454,7 @@
       try {
         ScimResource original = provider.get(id);
 
-        UpdateRequest<ScimResource> updateRequest = updateRequestInstance.get();
-        updateRequest.initWithResource(id, original, scimResource);
+        UpdateRequest<ScimResource> updateRequest = new UpdateRequest<>(id, original, scimResource, registry);
         
         provider.update(updateRequest);
         operationResult.setStatus(StatusWrapper.wrap(Status.OK));
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/GroupResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/GroupResourceImpl.java
index 3801e6e..7dad42b 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/GroupResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/GroupResourceImpl.java
@@ -23,15 +23,22 @@
 package org.apache.directory.scim.server.rest;
 
 import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.directory.scim.server.provider.ProviderRegistry;
+import org.apache.directory.scim.server.schema.Registry;
+import org.apache.directory.scim.server.utility.AttributeUtil;
+import org.apache.directory.scim.server.utility.EtagGenerator;
 import org.apache.directory.scim.spec.protocol.GroupResource;
 import org.apache.directory.scim.spec.resources.ScimGroup;
+import org.apache.directory.scim.spec.resources.ScimUser;
 
 @Slf4j
 @ApplicationScoped
 public class GroupResourceImpl extends BaseResourceTypeResourceImpl<ScimGroup> implements GroupResource {
 
-  public GroupResourceImpl() {
-    super(ScimGroup.class);
+  @Inject
+  public GroupResourceImpl(Registry registry, ProviderRegistry providerRegistry, AttributeUtil attributeUtil, RequestContext requestContext, EtagGenerator etagGenerator) {
+    super(registry, providerRegistry, attributeUtil, requestContext, etagGenerator, ScimGroup.class);
   }
 }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/RequestContext.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/RequestContext.java
new file mode 100644
index 0000000..5d4951f
--- /dev/null
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/RequestContext.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.directory.scim.server.rest;
+
+import jakarta.ws.rs.core.Context;
+import jakarta.ws.rs.core.Request;
+import jakarta.ws.rs.core.SecurityContext;
+import jakarta.ws.rs.core.UriInfo;
+import lombok.Data;
+
+/**
+ * Container of JAXRS Context classes. These classes are likely inject via a proxy, so keeping them in a single place
+ * removes the need to have field injection for @Context classes in other places.
+ */
+@Data
+public class RequestContext {
+
+  @Context
+  private UriInfo uriInfo;
+
+  @Context
+  private Request request;
+
+  @Context
+  private SecurityContext securityContext;
+}
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/ResourceTypesResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/ResourceTypesResourceImpl.java
index 71a487e..52216c5 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/ResourceTypesResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/ResourceTypesResourceImpl.java
@@ -39,12 +39,16 @@
 @ApplicationScoped
 public class ResourceTypesResourceImpl implements ResourceTypesResource {
 
+  private final Registry registry;
+
+  private final RequestContext requestContext;
+
   @Inject
-  private Registry registry;
-  
-  @Context 
-  private UriInfo uriInfo;
-  
+  public ResourceTypesResourceImpl(Registry registry, RequestContext requestContext) {
+    this.registry = registry;
+    this.requestContext = requestContext;
+  }
+
   @Override
   public Response getAllResourceTypes(String filter) {
     
@@ -56,7 +60,7 @@
     
     for (ResourceType resourceType : resourceTypes) {
       Meta meta = new Meta();
-      meta.setLocation(uriInfo.getAbsolutePathBuilder().path(resourceType.getName()).build().toString());
+      meta.setLocation(requestContext.getUriInfo().getAbsolutePathBuilder().path(resourceType.getName()).build().toString());
       meta.setResourceType(resourceType.getResourceType());
       
       resourceType.setMeta(meta);
@@ -81,7 +85,7 @@
     }
     
     Meta meta = new Meta();
-    meta.setLocation(uriInfo.getAbsolutePath().toString());
+    meta.setLocation(requestContext.getUriInfo().getAbsolutePath().toString());
     meta.setResourceType(resourceType.getResourceType());
     
     resourceType.setMeta(meta);
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/SchemaResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/SchemaResourceImpl.java
index e587ba1..f1c13f0 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/SchemaResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/SchemaResourceImpl.java
@@ -38,15 +38,16 @@
 
 @ApplicationScoped
 public class SchemaResourceImpl implements SchemaResource {
-  
+
+  private final Registry registry;
+
   @Inject
-  Registry registry;
-  
-  @Context 
-  private UriInfo uriInfo;
-  
+  public SchemaResourceImpl(Registry registry) {
+    this.registry = registry;
+  }
+
   @Override
-  public Response getAllSchemas(String filter) {
+  public Response getAllSchemas(String filter, UriInfo uriInfo) {
 
     if (filter != null) {
       return Response.status(Status.FORBIDDEN).build();
@@ -74,7 +75,7 @@
   }
 
   @Override
-  public Response getSchema(String urn) {
+  public Response getSchema(String urn, UriInfo uriInfo) {
     
     Schema schema = registry.getSchema(urn);
     if (schema == null){
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/SelfResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/SelfResourceImpl.java
index 32c789e..7a10576 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/SelfResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/SelfResourceImpl.java
@@ -44,14 +44,18 @@
 @ApplicationScoped
 public class SelfResourceImpl implements SelfResource {
 
-  @Inject
-  UserResource userResource;
+  private final UserResource userResource;
+
+  private final Instance<SelfIdResolver> selfIdResolver;
+
+  private final RequestContext requestContext;
 
   @Inject
-  Instance<SelfIdResolver> selfIdResolver;
-
-  @Context
-  SecurityContext securityContext;
+  public SelfResourceImpl(UserResource userResource, Instance<SelfIdResolver> selfIdResolver, RequestContext requestContext) {
+    this.userResource = userResource;
+    this.selfIdResolver = selfIdResolver;
+    this.requestContext = requestContext;
+  }
 
   @Override
   public Response getSelf(AttributeReferenceListWrapper attributes, AttributeReferenceListWrapper excludedAttributes) {
@@ -122,7 +126,7 @@
   }
 
   private String getInternalId() throws UnableToResolveIdResourceException {
-    Principal callerPrincipal = securityContext.getUserPrincipal();
+    Principal callerPrincipal = requestContext.getSecurityContext().getUserPrincipal();
 
     if (callerPrincipal != null) {
       log.debug("Resolved SelfResource principal to : {}", callerPrincipal.getName());
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/ServiceProviderConfigResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/ServiceProviderConfigResourceImpl.java
index e39d6cd..8ad2429 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/ServiceProviderConfigResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/ServiceProviderConfigResourceImpl.java
@@ -47,20 +47,16 @@
 @ApplicationScoped
 public class ServiceProviderConfigResourceImpl implements ServiceProviderConfigResource {
 
-  @Inject
-  ServerConfiguration serverConfiguration;
+  private final ServerConfiguration serverConfiguration;
+
+  private final EtagGenerator etagGenerator;
 
   @Inject
-  EtagGenerator etagGenerator;
-  
-  public ServiceProviderConfigResourceImpl() {
-    serverConfiguration = new ServerConfiguration();  
+  public ServiceProviderConfigResourceImpl(ServerConfiguration serverConfiguration, EtagGenerator etagGenerator) {
+    this.serverConfiguration = serverConfiguration;
+    this.etagGenerator = etagGenerator;
   }
-  
-  public void registerServerConfiguration(ServerConfiguration configuration) {
-    serverConfiguration = configuration;  
-  }
-  
+
   @Override
   public Response getServiceProviderConfiguration(UriInfo uriInfo) {
     ServiceProviderConfiguration serviceProviderConfiguration = new ServiceProviderConfiguration();
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/UserResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/UserResourceImpl.java
index 4aa2580..efc8017 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/UserResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/UserResourceImpl.java
@@ -23,7 +23,12 @@
 package org.apache.directory.scim.server.rest;
 
 import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.directory.scim.server.provider.ProviderRegistry;
+import org.apache.directory.scim.server.schema.Registry;
+import org.apache.directory.scim.server.utility.AttributeUtil;
+import org.apache.directory.scim.server.utility.EtagGenerator;
 import org.apache.directory.scim.spec.protocol.UserResource;
 import org.apache.directory.scim.spec.resources.ScimUser;
 
@@ -34,7 +39,9 @@
 @Slf4j
 @ApplicationScoped
 public class UserResourceImpl extends BaseResourceTypeResourceImpl<ScimUser> implements UserResource {
-  public UserResourceImpl() {
-    super(ScimUser.class);
+
+  @Inject
+  public UserResourceImpl(Registry registry, ProviderRegistry providerRegistry, AttributeUtil attributeUtil, RequestContext requestContext, EtagGenerator etagGenerator) {
+    super(registry, providerRegistry, attributeUtil, requestContext, etagGenerator, ScimUser.class);
   }
 }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/utility/AttributeUtil.java b/scim-server/src/main/java/org/apache/directory/scim/server/utility/AttributeUtil.java
index 7305a1e..0ade1ad 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/utility/AttributeUtil.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/utility/AttributeUtil.java
@@ -61,13 +61,15 @@
 @ApplicationScoped
 public class AttributeUtil {
 
-  @Inject
   Registry registry;
 
   ObjectMapper objectMapper;
 
-  @PostConstruct
-  public void init() { // TODO move this to a CDI producer
+  @Inject
+  public AttributeUtil(Registry registry) {
+    this.registry = registry;
+
+    // TODO move this to a CDI producer
     objectMapper = ObjectMapperFactory.getObjectMapper();
     objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
     objectMapper.setSerializationInclusion(Include.NON_NULL);
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/utility/EndpointUtil.java b/scim-server/src/main/java/org/apache/directory/scim/server/utility/EndpointUtil.java
deleted file mode 100644
index 28b794d..0000000
--- a/scim-server/src/main/java/org/apache/directory/scim/server/utility/EndpointUtil.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
- 
-* http://www.apache.org/licenses/LICENSE-2.0
-
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-
-package org.apache.directory.scim.server.utility;
-
-import java.net.URI;
-
-import jakarta.enterprise.context.RequestScoped;
-import jakarta.ws.rs.core.UriBuilder;
-import jakarta.ws.rs.core.UriInfo;
-
-import org.apache.directory.scim.spec.annotation.ScimResourceType;
-import org.apache.directory.scim.spec.exception.ScimResourceInvalidException;
-import org.apache.directory.scim.spec.resources.ScimResource;
-
-@RequestScoped
-public class EndpointUtil {
-  private URI baseUri;
-  
-  public UriBuilder getBaseUriBuilder() {
-    return UriBuilder.fromUri(baseUri);
-  }
-  
-  public UriBuilder getEndpointUriBuilder(Class<? extends ScimResource> resource) {
-    ScimResourceType[] sr = resource.getAnnotationsByType(ScimResourceType.class);
-    
-    if (baseUri == null) {
-      throw new IllegalStateException("BaseUri for Resource "+resource+" was null");
-    }
-
-    if (sr.length == 0 || sr.length > 1) {
-      throw new ScimResourceInvalidException("ScimResource class must have a ScimResourceType annotation");
-    }
-
-    // yuck! TODO where to get REST endpoint from?
-    String resourceName = sr[0].name() + "s";  
-    
-    return UriBuilder.fromUri(baseUri).path(resourceName);
-  }
-  
-  public void process(UriInfo uriInfo) {
-    baseUri = uriInfo.getBaseUri();
-  }
-}
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/provider/ProviderRegistryTest.java b/scim-server/src/test/java/org/apache/directory/scim/server/provider/ProviderRegistryTest.java
index 43a0c68..d944402 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/provider/ProviderRegistryTest.java
+++ b/scim-server/src/test/java/org/apache/directory/scim/server/provider/ProviderRegistryTest.java
@@ -44,9 +44,8 @@
   ProviderRegistry providerRegistry;
   
   public ProviderRegistryTest() {
-    providerRegistry = new ProviderRegistry();
     registry = new Registry();
-    providerRegistry.registry = registry;
+    providerRegistry = new ProviderRegistry(registry, null, null);
   }
 
   @Test
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/provider/UpdateRequestTest.java b/scim-server/src/test/java/org/apache/directory/scim/server/provider/UpdateRequestTest.java
index 9e31751..b8ff196 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/provider/UpdateRequestTest.java
+++ b/scim-server/src/test/java/org/apache/directory/scim/server/provider/UpdateRequestTest.java
@@ -96,11 +96,8 @@
 
   @BeforeEach
   public void initialize() throws Exception {
-    providerRegistry = new ProviderRegistry();
     registry = new Registry();
-
-    providerRegistry.registry = registry;
-    providerRegistry.scimExtensionRegistry = ScimExtensionRegistry.getInstance();
+    providerRegistry = new ProviderRegistry(registry, ScimExtensionRegistry.getInstance(), null);
 
     Mockito.when(provider.getExtensionList())
            .thenReturn(Stream.of(EnterpriseExtension.class,ExampleObjectExtension.class).collect(Collectors.toList()));
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImplTest.java b/scim-server/src/test/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImplTest.java
index 027a297..63b5244 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImplTest.java
+++ b/scim-server/src/test/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImplTest.java
@@ -86,7 +86,7 @@
     BaseResourceTypeResourceImpl baseResourceImpl = Mockito.mock(BaseResourceTypeResourceImpl.class);
     UriInfo uriInfo = mock(UriInfo.class);
     MultivaluedMap queryParams = mock(MultivaluedMap.class);
-    baseResourceImpl.uriInfo = uriInfo;
+    baseResourceImpl.requestContext = new RequestContext().setUriInfo(uriInfo);
 
     when(uriInfo.getQueryParameters()).thenReturn(queryParams);
     when(queryParams.getFirst("filter")).thenReturn("not null");
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/rest/SelfResourceImplTest.java b/scim-server/src/test/java/org/apache/directory/scim/server/rest/SelfResourceImplTest.java
index b5e8143..607e4ad 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/rest/SelfResourceImplTest.java
+++ b/scim-server/src/test/java/org/apache/directory/scim/server/rest/SelfResourceImplTest.java
@@ -54,9 +54,7 @@
     when(principal.getName()).thenReturn("test-user");
     when(selfIdResolverInstance.isUnsatisfied()).thenReturn(true);
 
-    SelfResourceImpl selfResource = new SelfResourceImpl();
-    selfResource.selfIdResolver = selfIdResolverInstance;
-    selfResource.securityContext = securityContext;
+    SelfResourceImpl selfResource = new SelfResourceImpl(null, selfIdResolverInstance, new RequestContext().setSecurityContext(securityContext));
 
     Response response = selfResource.getSelf(null, null);
     assertThat(response.getEntity(), instanceOf(ErrorResponse.class));
@@ -84,10 +82,7 @@
     when(selfIdResolver.resolveToInternalId(principal)).thenReturn(internalId);
     when(userResource.getById(internalId, null, null)).thenReturn(mockResponse);
 
-    SelfResourceImpl selfResource = new SelfResourceImpl();
-    selfResource.selfIdResolver = selfIdResolverInstance;
-    selfResource.securityContext = securityContext;
-    selfResource.userResource = userResource;
+    SelfResourceImpl selfResource = new SelfResourceImpl(userResource, selfIdResolverInstance, new RequestContext().setSecurityContext(securityContext));
 
     // the response is just a passed along from the UserResource, so just validate it is the same instance.
     assertThat(selfResource.getSelf(null, null), sameInstance(mockResponse));
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/utility/AttributeUtilTest.java b/scim-server/src/test/java/org/apache/directory/scim/server/utility/AttributeUtilTest.java
index 22b1e4d..e2dd37b 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/utility/AttributeUtilTest.java
+++ b/scim-server/src/test/java/org/apache/directory/scim/server/utility/AttributeUtilTest.java
@@ -67,8 +67,7 @@
   @BeforeEach
   public void setup() throws Exception {
     registry = Mockito.mock(Registry.class);
-    attributeUtil = new AttributeUtil();
-    attributeUtil.registry = registry;
+    attributeUtil = new AttributeUtil(registry);
     Schema scimUserSchema = ProviderRegistry.generateSchema(ScimUser.class, ReflectionUtils.getFieldsUpTo(ScimUser.class, BaseResource.class));
     Schema scimEnterpriseUserSchema = ProviderRegistry.generateSchema(EnterpriseExtension.class, ReflectionUtils.getFieldsUpTo(EnterpriseExtension.class, Object.class));
     Schema scimExampleSchema = ProviderRegistry.generateSchema(ExampleObjectExtension.class, ReflectionUtils.getFieldsUpTo(ExampleObjectExtension.class, Object.class));
@@ -81,8 +80,6 @@
     Mockito.when(registry.getAllSchemas()).thenReturn(Arrays.asList(scimUserSchema, scimEnterpriseUserSchema, scimExampleSchema));
     Mockito.when(registry.getAllSchemaUrns()).thenReturn(new HashSet<String>(Arrays.asList(ScimUser.SCHEMA_URI, EnterpriseExtension.URN, ExampleObjectExtension.URN)));
 
-    attributeUtil.init();
-
     objectMapper = ObjectMapperFactory.getObjectMapper();
     objectMapper.setSerializationInclusion(Include.NON_NULL);
     objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/SchemaResource.java b/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/SchemaResource.java
index 35c36ef..2b704f9 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/SchemaResource.java
+++ b/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/SchemaResource.java
@@ -30,9 +30,11 @@
 import jakarta.ws.rs.PathParam;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.Response.Status;
+import jakarta.ws.rs.core.UriInfo;
 
 import static org.apache.directory.scim.spec.protocol.Constants.SCIM_CONTENT_TYPE;
 
@@ -76,7 +78,7 @@
   @Operation(description="Get All Schemas")
   @ApiResponse(content = @Content(mediaType = SCIM_CONTENT_TYPE,
     array = @ArraySchema(schema = @Schema(implementation = org.apache.directory.scim.spec.schema.Schema.class))))
-  default Response getAllSchemas(@QueryParam("filter") String filter) {
+  default Response getAllSchemas(@QueryParam("filter") String filter, @Context UriInfo uriInfo) {
 
     if (filter != null) {
       return Response.status(Status.FORBIDDEN).build();
@@ -91,7 +93,7 @@
   @Operation(description="Get Schemas by URN")
   @ApiResponse(content = @Content(mediaType = SCIM_CONTENT_TYPE,
     schema = @Schema(implementation = org.apache.directory.scim.spec.schema.Schema.class)))
-  default Response getSchema(@PathParam("uri") String uri) {
+  default Response getSchema(@PathParam("uri") String uri, @Context UriInfo uriInfo) {
     return Response.status(Status.NOT_IMPLEMENTED).build();
   }
 }