Obtendo os beans gerenciados pelo vraptor

12 respostas
renanreismartins

Prezados é de meu conhecimento que desde que se anote um bean com @Component consigo injetar esse bean em outro via construtor.

Porém, gostaria de saber se há como pegar uma instancia, manualmente, algo como fazemos no Spring, através do context.

applicationContext.getBean(um type ou string aqui);

Explico o motivo: tenho um aspecto que pega beans gerenciados pelo Spring, porém os @Component do vraptor não estão neste contexto. Algo como:

public aspect DependencyResolver implements ApplicationContextAware {

	private ApplicationContext	applicationContext;

	public void setApplicationContext(final ApplicationContext applicationContext) {
		this.applicationContext = applicationContext;
	}

	before(Object target) : get(@ResolveDependency * *) && target(target) {
		try {
			
			final Field field = target.getClass().getDeclaredField(thisJoinPoint.getSignature().getName());
			field.setAccessible(true);

			if (field.get(target) == null)
				field.set(target, applicationContext.getBean(field.getType())); // COLOCARIA AQUI BEANS VINDOS DO VRAPTOR

		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}

grande abrasssss

12 Respostas

Lucas_Cavalcanti

estranho os beans do VRaptor não estarem aí… em todo caso vc pode receber um Container do vraptor, que tem acesso a todos os beans.

renanreismartins

entao lucas, até criei um teste pra isso.

quando anoto com br.com.caelum.vraptor.ioc.Component
não rola, já com o org.springframework.stereotype.Component dá certo.

Qual classe seria essa classe Container do Vraptor?

PS: ai eu conseguiria acesso a todos os beans com as dependencias ja injetadas?

abrassss

Lucas_Cavalcanti

vc colocou um applicationContext.xml no classpath? tá com o VRaptor 3.4.x? se sim, o contexto do spring deveria ter o contexto do vraptor junto.

e sim, já vem com tudo injetado.

renanreismartins

grande lucas,

coloquei o applicationContext no classpath e sim, estou com a versão 3.4.1

poderia me ajudar achar onde estou errando? faço uma simples chamada ao context

field.set(target, aplicationContext.getBean(field.getType()));

e nao encontra os bean se nao tiverem anotados com @Component ou @service e etc do spring.

abrass

Lucas_Cavalcanti

tenta pegar o parent desse applicationContext…

se eu não me engano, o vraptor registra os beans dele e registra os beans do applicationContext.xml num context filho.

renanreismartins

O

applicationContext.getParent()

me retorna null… =/

alguma ideia?

mais uma vez obrigado

Lucas_Cavalcanti

tenta pegar um BeanFactory ao invés do ApplicationContext…

e tenta roubar usando o WebApplicationContextUtils pra pegar o cara tb =)

renanreismartins

oi lucas, o BeanFactory tentei pegar da seguinte maneira

applicationContext.getParentBeanFactory()

porém como citado o parent é null, então não é possível.

com relação ao WebApplicationContextUtils fiz o seguinte:

fiz o aspecto implementar ServletContextAware para conseguir pegar um servletContext e implementei o setter.

então para para pegar o bean fiz:

WebApplicationContextUtils.getWebApplicationContext(servletContext).getBean(field.getType())

porém o servletContext está null.

é dessa maneira que deveria ter feito?

UPDATE: lembrando que estou rodando isso num junit test, subindo o contexto e etc. Mas não na aplicação propriamente dito, com tomcat e etc

abrassss

Lucas_Cavalcanti

aaaah tah… pq vc não falou isso antes? :wink: (ou pq eu não li isso antes rsrs)

os beans do VRaptor só são registrados na aplicação web…

se vc quiser simular esse registro, vc precisa “rodar” o SpringProvider do vraptor (rodar o start e configurar tudo)

renanreismartins

putz man, ahahaha menos mal! Muito obrigado lucas pela atenção.

Por isso entao nao consigo pegar o bean do context. rs

Rodei o sistema e funcionou. Tinha criado um teste apenas para garantir a suposição que eu fazia, de que era possivel conseguir beans do vraptor através do applicationContext.
Então no problem, não preciso desse teste.

Apenas por curiosidade, e para aprender mais:

“os beans sao registrados apenas na aplicação web”, quando subo um contexto não é como se estivesse com a app no ar?

como “rodaria” o SpringProvider ?

grande abrasssss

Lucas_Cavalcanti

se vc sobe um contexto a partir do applicationContext.xml ele é uma app no ar, mas não uma webapp no ar :wink:

pra rodar o SpringProvider, vc precisaria mockar o ServletContext e chamar o método start dele… não sei se vai ser muito fácil de fazer isso, pq tem bastante coisa que tem que stubar (tipo configurações, onde ficam as classes, algo do tipo)…

se vc der uma olhada nos testes dos providers do VRaptor dá pra ter uma idéia dos stubs necessários.

renanreismartins

ahaahah boa.

mto obrigado Lucas!

abrasss

Criado 2 de dezembro de 2012
Ultima resposta 3 de dez. de 2012
Respostas 12
Participantes 2