SeamFramework.orgCommunity Documentation
Currently the Web Beans RI only runs in JBoss AS 5; integrating the RI into other EE environments (for example another application server like Glassfish), into a servlet container (like Tomcat), or with an Embedded EJB3.1 implementation is fairly easy. In this Appendix we will briefly discuss the steps needed.
It should be possible to run Web Beans in an SE environment, but you'll to do more work, adding your own contexts and lifecycle. The Web Beans RI currently doesn't expose lifecycle extension points, so you would have to code directly against Web Beans RI classes.
The Web Beans SPI is located in webbeans-ri-spi
module, and packaged as webbeans-ri-spi.jar
.
Currently, the only SPI to implement is the bootstrap spi:
public interface WebBeanDiscovery {
/**
* Gets list of all classes in classpath archives with web-beans.xml files
*
* @return An iterable over the classes
*/
public Iterable<Class<?>> discoverWebBeanClasses();
/**
* Gets a list of all web-beans.xml files in the app classpath
*
* @return An iterable over the web-beans.xml files
*/
public Iterable<URL> discoverWebBeansXml();
/**
* Gets a descriptor for each EJB in the application
*
* @return The bean class to descriptor map
*/
public Iterable<EjbDescriptor<?>> discoverEjbs();
}
The discovery of Web Bean classes and web-bean.xml
files is self-explanatory (the algorithm is described in Section 11.1
of the JSR-299 specification, and isn't repeated here).
The Web Beans RI also delegates EJB3 bean discovery to the container
so that it doesn't have to scan for EJB3 annotations or parse
ejb-jar.xml
. For each EJB in the application an
EJBDescriptor should be discovered:
public interface EjbDescriptor<T> {
/**
* Gets the EJB type
*
* @return The EJB Bean class
*/
public Class<T> getType();
/**
* Gets the local business interfaces of the EJB
*
* @return An iterator over the local business interfaces
*/
public Iterable<BusinessInterfaceDescriptor<?>> getLocalBusinessInterfaces();
/**
* Gets the remote business interfaces of the EJB
*
* @return An iterator over the remote business interfaces
*/
public Iterable<BusinessInterfaceDescriptor<?>> getRemoteBusinessInterfaces();
/**
* Get the remove methods of the EJB
*
* @return An iterator over the remove methods
*/
public Iterable<MethodDescriptor> getRemoveMethods();
/**
* Indicates if the bean is stateless
*
* @return True if stateless, false otherwise
*/
public boolean isStateless();
/**
* Indicates if the bean is a EJB 3.1 Singleton
*
* @return True if the bean is a singleton, false otherwise
*/
public boolean isSingleton();
/**
* Indicates if the EJB is stateful
*
* @return True if the bean is stateful, false otherwise
*/
public boolean isStateful();
/**
* Indicates if the EJB is and MDB
*
* @return True if the bean is an MDB, false otherwise
*/
public boolean isMessageDriven();
/**
* Gets the EJB name
*
* @return The name
*/
public String getEjbName();
/**
* @return The JNDI string which can be used to lookup a proxy which
* implements all local business interfaces
*
*/
public String getLocalJndiName();
}
The contract described the JavaDoc is enough to implement
an EJBDescriptor. In addition to these two interfaces, there is
BusinessInterfaceDescriptor
which represents a local
business interface (encapsulating the interface class and jndi name), and
MethodDescriptor
which encapsulates the method name
and parameter types (allowing it to be invoked on any instance of the
EJB, proxy or otherwise).
The Web Beans RI can be told to load your implementation of
WebBeanDiscovery
using the property
org.jboss.webbeans.bootstrap.webBeanDiscovery
with the
fully qualified class name as the value. For example:
org.jboss.webbeans.bootstrap.webBeanDiscovery=org.jboss.webbeans.integration.jbossas.WebBeanDiscoveryImpl
The property can either be specified as a system property, or in a
properties file META-INF/web-beans-ri.properties
.
There are a number of requirements that the Web Beans RI places on the container for correct functioning that fall outside implementation of APIs
If you are integrating the Web Beans into an environment that supports deployment of applications, you must enable, automatically, or through user configuation, classloader isolation for each Web Beans application
webbeans-ri.jar
If you are integrating the Web Beans into an environment that
supports deployment of applications, you must insert the
webbeans-ri.jar
into the applications
isolated classloader. It cannot be loaded from a shared
classloader.