JSF2, @ManagedProperty

4 respostas
A

E ai pessoal, estou usando jsf2 e injetando um bean no outro com a anotação @ManagedProperty.
Percebi que ao utilizá-la no construtor da classe, esta, por sua vez, não é instanciada, já contornei o problema, mas gostaria de saber se alguém já passou pelo problema ou o conseguiu uma solução para tal comportamento. Ou, simplesmente, não é possível fazer isso.

Segue um exemplo do que eu estou falando

@ManagedBean(name="adminBean")
@ViewScoped
public class AdminBean implements Serializable{

	private static final long serialVersionUID = 1L;
	
	private int media;
	
	@ManagedProperty(value = "aluno") //injeção do bean - session bean
	private Aluno aluno;
	
	public AdminBean(){
		this.media = calculaMedia(aluno.getNotas()); //Ao utilizar aqui o Aluno, a classe não instância.
	}

         //getters e setters

Caso queira utilizar o aluno em algum outro método que não seja o construtor, não ocorrerá erro, alguem sabe pq isso ocorre?
[]s

4 Respostas

A

1 - Você deve utilizar o ManagedPorperty com Expression Language:

@ManagedProperty(value = "#{aluno}")
private Aluno aluno;

2 - A injeção de dependencia não é feita no construtor, e sim após ele, para pegar, cria um método anotado com @PostConstruct (javax.annotation):

@PostConstruct
public void init(){
     this.media = calculaMedia(aluno.getNotas());
}
A

A expression language eu estava usando já, erro meu esquecer de colocar no exemplo.

Mas só é possivel acessar o objeto injetado em algum metodo, no costrutor isso nao acotece, bom saber. Mas tem ideia do por que disso?

Obrigado pela resposta ayslanms.

A

O objetivo do @PostConstrust é justamente esse. Não acessar objeto injetado no construtor se deve ao ciclo de vida de injeção de dependência pois no momento do construtor não existe esse objeto ainda.

A

Valeu pela resposta ayslanms,
estou desenvolvendo com o Tomcat7, o qual não tem suporte para CDI.
E estou tomando como referência o livro do David Geary, Core Java Server Faces, ele fala brevemente sobre @ManagedProperty e eu não sabia do @PostConstrust.
Logo pelo que eu entendi para atribuir um valor a um atributo no momento da instanciação com o @ManagedProperty será necessário criar um método com a notação @PostConstruct.

Obrigado por repartir seu conhecimento.

[]s

Criado 6 de agosto de 2012
Ultima resposta 6 de ago. de 2012
Respostas 4
Participantes 2