VRaptor (Acessar dados de um @Component na minha JSP)

Bom Dia à Todos,

Estou com uma dúvida no VRaptor (sou iniciante) e não consegui entender como fazer, é o seguinte, tenho um bean anotado como @Component e @SessionScoped e gostaria de acessar os atributos desse bean em uma JSP que possuo ${meuBean.atributo01} por exemplo. Porém não está funcionando não dá erro mas não aparece nada, estou com algum conceito errado? Para acessar valores na JSP sempre tenho que inserir os objetos no objeto Result do VRaptor?

Obrigado à todos desde já.

Att,
IAX

Olá IAX. Tu tens que chamar os métodos do bean pela classe MeuBeanController, no bean tu usa o return, e no Controller tu usas o return ou resul. E o jsp deve ficar dentro de uma pasta com o mesmo nome do bean, dentro da pasta jsp, dentro da pasta WEB-INF.

Olá ressacaafu,

Primeiramente obrigado pela ajuda, mas acho que não fui muito claro. O funcionamento básico do VRaptor está bem claro pra mim, a dúvida é, preciso de algumas informações que não estão dentro do Controller da página, no caso está em um Componente do VRaptor, seria possível nessa JSP eu buscar essas informações ou não? Caso não, seria pq eu tenho sempre que utilizar o atributo Result do VRaptor para retornar valores para a página?

Espero ter sido mais claro.

Att,
IAX

É possível acessar os atributos no JSP, mas tem que usar a classe BeanController com result ou return pra mandar esses dados pra JSP. Fui claro?

Olá,

Foi sim, é justamente isso que gostaria de saber, se obrigatoriamente tenho que utilizar o Result do VRaptor.

Obrigado!

Disponha amigo.

IAX, dá pra acessar o componente sessionScoped diretamente do JSP sim, desde que vc esteja usando o Spring ou o Guice, e o componente já esteja carregado…

se existe:

@Component
@SessionScoped
class MeuBean {
    private String teste = "Abc";

    public String getTeste() {
         return teste;
    }

}

se vc usar ${meuBean.teste} teoricamente funciona na JSP. Mas o componente precisa já ter sido usado em algum lugar.

Lucas,

É exatamente o que estou fazendo, com exceção de que o bean não é invocado em momento algum a não ser na JSP em questão, vou tentar invocá-lo antes assim como vc me sugeriu obrigado!

Att,
Isaque Xavier

se você usa o bean só no jsp, como vc popula os valores nele?

Lucas,

Segue o código pra você enteder melhor.

Bean

@Component
@SessionScoped
public class LoggedUserUtils implements Serializable {

	private static final long serialVersionUID = 1L;
	private User user;
	@Autowired
	private UserDAO userDAO;
	
	
	public User getUser(){
		if(this.user == null){
			Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
			if(principal != null && !"".equals(principal)){
				user = userDAO.findEntityById((String) principal);
			}
		}
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
	
}

jsp

<div id="infoHeaderLeft">${loggedUserUtils.user.name}</div>

Na teoria pra mim o valores serão populados quando o VRaptor chamar o métod get para acessar os atributos.

Obrigado!

coloque o código que está dentro do if (user == null) dentro de um método void sem argumentos anotado com @PostConstruct.

isso força o VRaptor a inicializar a classe.

Lucas,

Fiz como sugeriu e não funcionou, na verdade o que estou achando estranho que é que nas duas abordagens os métodos simplesmente não são invocados pela JSP.

@Component
@SessionScoped
public class LoggedUserUtils implements Serializable {

	private static final long serialVersionUID = 1L;
	private User user;
	@Autowired
	private UserDAO userDAO;
	
	@PostConstruct
	public void init(){
		if(this.user == null){
			Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
			if(principal != null && !"".equals(principal)){
				user = userDAO.findEntityById((String) principal);
			}
		}
	}
	
	public User getUser(){
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
}

coloque um log dentro do método init (ou um println) pra ver se está passando por lá…

se ainda assim não chamar, tenta receber um LoggedUserUtils no construtor do controller da jsp que vc está chamando