Atualmente estou desenvolvendo um sistema utilizando ADF Faces na IDE da Oracle JDeveloper 10.1.3.4 e passei por um problema interessante. Estava ocorrendo um problema na minha aplicação mas não era gerado nenhuma exception no console, onde após determinada ação da aplicação era impresso no console apenas:
15/01/2009 17:32:31 oracle.adf.controller.faces.lifecycle.FacesPageLifecycle addMessage WARNING: JBO-29000: null
Mensagem muito interessante e muito muito muito explicativa, não acham !?! :D
Depois de muito pesquisar, acabei encontrando uma forma de exibir o que ocasionou o JBO-29000 e é bem simples de implementar, a idéia principal é sobrescrever o métdo addMessage da classe FacesPageLifecycle e utilizá-la como o novo ADFPhaseListener do projeto.
Primeiro vou extender a classe FacesPageLifecycle e sobrescrever o metodo addMessage para ter o novo comportamento (mostrar a exception):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package br.com.rodrigolazoti.view.adf;
import javax.faces.context.FacesContext;
import oracle.adf.controller.faces.lifecycle.FacesPageLifecycle;
import oracle.binding.AttributeBinding;
public class MyPageLifecycle extends FacesPageLifecycle {
protected void addMessage(FacesContext context, AttributeBinding binding, Throwable error) {
super.addMessage( context, binding, error );
//aqui mostro o erro no console, log4j ou onde preferir
error.printStackTrace();
}
}
Agora eu extendo a classe ADFPhaseListener e retorno a minha classe criada acima ao invés de retorna a FacesPageLifecycle padrão do ADF:
1
2
3
4
5
6
7
8
9
10
11
12
13
package br.com.rodrigolazoti.view.adf;
import oracle.adf.controller.faces.lifecycle.ADFPhaseListener;
import oracle.adf.controller.v2.lifecycle.PageLifecycle;
public class MyPhaseListener extends ADFPhaseListener {
protected PageLifecycle createPageLifecycle() {
return new MyPageLifecycle();
}
}
Agora basta subistituir o ADFPhaseListener original pelo criado acima no arquivo de configuração do JSF (faces-config.xml):
1
2
3
<lifecycle>
<phase-listener>br.com.rodrigolazoti.view.adf.MyPhaseListener</phase-listener>
</lifecycle>
Com isso foi fácil descobrir o motivo da mensagem e o que estava acontecendo de errado na aplicação. ;)