SeamFramework.orgCommunity Documentation

Capítulo 12. Definición de Web Beans utilizando XML

12.1. Declaración de clases de Web Bean
12.2. Declaración de metadatos de Web Bean
12.3. Declaración de miembros de Web Bean
12.4. Declaración de Web Beans en línea
12.5. Uso de un esquema

Hasta ahora hemos visto varios ejemplos de Web Beans declarados mediante anotaciones. No obstante, hay un par de ocasiones en que no podemos utilizar anotaciones para definir el Web Bean.

En estos casos, Web Beans nos ofrece dos opciones:

Muchos marcos utilizan XML para proporcionar metadatos relacionados con clases de Java. Sin embargo, Web Beans usa un método muy diferente para especificar los nombres de clases de Java, campos o métodos para la mayoría de otros marcos. En lugar de escribir nombres de clase y miembro como valores de cadena de elementos XML y atributos, Web Beans le permite utilizar el nombre de clase o miembro como el nombre del elemento XML.

La ventaja de este enfoque es que se puede escribir un esquema de XML que evita errores de ortografía en su documento de XML. Es incluso posible que una herramienta genere automáticamente el esquema XML desde el código de Java compilado. O, un entorno de desarrollo integrado podría realizar la misma validación sin la necesidad de una etapa de generación intermedia explícita.

Para cada paquete de Java, Web Beans define el espacio de nombre de XML correspondiente. El espacio de nombre se forma añadiendo urn:java: al nombre de paquete de Java. Para el paquete com.mydomain.myapp, el espacio de nombre de XML es urn:java:com.mydomain.myapp.

Los tipos Java pertenecientes a un paquete se conocen por un elemento XML en el espacio de nombre correspondiente al paquete. El nombre del elemento es el nombre del tipo de Java y los métodos del tipo están especificados por elementos secundarios en el mismo espacio de nombre. Si el tipo es una anotación, los miembros son especificados por atributos del elemento.

Por ejemplo, el elemento <util:Date/> en el siguiente fragmento XML se refiere a la clase java.util.Date:


<WebBeans xmlns="urn:java:javax.webbeans"
          xmlns:util="urn:java:java.util">

    <util:Date/>

</WebBeans
>

¡Y este es todo el código que necesitamos para declarar que Date es un Web Bean sencillo! Una instancia de Date puede ahora ser inyectada por cualquier otro Web Bean:

@Current Date date

Podemos declarar el ámbito, el tipo de despliegue y los tipos de enlace de interceptor mediante elementos directos secundarios de la declaración del Web Bean:


<myapp:ShoppingCart>
    <SessionScoped/>
    <myfwk:Transactional requiresNew="true"/>
    <myfwk:Secure/>
</myapp:ShoppingCart
>

Utilizamos exactamente el mismo método para especificar nombres y tipo de enlace:


<util:Date>
    <Named
>currentTime</Named>
</util:Date>

<util:Date>
    <SessionScoped/>
    <myapp:Login/>
    <Named
>loginTime</Named>
</util:Date>

<util:Date>
    <ApplicationScoped/>
    <myapp:SystemStart/>
    <Named
>systemStartTime</Named>
</util:Date
>

Donde @Login y @SystemStart son tipos de anotaciones de enlace.

@Current Date currentTime;

@Login Date loginTime;
@SystemStart Date systemStartTime;

Como es usual, un Web Bean puede soportar múltiples tipos de enlace:


<myapp:AsynchronousChequePaymentProcessor>
    <myapp:PayByCheque/>
    <myapp:Asynchronous/>
</myapp:AsynchronousChequePaymentProcessor
>

Los interceptores y decoradores son sólo Web Beans sencillos, por consiguiente, pueden ser declarados como cualquier otro Web Bean sencillo:


<myfwk:TransactionInterceptor>
    <Interceptor/>
    <myfwk:Transactional/>
</myfwk:TransactionInterceptor
>

¡TODO!

Web Beans nos permite definir un Web Bean en el punto de inyección. Por ejemplo:


<myapp:System>
    <ApplicationScoped/>
    <myapp:admin>
        <myapp:Name>
            <myapp:firstname
>Gavin</myapp:firstname>
            <myapp:lastname
>King</myapp:lastname>
            <myapp:email
>gavin@hibernate.org</myapp:email>
        </myapp:Name>
    </myapp:admin>
</myapp:System
>

El elemento <Name> declara un Web Bean sencillo de ámbito @Dependent y clase Name, con una serie de valores de campo iniciales. Este Web Bean tiene un enlace de contenedor-generado y es, por lo tanto, inyectable únicamente en el punto de inyección en el cual es declarado.

Esta función simple pero poderosa permite que el formato XML de Web Beans pueda utilizarse para especificar gráficos completos de objetos Java. No es del todo una solución para enlazar datos, pero ¡está cerca!

Si deseamos que nuestro formato de documento XML sea creado por personas que no son desarrolladores de Java, o que no tienen acceso a nuestro código, necesitamos proporcionar un esquema. No hay nada específico de Web Beans sobre escribir o utilizar el esquema.


<WebBeans xmlns="urn:java:javax.webbeans"
          xmlns:myapp="urn:java:com.mydomain.myapp"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:java:javax.webbeans http://java.sun.com/jee/web-beans-1.0.xsd
                              urn:java:com.mydomain.myapp http://mydomain.com/xsd/myapp-1.2.xsd">

    <myapp:System>
        ...
    </myapp:System>

</WebBeans
>

La escritura de un esquema XML es bastante tediosa. Por lo tanto, el proyecto de la IR de Web Beans proporcionará una herramienta que genere automáticamente el esquema de XML desde el código de Java compilado.