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

1 resposta
Lavieri

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
@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);
		}
	}
}

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

static List<Class<CommonRequestConfiguration>> confClassses;

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...

1 Resposta

Lavieri

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...
@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);
		}
	}
}

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

Criado 22 de fevereiro de 2010
Ultima resposta 22 de fev. de 2010
Respostas 1
Participantes 1