4 Ocak 2009 Pazar

JSF'te istisna yakalama

Jsf ile geliştirdiğiniz bir web uygulamasında alınan hataları yakalayıp ortak bir hata sayfasına yönlerdirmek için jsf'in bir sınıfı olan ActionListenerImpl sınıfını extend edip faces-config'e gerekli değişiklikleri yaparak genel bir çözüm üretebilirsiniz.

faces-config.xml'de application taglerinin arasına bir action-listener tanımı koymak gerekmektedir. Böylece jsf artık sizin custom listener'ınızı kullanacaktır.

<application>
<action-listener>dev.action.listeners.CustomActionListener</action-listener>
</application>


Hata alındıktan sonra hata sayfasına yönlendirmek için faces-config'e bir tane navigation rule eklenmelidir.

<navigation-rule>
<navigation-case>
<from-outcome>customErrorPage</from-outcome>
<to-view-id>/customErrorPage.jsp</to-view-id>
</navigation-case>
</navigation-rule>


ve aşağıda hatayı yakalayıp hata sayfasının istediği formata çevirip session koyduktan sonra hata sayfasını açan action listener.

package dev.action.listeners;

import com.ibm.faces.context.MultipartExternalContextImpl;
import com.sun.faces.application.ActionListenerImpl;
import javax.faces.FacesException;import javax.faces.application.Application;
import javax.faces.application.NavigationHandler;
import javax.faces.component.ActionSource;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.el.MethodBinding;
import javax.faces.event.ActionEvent;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpSession;
import dev.utils.CustomErrorData;
import dev.constants.Sabitleri;

public class CustomActionListener extends ActionListenerImpl {

public CustomActionListener() {
}

public void processAction(ActionEvent event) {

UIComponent component = event.getComponent();
ActionSource actionSource = (ActionSource) component;
MethodBinding methodBinding = actionSource.getAction();
try {
super.processAction(event);
} catch (FacesException e) {
hataSayfasiniHazirla(e, methodBinding);
}
}

private void hataSayfasiniHazirla(FacesException e, MethodBinding methodBinding){

FacesContext context = FacesContext.getCurrentInstance();
Application application = context.getApplication();
ServletException servletException = new ServletException(e.getMessage(), e);
MultipartExternalContextImpl externalContext = (MultipartExternalContextImpl)
context.getExternalContext();

HttpServletRequestWrapper requestWrapper = (HttpServletRequestWrapper)
externalContext.getRequest();
HttpServletRequest httpServletRequest = (HttpServletRequest)
requestWrapper.getRequest();
CustomErrorData errorData = hataSayfasiVeriHazirla(((Throwable) servletException),
httpServletRequest);
HttpSession session = httpServletRequest.getSession(); session.setAttribute
("customErrorData", errorData);
NavigationHandler navigationHandler= application.getNavigationHandler();
navigationHandler.handleNavigation(context, null == methodBinding? null:
methodBinding.getExpressionString(), Sabitler.GENEL_HATA_NAVIGATION);

context.renderResponse();
}
}

ve en son olarak customErrorPage.jsp'yi kodlamak gerekiyor. bu da artık sizin ihtiyaçlarınıza göre şekillenir.

Hiç yorum yok: