martes, 26 de junio de 2007

Gestión de errores en Seam

Con la etiqueta "restrict" me parece que se produce una redirección una vez que se salva la condición?

Ejemplo de Seam util para investigar: blog,
en este no se recoge la excepción en el pages.xml, unicamente la clase de excepción EntryNotFoundException tiene las etiquetas:
@ApplicationException(rollback=true)
@HttpError(errorCode=HttpServletResponse.SC_NOT_FOUND)
y entonces y con el web.xml:

<error-page>
<error-code>404</error-code>
<location>/seam/404.xhtml</location>
</error-page>

directamente busca el 404.xhtml

Las excepciones heredan de RuntimeException
y se producen en la invocación de un metodo jsf, es decir metodo público que no devuelve nada.
ejemplo metodo jsf que lanza excepción:
public void buscar(){
....
thrown new RuntimeException("algo ha fallado");
....
}

ademas se pueden producir a través del pages.xml con la etiqueta "restrict" o con "action" dentro de "page"

<page view-id="/gestion/*">
<restrict>#{authenticator.admin}</restrict>
</page>

<exception class="es.miao.MiaoExcepcion">
<redirect view-id="/error.xhtml">
<message>ha funcionado la runtime exception</message>
</redirect>
</exception>


Se supone que al entrar en cualquier pagina que se corresponda con el patrón "/gestion/*" es decir todas aquellas que se encuentren en la carpeta gestion, serán restringidas a que el componente authenticator responda afirmativamente al metodo isAdmin().
De lo contrario la etiqueta restrict se encarga de llevar a la página de error correspondiente.

<exception class="org.jboss.seam.security.NotLoggedInException">
<redirect view-id="/login.xhtml">
<message>#{messages.masInfo}</message>
</redirect>
</exception>

Con "restrict" es el componente Identity el que se encarga de evaluar la expressión y lanzar la correspondiente excepción, también podríamos obtener una excepción de la etiqueta "action"
<action execute="#{catalogoAction.disminuye}" />

Se supone que las acciones jsf no devuelven nada como resultado return void. Sin embargo la etiqueta restrict espera un boolean [boolean isAdmin(), ó , boolean isChecked()]



No hay comentarios: