JSF2, @ManagedProperty

4 respostas
ATEN

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());
}
ATEN

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.

ATEN

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