Ao entrar em uma página preciso que execute um metodo no ben, como fazer ?
Pesquisei e achei algumas soluções, porem ao implementar não funcionou.
Achei um agora no site da primefaces, deve ser implementado assim ?
Exemplo:
<h:form>
<p:remoteCommand name="rc" update="msgs" actionListener="#{remoteCommandView.execute}" />
<p:growl id="msgs" showDetail="true" />
<p:commandButton type="button" onclick="rc()" value="Execute" icon="ui-icon-refresh" />
</h:form>
Ao testar ele entra em um loop infinito
No meu caso ele chama este metodo:
@PostConstruct
public void inicializar() {
this.tipoBusca = null;
this.registro0000 = null;
this.registro0100 = null;
this.registro0200 = null;
this.registro0300 = null;
}
Dê uma olhada em f:metadata e em preRenderView, acho que é o caso.
Testei este também, o problema é que sempre este método inicializar() é executado após o que o fluxo tem que fazer.
Por exemplo, chamo uma busca para constuir um h:panelGrid,
os passos são:
- 1º entra no método que faz a consulta, retornando os dados. Inserindo nas variáveis inicializar;
- 2º entra no método inicializar();
- 3º como o método inicializar(), limpa as variáveis, da consulta e a tabela fica vazio.
A anotação @PostConstruct irá indicar ao mecanismo do faces que este método deve ser executado SEMPRE que o construtor da classe que representa o managed bean tenha sido executado.
Isso ocorrerá em toda a requisição, quando o managed bean é @RequestScoped
Se não quer que isso ocorra, você não deve utilizar o @PostConstruct
Como você não está fazendo nenhuma chamada a consultas em bancos de dados ou a recursos que precisam de injeção de dependências dentro do método inicializar, não vejo necessidade em utilizar o @PostConstruct ali.
Explico: Quando você trabalha com JSF e injeção de dependências, a injeção das dependências só ocorre quando o método construtor é executado por completo e finalizado. Isso impediria que você tentasse popular um objeto com o retorno da invocação de um método que é fornecido por um atributo injetado. Logo, se fez necessário criar algo que fosse executado após o construtor e após as dependências terem sido injetadas. Surgiu o @PostConstruct. Em contrapartida, existe o @PreDestroy, que é executado antes do objeto representando o managed bean ser destruído.
No xhtml está assim:
<h:form id="declaracaoInformacaocomumPesquisa">
<p:remoteCommand name="nomeRemoteCommand" id="idRemoteCommand"
action="#{declaracaocontroller.inicializar()}" autoRun="false"
update="declaracaoInformacaocomumPesquisa" />
No controle está assim:
public void inicializar() {
this.tipoBusca = null;
this.registro0000 = null;
this.registro0100 = null;
this.registro0200 = null;
this.registro0300 = null;
}
Continua entrando em um loop infinito.
Se tiro o que coloquei no xhtml funciona normal.
Utilize, f:event e preRenderView
Tentei e não consegui.
Pode me passar um exemplo ?
Se você realmente precisa que o método seja chamado pela página.
Você pode chama-lo pelo onload.
<h:body onload="#{meuBean.executa()}">
Caso possa ser executado pelo beam e não chamado pela tela.
Você pode fazer assim.
@PostConstruct
public void init(){
//código a ser executado
}
Nota: Métodos anotados com @PostConstruct são executados ao termino da inicialização do beam. Construtor e variáveis são inicializadas antes e logo depois chama o método anotado.