SeamFramework.orgCommunity Documentation
Según la especificación de Web Beans:
En muchos sistemas, el uso de patrones arquitecturales produce una serie de roles de Web Beans recurrentes. Un estereotipo permite al desarrollador de marco identificar dicho rol y declarar algunos metadatos comunes para Web Beans con ese rol en un lugar central.
Un estereotipo encapsula cualquier combinación de:
un tipo de despliegue predeterminado,
un tipo de ámbito predeterminado,
una restricción en el ámbito de Web Bean,
un requisito que implementa el Web Bean o extiende un cierto tipo y
una serie de anotaciones de enlace del interceptor.
Un estereotipo puede también especificar que todos los Web Beans con el estereotipo tengan nombres de Web Beans predeterminados.
Un Web Bean puede declarar cero, uno o múltiples estereotipos.
Un estereotipo es un tipo de anotación Java. Dicho estereotipo identifica clases de acción en algún marco MVC:
@Retention(RUNTIME)
@Target(TYPE)
@Stereotype
public @interface Action {}
Utilizamos el estereotipo aplicando la anotación al Web Bean.
@Action
public class LoginAction { ... }
Un estereotipo puede especificar un ámbito y /o tipo de despliegue predeterminados para Web Beans con ese estereotipo. Por ejemplo, si el tipo de despliegue @WebTier
identifica Web Beans que deben ser desplegados sólo cuando el sistema se ejecuta como una aplicación de red, podríamos especificar los siguientes valores por defecto para clases de acción:
@Retention(RUNTIME)
@Target(TYPE)
@RequestScoped
@WebTier
@Stereotype
public @interface Action {}
Obviamente, una acción particular aún puede omitir estos valores predeterminados si es necesario:
@Dependent @Mock @Action
public class MockLoginAction { ... }
Si deseamos forzar todas las acciones a un ámbito determinado, también lo podemos hacer.
Supongamos que deseamos evitar acciones de declarar determinados ámbitos. Web Beans nos permite especificar explícitamente la serie de ámbitos permitidos para Web Beans con un estereotipo determinado. Por ejemplo:
@Retention(RUNTIME)
@Target(TYPE)
@RequestScoped
@WebTier
@Stereotype(supportedScopes=RequestScoped.class)
public @interface Action {}
Si una clase de acción determinada intenta especificar un ámbito diferente al ámbito de la petición de Web Beans, el administrador de Web Bean producirá una excepción en el momento de inicialización.
También podemos forzar todos los Web Bean con un estereotipo determinado para implementar una interfaz o extender una clase:
@Retention(RUNTIME)
@Target(TYPE)
@RequestScoped
@WebTier
@Stereotype(requiredTypes=AbstractAction.class)
public @interface Action {}
Si una clase particular de acción no extiende la clase AbstractAction
, el administrador de Web Bean producirá una excepción en el momento de inicialización.
Un estereotipo puede especificar una serie de enlaces de interceptor para que sean heredados por todos los Web Beans con ese estereotipo.
@Retention(RUNTIME)
@Target(TYPE)
@RequestScoped
@Transactional(requiresNew=true)
@Secure
@WebTier
@Stereotype
public @interface Action {}
¡Esto nos ayuda a obtener cuestiones técnicas aún más allá del código de negocios!
Por último, podemos especificar que todos los Web Beans con un determinado estereotipo tengan un nombre de Web Bean, predeterminado por el administrador del Web Bean. Se suele hacer referencia a las acciones en páginas JSP, así que son un caso de uso perfecto para esta función. Todo lo que necesitamos es agregar una anotación vacía a @Named
.
@Retention(RUNTIME)
@Target(TYPE)
@RequestScoped
@Transactional(requiresNew=true)
@Secure
@Named
@WebTier
@Stereotype
public @interface Action {}
Ahora, LoginAction
se llamaráloginAction
.
Ya hemos visto dos estereotipos estándar definidos por la especificación de Web Beans: @Interceptor
y @Decorator
.
Web Beans define otro estereotipo estándar:
@Named
@RequestScoped
@Stereotype
@Target({TYPE, METHOD})
@Retention(RUNTIME)
public @interface Model {}
Este estereotipo está destinado a ser utilizado con JSF. En lugar de usar beans JSF administrados, solamente anote un Web Bean @Model
, y utilícelo directamente en su página JSF.