[VRaptor] Dúvida quanto a comportamento de injeções

Senhores,

Hoje fazendo uns testes no Vraptor com um amigo, vimos um comportamento um tanto estranho e gostaria de uma explicação, se possível.

Usei o projeto vraptor-mydvds para fazer o teste.

Na classe HomeController criei o seguinte método:

	@Public
	@Get
	public void testeInjection(){
	}

Criei também uma classe nova num pacote novo

package br.com.caelum.vraptor.mydvds.util;

import javax.servlet.http.HttpServletRequest;
import br.com.caelum.vraptor.ioc.Component;

@Component
public class CommonRequestUtil {

	private final HttpServletRequest request;

	public CommonRequestUtil(HttpServletRequest _request) {
		this.request = _request;
	}

	public String getServerName(){
		return request.getServerName();
	}
}

Ainda na classe HomeController adicionei a seguinte propriedade SEM GETTER e SETTER:

	@Autowired
	private CommonRequestUtil requestUtil; 

No meu JSP testeInjection.jsp (dentro de home) apenas isso:

Hello I'm Here!
${commonRequestUtil.serverName}

A pergunta é: Porque é que o jsp tem acesso ao commonRequestUtil se eu não disponibilizei um getter?

EDIT: ele imprime no browser

Hello I’m Here! localhost

opa, vulpios vc n precisa anotar sua dependencia com autowired, vc pode recebe-la no seu construtor. Creio que isso nao influencia, porém fica mais elegante e deixa seu controller mais testável.

acredito que vc consiga pegar na view os atributos do seu controller por padrao.

vou acompanhar para ter certeza…

Olá Renan,

Eu sei que eu não preciso anotar minha dependência, a pergunta foi justamente relativa ao fato de que eu anoto a dependência e o vraptor e/ou spring disponibiliza esse cara na minha EL sem um GET/SET no meu controller, o que não deveria acontecer. Conheço o framework e as boas práticas do vraptor, minha pergunta é porque isso acontece. Dessa forma aí, se existir classes anotadas com @Component em alguma classe do escopo do meu controller e eu utilizar na página, posso pegar a instância e fazer o que eu quiser.

Por exemplo, na minha mesma página (jsp) se eu colocar o código assim:

Hello I'm Here!<br/>
${commonRequestUtil.serverName}<br/>
${defaultUserDao.class.methods[0]}<br/>
${defaultUserDao.class.methods[1]}<br/>
${defaultUserDao.class.methods[2]}<br/>
${defaultUserDao.class.methods[3]}<br/>

O resultado vai ser esse:

Hello I’m Here!
localhost
public void br.com.caelum.vraptor.mydvds.dao.DefaultUserDao.add(br.com.caelum.vraptor.mydvds.model.User)
public br.com.caelum.vraptor.mydvds.model.User br.com.caelum.vraptor.mydvds.dao.DefaultUserDao.find(java.lang.String)
public br.com.caelum.vraptor.mydvds.model.User br.com.caelum.vraptor.mydvds.dao.DefaultUserDao.find(java.lang.String,java.lang.String)
public void br.com.caelum.vraptor.mydvds.dao.DefaultUserDao.update(br.com.caelum.vraptor.mydvds.model.User)

Na minha opinião isso NUNCA deveria acontecer, mas enfim, não parei para estudar o código para saber se isso é normal ou bug, enfim…

Não estou querendo saber como fazer, estou querendo saber o porquê do VRaptor deixar esse comportamento acontecer!

Abraços!

isso é um detalhe de implementação do Spring (que virou feature incidental do vraptor)… todo componente request scoped é guardado como um atributo do request, com o nome da classe e todo session scoped é guardado como atributo da session.

Resumindo isso é normal. Só pq vc pode acessar um dao no jsp, não quer dizer que vc deva fazer isso :wink:

e vc só consegue acessar getters