SeamFramework.orgCommunity Documentation

Kapitel 13. Java EE Integration

13.1. Einspeisung von Java EE Ressourcen in ein Web Bean
13.2. Aufruf eines Web Bean von einem Servlet
13.3. Aufruf eines Web Beans von einem Message-Driven Bean
13.4. JMS Endpunkte
13.5. Packen und Deployment

Web Beans sind voll in die Java EE Umgebung integriert. Web Beans besitzen Zugriff auf Java EE Resourcen und JPA Persistenzkontexte. Sie können in Unified EL Ausdrücken in JSF- und JSP-Seiten verwendet werden. Sie können sogar in einige Objekte eingespeist werden, etwa Servlets and Message-Driven Beans, die keine Web Beans sind.

Alle einfachen wie auch Enterprise Web Beans können die Java EE "Dependency"-Einspeisung mittels @Resource, @EJB und @PersistenceContext verwenden. Wir haben bereits einige Beispiele hierfür gesehen, obwohl wir diesen zum damaligen Zeitpunkt nicht viel Beachtung geschenkt haben:

@Transactional @Interceptor

public class TransactionInterceptor {
    @Resource Transaction transaction;
    @AroundInvoke public Object manageTransaction(InvocationContext ctx) { ... }
    
}
@SessionScoped

public class Login {
    @Current Credentials credentials;
    @PersistenceContext EntityManager userDatabase;
    
    ...
}

Die Java EE @PostConstruct und @PreDestroy Callbacks werden ebenfalls für alle einfachen wie auch Enterprise Web Beans unterstützt. Die @PostConstruct-Methode wird nach Durchführung aller Einspeisungen aufgerufen.

Es gilt eine Einschränkung hier: @PersistenceContext(type=EXTENDED) wird nicht für einfache Web Beans unterstützt.

In Java EE 6 ist die Verwendung eines Web Beans von einem Servlet ganz einfach. Speisen Sie einfach das Web Bean mittels Web Beans Field oder Initialisierungsmethodeneinspeisung (sog. "Initializer Method Injection") ein.

public class Login extends HttpServlet {


    @Current Credentials credentials;
    @Current Login login;
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        credentials.setUsername( request.getAttribute("username") ):
        credentials.setPassword( request.getAttribute("password") ):
        login.login();
        if ( login.isLoggedIn() ) {
            response.sendRedirect("/home.jsp");
        }
        else {
            response.sendRedirect("/loginError.jsp");
        }
    }
            
}

Der Web Beans Client Proxy kümmert sich um Aufrufe der Routing-Methode vom Servlet, um die Instanzen von Credentials und Login für die aktuelle Anfrage und HTTP-Session zu korrigieren.

Einspeisung von Web Beans gilt für alle EJBs, selbst wenn sie nicht der Steuerung des Web Bean Manager s unterliegen (wenn sie etwa durch direkten JNDI-Lookup oder Einspeisung mittels @EJB erworben wurden). Insbesondere Web Beans Einspeisung in Message-Driven Beans, die nicht als Web Beans angesehen werden, da sie nicht eingespeist werden können.

Sie können sogar Web Beans Interzeptor-Bindings für Message-Driven Beans.

@Transactional @MessageDriven

public class ProcessOrder implements MessageListener {
    @Current Inventory inventory;
    @PersistenceContext EntityManager em;
    public void onMessage(Message message) {
        ...
    }
            
}

Daher ist der Empfang von Nachrichten in einer Web Beans Umgebung sehr einfach. Seien Sie sich aber dessen bewusst, dass bei Lieferung einer Nachricht an ein Message-Driven Bean keine Session oder Konversationskontext verfügbar ist. Es sind nur @RequestScoped und @ApplicationScoped Web Beans verfügbar.

Es ist ebenfalls ganz einfach mittels Web Beans Nachrichten zu versenden.

Das Versenden von Nachrichten unter Verwendung von JMS kann aufgrund der Anzahl verschiedener Objekte mit denen Sie zu tun haben recht komplex sein. Für Warteschlangen haben wir Queue, QueueConnectionFactory, QueueConnection, QueueSession und QueueSender. Für Topics haben wir Topic, TopicConnectionFactory, TopicConnection, TopicSession und TopicPublisher. Jedes dieser Objekte besitzt einen eigenen Lebenszyklus und ein eigenes Threading-Modell, das unsere Aufmerksamkeit erfordert.

Web Beans übernehmen all das für uns. Das Einzige, was wir tun müssen ist unsere Warteschlange oder unser Topic in web-beans.xml zu deklarieren und einen assoziierten Binding-Typ und eine Connection-Factory festzulegen.


<Queue>
    <destination
>java:comp/env/jms/OrderQueue</destination>
    <connectionFactory
>java:comp/env/jms/QueueConnectionFactory</connectionFactory>
    <myapp:OrderProcessor/>    
</Queue
>

<Topic>
    <destination
>java:comp/env/jms/StockPrices</destination>
    <connectionFactory
>java:comp/env/jms/TopicConnectionFactory</connectionFactory>
    <myapp:StockPrices/>    
</Topic
>

Jetzt können wir einfach Queue, QueueConnection, QueueSession oder QueueSender für eine Warteschlange oder aber Topic, TopicConnection, TopicSession oder TopicPublisher für ein Topic einspeisen.

@OrderProcessor QueueSender orderSender;

@OrderProcessor QueueSession orderSession;
public void sendMessage() {
    MapMessage msg = orderSession.createMapMessage();
    ...
    orderSender.send(msg);
}
@StockPrices TopicPublisher pricePublisher;

@StockPrices TopicSession priceSession;
public void sendMessage(String price) {
    pricePublisher.send( priceSession.createTextMessage(price) );
}

Der Lebenszyklus der eingespeisten JMS-Objekte wird komplett durch den Web Bean Manager gesteuert.

Web Beans definiert kein spezielles Deployment-Archiv. Sie können Web Beans in JARs, EJB-JARs oder WARs — verpacken, jedem Deployment Speicherort im Klassenpfad der Anwendung. Allerdings muss jedes Web Beans enthaltene Archiv eine Datei namens web-beans.xml im META-INF oder WEB-INF-Verzeichnis enthalten. Die Datei kann leer sein. Web Beans die in Archiven deployt werden, die keine web-beans.xml-Datei enthalten, sind nicht für die Verwendung in der Anwendung verfügbar.

Für die Java SE Ausführung können Web Beans an einem beliebigen Speicherort deployt werden, in welchem EJBs zur Ausführung durch den einbettbaren EJB Lite Container deployt werden können. Auch hier muss jeder Speicherort eine web-beans.xml-Datei enthalten.