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:
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…
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)
...
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á.
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?
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
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?
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.