vaadin_Vaadin应用程序中的EJB查找
vaadin
自從我實(shí)現(xiàn)上一個(gè)服務(wù)定位器以來(lái)已經(jīng)有很長(zhǎng)時(shí)間了。 考慮到Java EE CDI (上下文和依賴(lài)注入)的成熟度,我認(rèn)為不再需要。 我的第一個(gè)實(shí)現(xiàn)是在基于Struts的Web應(yīng)用程序中使用EJB。之后,我開(kāi)始使用JSF,它只需要帶有@EJB或@Resource的帶注釋的屬性即可與業(yè)務(wù)層進(jìn)行通信。 到目前為止,這一直是一個(gè)很棒的經(jīng)驗(yàn),直到他們讓我評(píng)估Vaadin作為業(yè)務(wù)應(yīng)用程序的前端技術(shù)為止。
在深入探討之前,我已經(jīng)閱讀了Vaadin Wiki上發(fā)表的文章“ Adding JPA to the Address Book Demo ”,其中介紹了如何從Vaadin的類(lèi)中調(diào)用EJB,以檢索和持久化業(yè)務(wù)層的數(shù)據(jù)。 EJB使用JPA來(lái)獲取數(shù)據(jù)并將其放入數(shù)據(jù)庫(kù)中。 他們建議從自定義servlet調(diào)用EJB,根據(jù)Java EE規(guī)范,該自定義servlet具有使用CDI進(jìn)行EJB調(diào)用的能力。
如果我們要調(diào)用1或3個(gè)EJB,這似乎是一個(gè)合適的解決方案,但是當(dāng)我們要處理大約40個(gè)EJB時(shí),在Servlet中該怎么辦? 如何將所有這些引用傳遞給Vaadin的應(yīng)用程序類(lèi)? 該類(lèi)的接口可以瘋了! 這就是為什么我認(rèn)為使用JNDI進(jìn)行查找是可取的。
以下代碼是我在概念證明(PoC)中使用的服務(wù)定位器。
import java.util.Collections; import java.util.HashMap; import java.util.Map; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException;public class MyServiceLocator {private Context initialContext;private Map cache;private static ClientServiceLocator ourInstance = new ClientServiceLocator();public static ClientServiceLocator getInstance() {return ourInstance;}private ClientServiceLocator() {try {this.initialContext = new InitialContext();this.cache = Collections.synchronizedMap(new HashMap());}catch(NamingException ne) { System.err.printf("Error in CTX looking up %s because of %s while %s",ne.getRemainingName(),ne.getCause(),ne.getExplanation());}}public Object lookupEjb(String ejbName) {if(this.cache.containsKey(ejbName)) {return this.cache.get(ejbName);}else {try {Object ejbRef = initialContext.lookup("java:comp/env/"+ ejbName);this.cache.put(ejbName, ejbRef);return ejbRef;} catch (NamingException ne) {throw new RuntimeException(ne);} catch (Exception e) {throw new RuntimeException(e);}}} }MyServiceLocator類(lèi)遵循Singleton設(shè)計(jì)模式,請(qǐng)確保只有一個(gè)對(duì)象實(shí)例可以滿(mǎn)足來(lái)自Web應(yīng)用程序的所有請(qǐng)求。 唯一實(shí)例是在類(lèi)的初始化過(guò)程中創(chuàng)建的,并且由于構(gòu)造函數(shù)是私有的,因此該類(lèi)不能被另一個(gè)類(lèi)實(shí)例化,只能通過(guò)方法getInstance ()獲得。 構(gòu)造函數(shù)初始化上下文,并創(chuàng)建一個(gè)同步映射,其中存儲(chǔ)了所有已創(chuàng)建的引用。 方法lookupEjb ( 字符串ejbName )查找名稱(chēng)在本地JNDI上下文中可用的EJB。 該方法僅適用于在web.xml文件中聲明了其引用的EJB,如下所示。
<web-app version="2.5"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><display-name>Information Systems</display-name>...<ejb-local-ref><ejb-ref-name>InformationSystemBean</ejb-ref-name><ejb-ref-type>Session</ejb-ref-type><local>example.business.InformationSystemBeanLocal</local><ejb-link>eac-architecture-ejb.jar#InformationSystemBean</ejb-link></ejb-local-ref> </web-app>標(biāo)記<ejb-local-ref>用于聲明對(duì)本地EJB的引用。 上面的示例僅映射一個(gè)EJB。 因此,您必須對(duì)要映射的每個(gè)EJB重復(fù)此操作。 有關(guān)此標(biāo)簽的詳細(xì)信息,請(qǐng)參見(jiàn)此處 。 聲明后,我們可以使用以下代碼在應(yīng)用程序的任何部分中獲取EJB的實(shí)例:
private InformationSystemLocal informationSystemBsn = (InformationSystemLocal)MyServiceLocator.getInstance().lookupEjb("InformationSystemBean");變量是使用EJB本地接口(即InformationSystemLocal )鍵入的。 服務(wù)定位器返回名為InformationSystemBean的EJB實(shí)例,默認(rèn)情況下是EJB的實(shí)現(xiàn)類(lèi)。 請(qǐng)注意,當(dāng)我們使用CDI時(shí),上面的代碼都不是必需的。 AjudaBsn的調(diào)用就像這樣:
@EJB private InformationSystemLocal informationSystemBsn;CDI很好且優(yōu)雅,但不能廣泛應(yīng)用。 今天實(shí)現(xiàn)它的方式是Java EE規(guī)范的主要弱點(diǎn)。 也許有很強(qiáng)的理由為什么EJB的注釋不能在每個(gè)Java類(lèi)中都起作用。 我根本看不到這個(gè)錯(cuò)誤的原因,因?yàn)镾pring自從很久以前就已經(jīng)使用方面取向解決了這個(gè)問(wèn)題。
參考: Hildeberto博客上的 JCG合作伙伴 Hildeberto Mendonca提供的Vaadin應(yīng)用程序中的EJB查找
相關(guān)文章 :
- JBoss AS 7 EJB3池配置
- Java EE6 CDI,命名組件和限定符
- EJB程序化查找
- EJB 3.0注入和查找簡(jiǎn)介
- 什么是CDI,它與@EJB和Spring有什么關(guān)系?
翻譯自: https://www.javacodegeeks.com/2012/01/ejb-lookup-in-vaadin-application.html
vaadin
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的vaadin_Vaadin应用程序中的EJB查找的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。