Tenencia múltiple con Guice Custom Scopes y Jersey

Estoy en el proceso de desarrollar una aplicación de arrendamiento múltiple con Jersey usando Guice para DI (también uso Dropwizard pero no creo que sea importante aquí).

Una cosa que me molesta es el hecho de que algún tipo detenancy_id está por todas partes en mi solicitud. La mayoría de mis URL se ven así:/:tenancy_id/some_resource/do_stuff. Entonces, el método en mi recurso de Jersey se llama con eltenancy_id y lo entrega a un servicio que llama a otros servicios, etc. Estos servicios están configurados de manera diferente para diferentes inquilinos.

Logré resolver este problema usando un@RequestScoped TenancyIdProdiver:

public class TenancyIdProvider {

    @Inject
    public TenancyIdProvider(HttpServletRequest request) {
        this.request = request;
    }

    public TenancyId getTenancyId() {
        // extract the tenancy id from the request
    }
}

`

Mi GuiceModule contiene los siguientes métodos:

@RequestScoped 
public TenancyId getTenancyId(TenancyIdProvider tenancyIdFactory) { 
    return tenancyIdFactory.getTenancyId(); 
}

public SomeTenancyService getTenancyId(TenancyId tenancyId, Configuration configuration) { 
    return new SomeTenancyService(configuration.getConfiguration(tenancyId)); 
}

Así que ahora no necesito preocuparme por la configuración adecuada de mis servicios. Todo se maneja mediante el contenedor DI y la aplicación es independiente del inquilino donde no le importa el inquilino.

Sin embargo, mi pregunta es: todos estos servicios y recursos se crean en cada solicitud, ya que todos tienen un@RequestScoped dependencia. Esto no es factible en absoluto. Entonces, mi idea era crear un alcance personalizado con guice. Por lo tanto, cada inquilino obtendrá su propio gráfico de objetos con todos los recursos y servicios configurados correctamente (pero solo una vez). Lo intenté siguiendo el ejemplo.aquí, pero no estoy seguro de si esto es posible con los ámbitos personalizados de Guice. ¿Dónde necesito ingresar mi alcance personalizado desde el punto de vista de Jersey? Es unContainerRequestFilter la forma correcta de hacerlo?

Respuestas a la pregunta(1)

Su respuesta a la pregunta