[Resolvido] - VRaptor3 - Injecao de Dependencia (Avancando Usando API interna)

Ps.: Meu teclado esta sem acentos…

Existe alguma forma de solicitar ao VRaptor, mesmo que sendo usando API propria do vraptor ou spring, a injecao de dependencia de algum componente sem ser no construtor ??

Meu caso e’ o seguinte… eu tenho o seguinte objeto

[code]@Intercepts
@RequestScoped
public class FirstInterceptor implements Interceptor {
private final Error500 error500;
private final CommonRequestConfiguration conf;
public FirstInterceptor(final Error500 error500, final CommonRequestConfiguration conf) {
this.error500 = error500;
this.conf = conf;
}

@Override
public boolean accepts(ResourceMethod resource) {
	return true;
}

@Override
public void intercept(InterceptorStack stack, ResourceMethod method, 
		Object resourceInstance) throws InterceptionException {
	try {
		conf.apply(method, resourceInstance);
		stack.next(method, resourceInstance);
	} catch(Exception ex) {
		throw error500.handle(ex);
	}
}

}[/code]

eu atualmente so injeto um CommonRequestConfiguration, mas eu gostaria que isso fosse um lista algo como

ai eu chamaria a dependencia nao pelo Construtor, mas por um provedor interno de depencia do vraptor, algo como

@Override public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance) throws InterceptionException { try { for (Class<CommonRequestConfiguration> confClass : confClasses) { provedorDeDependencia .getDependencia(confClass) .apply(method, resourceInstance); } stack.next(method, resourceInstance); } catch(Exception ex) { throw error500.handle(ex); } }

A minha duvida e’ se existe algo no vraptor onde eu diria qual e’ a classe que eu quero a dependencia e ele me retorne o objeto associado ao meu scopo, tem como fazer isso ??? sem ser no momento do construtor ?? com API do vraptor ou do spring ?

Motivacao: eu gostaria sem ter que alterar o codigo do FirstInterceptor, consegui inscrever mais configuracoes a serem executadas antes da logica ser executada… o FirstInterceptor faz parte de um pacote basico do meu sistema, uso em diversas aplicacoes, e nao gostaria de ter q recodar o objeto… minha intencao e’ adicionar novas classes, em cada projeto, para usar confs diferentes em cada um…

Resolvido!

encontrei a classe responsavel pelas injecoes … br.com.caelum.vraptor.ioc.Container

pronto, agora consegui fazer, fiz algumas modificacoes na minha classe… e pra adicionar novas confs, e so incremetar a lista…

vlw pessoal =D

Segue o codigo abaixo…

[code]@Intercepts
@RequestScoped
public class FirstInterceptor implements Interceptor {

private final static List<Class><? extends CommonRequestConfiguration>> confClasses = new ArrayList<Class><? extends CommonRequestConfiguration>>();
static {
	confClasses.add(DefaultConf.class);
}
/**
 * Adiciona uma configuracao a lista de configuracoes a serem executadas antes da logica.
 * @param confClass a classe da configuracao.
 */
public static void addConfClass(Class<? extends CommonRequestConfiguration> confClass) {
	confClasses.add(confClass);
}
/**
 * Remove uma configuracao a lista de configuracoes a serem executadas antes da logica.
 * @param confClass a classe da configuracao.
 */
public static void removeConfClass(Class<? extends CommonRequestConfiguration> confClass) {
	confClasses.remove(confClass);
}

private final Error500 error500;
private final Container container;
public FirstInterceptor(final Error500 error500, final Container container) {
	this.error500 = error500;
	this.container = container;
	
}

@Override
public boolean accepts(ResourceMethod resource) {
	return true;
}

@Override
public void intercept(InterceptorStack stack, ResourceMethod method, 
		Object resourceInstance) throws InterceptionException {
	try {
		for(Class<? extends CommonRequestConfiguration> confClass : confClasses) {
			container.instanceFor(confClass)
				.apply(method, resourceInstance);
		}
		stack.next(method, resourceInstance);
	} catch(Exception ex) {
		throw error500.handle(ex);
	}
}

}[/code]

Obs.: das classes listadas acima, as que pertencem apenas ao meu projeto sao:
CommonRequestConfiguration;
DefaultConf;
Error500;