JSF - Bean dentro de bean

Boa tarde pessoal!

Estou com um problema aqui de bean dentro de bean…
Possuo um bean RequestScoped que seria o meu Cliente. Dentro desse bean eu tenho o comboBean que é os estados e cidades.
A hora que eu coloco:

comboBean.setEstado(cliente.getCid_id().getEst_id()); 

dá Exception de nullpoint… Se eu dou um println em cliente.getCid_id().getEst_id().getNome(), ele printa normal, mas o problema é setar ele dentro de outro bean.
Ja tentei colocar esse outro bean como view, request, e nada…
Os dois bean como session, funciona normal, mas não é isso que estou precisando…

Alguem sabe o que eu preciso fazer?

Olá, estais usando @ManagedProperty ou @Inject neste comboBean?

Na verdade, nenhum dos dois!

@ManagedBean(name = "comboBean") @ViewScoped public class ComboBean implements Serializable {

Vou ler um pouco aqui sobre ManagedProperty e tentar implementar alí…
Aproveitando, qual seria mais indicado, ManagedProperty ou Inject?

Obrigado!

[b]EDIT: Desculpa, não prestei atenção aqui. Estou usando ManagedProperty:

@ManagedProperty(value = "#{comboBean}") private ComboBean comboBean;
[/b]

Pensei que o Exception NULL, era por causa que o objeto ainda nao existia, então veja o que eu fiz:

@PostConstruct public void init(){ if (cidade == null) { cidade = new Cidade(); } if (estado == null) { estado = new Estado(); } estados = estDao.listarTodos(); }

E o managedBean não tem construtor, meu pensamento esta certo?
E mesmo com essa alteração ainda da como NULL Exception…

O erro que dá:

aused by: java.lang.NullPointerException at br.com.zanzini.bean.AlterarClienteBean.<init>(AlterarClienteBean.java:70) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) ...

A linha 70 do AlterarClienteBean:

comboBean.setEstado(cliente.getCid_id().getEst_id());

Abraço!

Aqui mostra como injetar um MB dentro de outro: Aplicação Web Completa Tomcat JSF Primefaces JPA Hibernate.

Lembre-se que se for como request scoped os valore precisam estar preenchidos sempre, você não pode depender de um valor que já foi preenchido e magicamente deverá estar preenchido lá.

[quote=Hebert Coelho]Aqui mostra como injetar um MB dentro de outro: Aplicação Web Completa Tomcat JSF Primefaces JPA Hibernate.

Lembre-se que se for como request scoped os valore precisam estar preenchidos sempre, você não pode depender de um valor que já foi preenchido e magicamente deverá estar preenchido lá. [/quote]

Consegui resolver, o problema é que eu tava usando construtor, mudei tudo para PostConstruct e resolveu…
Irei dar uma lida sobre o construtor e postconstruct, pq nem imagino a diferença deles.
Quem tiver um bom material sobre esses dois assuntos e suas diferenças, pode me indicar?

Obrigado!

Construtor é default, cahamdo quando ocorre a instanciação da classe, porém para realizar injeção de campos não existe mágica, o framework precisa instanciar o objeto para depois injetar os valor, e depois que ele faz isso que é chamaod o postConstruct, logo no momento de chamada do construtor os campos anotados ainda estão nulos

Entendi amigo,
então melhorando sua explicação:

Se eu tiver um commandButton com action="#{bean.Metodo}", ao eu clicar nesse botão, a primeira coisa que irá executar é o construtor do bean (que no caso vai estar tudo nulo), após passar pelo construtor, será chamado o @PostConstruct do bean, e só depois será executado o Metodo do bean, correto?

Entendi amigo,
então melhorando sua explicação:

Se eu tiver um commandButton com action="#{bean.Metodo}", ao eu clicar nesse botão, a primeira coisa que irá executar é o construtor do bean (que no caso vai estar tudo nulo), após passar pelo construtor, será chamado o @PostConstruct do bean, e só depois será executado o Metodo do bean, correto?[/quote]

Depende, se o escopo deste bean for de Session por exemplo, e ele já foi utilizado anteriormente durante essa sessão, somente o método será chamado.

Também deve-se salientar que a diferença prática muito importante entre o construtor e o @PostConstruct é que o primeiro é executado enquando as propriedades anotadas para injeção aidna são nulas, ou seja a injeção ainda não foi executada, já no @PostConstruct, todas as injeções já foram executadas, logo os campos anotados para injeção possuem seus valores válidos.

Isso vale para injeções sobre campos, quando o @Inject é anotado sobre o construtor com parametros, a injeção dos parametros no construtor ocorre antes da execução do mesmo, isto pode ser útil em casos onde é preciso que determinada ação seja executada no construtor(como instanciação de campos final).

Porém para melhorar a legibilidade do código eu evito a segunda abordagem quando ela não se faz obrigatória.