JSF
Descobrindo as exceptions encobertas pelo ADF Faces
28/01/09
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 !?!
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):
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:
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):
<pre class="code"><lifecycle> <phase -listener>br.com.rodrigolazoti.view.adf.MyPhaseListener</phase> </lifecycle></pre>
Com isso foi fácil descobrir o motivo da mensagem e o que estava acontecendo de errado na aplicação.
Oracle Enterprise Pack for Eclipse 1.0
03/09/08
A Oracle liberou o release da versao 1.0 do OEPE (Oracle Enterprise Pack for Eclipse), que nada mais é do que um conjunto de plugins para o Eclipse.
Segundo o post no site TheServerSide.com, alguns dos recursos que o OEPE fornece são:
In addition to capabilities provided by Eclipse and Web tools platform, OEPE provides the following features:
- Fastswap – Java Class Redefinition support for WebLogic Server
- Develop, debug and deploy to Oracle WebLogic Server 10gR3, and multiple previous versions
- Remote deployment and debugging, JSP Debugging for WebLogic Server 9.x and higher
- Virtual EAR technology that improves WebLogic Server deployment performance for large applications
- Leverage WebLogic Shared J2EE Libraries to make packaging of Enterprise Java Applications easier and faster
- Deployment descriptor editors for weblogic.xml and weblogic-application.xml
- Oracle Database Plug-in for Eclipse Data Tools Platform
- JSF Facelets Tools Project (Incubator)
Realizei pequenos testes utilizando o plugin com o Oracle Weblogic Server 10gR3 e tudo funcionou muito bem, não deixou o Eclipse pesado como alguns plugins fazem. Mas o que mais me agradou neste pack e que pelo menos no meu dia-a-dia fazia muita falta, foi o auto-complete para páginas xhtml (JSF + Facelets).
O OEPE possui versões para o Eclipse 3.3 (Europa) e 3.4 (Ganymede) e está disponivel para download aqui.
Você pode obter mais informações, no próprio site da Oracle.
Filtrando requisições em JSF com PhaseListener
01/09/08
Antigamente a forma mais comum para se criar uma forma de verificar a autorização das requisições feitas para determinado recurso de uma aplicação web era utilizando um filtro (Filter). Porém em Java Server Faces (JSF), podemos realizar esta tarefa de uma outra forma mais integrada, utilizando a interface PhaseListener.
Esta interface disponibiliza 3 métodos:
void afterPhase(PhaseEvent event); void beforePhase(PhaseEvent event); PhaseId getPhaseId();
No exemplo, irei demonstrar como utilizar o método afterPhase que tem por finalidade fazer o tratamento de uma notificação assim que o processamento de uma determinada fase acabar de ser concluída.
A idéia principal do listener será verificar se existe um atributo de sessão chamado “currentUser” que será uma instância de um objeto User e este representará o usuário logado na aplicação. Caso este atributo exista, o listener deixa o ciclo da pagina seguir, mas caso o atributo não exista o ciclo será interrompido e redirecionado para a página de login.
Também terá uma verificação para não fazer nenhuma verificação caso a página atual da requisição seja a página de login.
Aqui temos o código do PhaseListener:
package com.rodrigolazoti.filter;
import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpSession;
public class AuthorizationListener implements PhaseListener {
public void afterPhase(PhaseEvent event) {
FacesContext facesContext = event.getFacesContext();
String currentPage = facesContext.getViewRoot().getViewId();
boolean isLoginPage = (currentPage.lastIndexOf("login.jsf") > -1);
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
Object currentUser = session.getAttribute("currentUser");
if (!isLoginPage && currentUser == null) {
NavigationHandler nh = facesContext.getApplication().getNavigationHandler();
nh.handleNavigation(facesContext, null, "loginPage");
}
}
public void beforePhase(PhaseEvent event) {
}
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
}
}
Note que o redirecionamento é feito por uma navegação configurada no arquivo faces-config.xml. Esta configuração é algo como:
<navigation-rule> <from-view-id>/*</from-view-id> <navigation-case> <from-outcome>loginPage</from-outcome> <to-view-id>/login.xhtml</to-view-id> </navigation-case> </navigation-rule>
Também deve-se incluir o listener no faces-config.xml:
<lifecycle> <phase-listener>com.rodrigolazoti.filter.AuthorizationListener</phase-listener> </lifecycle>
E com isso já se tem um PhaseListener funcionando e filtrando as requisições da aplicação.
Últimos comentários