Vaadin應用程序中的EJB查找

自從我實現上一個服務定位器以來已經有很長時間了。 我認為不再需要考慮Java EE CDI (上下文和依賴注入)的成熟度。 我的第一個實現是在基于Struts的Web應用程序中使用EJB。

之后,我開始使用JSF,它只需要帶有@EJB或@Resource的帶注釋的屬性即可與業務層進行通信。 到目前為止,在他們讓我評估Vaadin作為用于商業應用程序的前端技術之前,這一直是一個很棒的經驗。

在深入探討之前,我已經閱讀了Vaadin Wiki上發布的文章“ Adding JPA to the Address Book Demo ”,其中介紹了如何從Vaadin的類中調用EJB,以檢索和持久化業務層的數據。 EJB使用JPA來獲取數據并將其放入數據庫中。 他們建議從自定義servlet調用EJB,根據Java EE規范,該自定義servlet具有使用CDI進行EJB調用的能力。

如果要調用1個或3個EJB,這似乎是一個合適的解決方案,但是當要處理大約40個EJB時,在Servlet中該怎么辦? 如何將所有這些引用傳遞給Vaadin的應用程序類? 此類的接口可能會發瘋! 這就是為什么我認為使用JNDI進行查找是可取的。

以下代碼是我在概念證明(PoC)中使用的服務定位器。

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類遵循Singleton設計模式,請確保只有一個對象實例可以滿足來自Web應用程序的所有請求。 唯一實例是在類的初始化過程中創建的,并且由于構造函數是私有的,因此該類不能被另一個類實例化,只能通過方法getInstance ()獲得。 構造函數初始化上下文,并創建一個同步映射,其中存儲了所有已創建的引用。 方法lookupEjb字符串ejbName )查找名稱在本地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>

標記<ejb-local-ref>用于聲明對本地EJB的引用。 上面的示例僅映射一個EJB。 因此,您必須對要映射的每個EJB重復此操作。 有關此標簽的詳細信息,請參見此處 。 聲明之后,我們可以使用以下代碼在應用程序的任何部分中獲取EJB的實例:

private InformationSystemLocal informationSystemBsn = (InformationSystemLocal)MyServiceLocator.getInstance().lookupEjb("InformationSystemBean");

變量是使用EJB本地接口(即InformationSystemLocal )鍵入的。 服務定位器返回名為InformationSystemBean的EJB實例,默認情況下是EJB的實現類。 請注意,當我們使用CDI時,上面的代碼都不是必需的。 AjudaBsn的調用就像這樣:

@EJB
private InformationSystemLocal informationSystemBsn;

CDI很好且優雅,但不能廣泛應用。 今天實現它的方式是Java EE規范的主要弱點。 也許有很強的理由為什么EJB的注釋不能在每個Java類中都起作用。 我根本看不到這個錯誤的原因,因為Spring自從很久以前就已經使用方面取向解決了這個問題。

參考: Hildeberto博客上的 JCG合作伙伴 Hildeberto Mendonca提供的Vaadin應用程序中的EJB查找

相關文章 :

  • JBoss AS 7 EJB3池配置
  • Java EE6 CDI,命名組件和限定符
  • EJB程序化查找
  • EJB 3.0注入和查找簡介
  • 什么是CDI,它與@EJB和Spring有什么關系?

翻譯自: https://www.javacodegeeks.com/2012/01/ejb-lookup-in-vaadin-application.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374483.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374483.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374483.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基線檢查工具_最新版CAD燕秀工具箱2.87(支持20042021)

好課推薦&#xff1a;零基礎CAD&#xff1a;點我CAD家裝&#xff1a;點我 周站長CAD&#xff1a;點我CAD機械&#xff1a;點我revit教程&#xff1a;點我CAD建筑&#xff1a;點我CAD三維&#xff1a;點我全屋定制&#xff1a;點我 ps教程&#xff1a;點我蘋果版CAD:點我 3dmax教…

團隊項目記錄2

遇到的問題&#xff1a;在對Trigger機關進行測試時發現&#xff0c;畫出的軌道也會將機關觸發。 問題描述&#xff1a;Trigger機關的作用是在發生碰撞時運行腳本中指定的特定物體的特定函數&#xff0c;在這個例子當中特定的物體是一塊地板&#xff0c;特定的函數的功能是刪除這…

關于java.lang.ArithmeticException

java.lang.ArithmeticException “數學運算異常”&#xff0c;可能是自己的數學運算公式出現了錯誤、違反了數學運算規則。錯誤記錄&#xff1a; 出錯原因&#xff1a; a % b 中b不能為0

1103. Integer Factorization (30)

題目如下&#xff1a; The K-P factorization of a positive integer N is to write N as the sum of the P-th power of K positive integers. You are supposed to write a program to find the K-P factorization of N for any positive integers N, K and P. Input Specifi…

Java EE 6與Spring Framework:技術決策過程

在過去的幾個月中&#xff0c;我們經歷了這個決策過程&#xff1a;為Java平臺上的企業開發選擇哪種技術堆棧&#xff1f; 有多種選擇。 但是&#xff0c;我們深入討論的是&#xff1a;純Java EE 6堆棧與帶有Java EE的Spring。 以下博客文章總結了當您考慮這些技術堆棧選項之一時…

DOM 基礎 HTML標簽 元素 屬性

什么是HTML標簽 HTML標簽標記了HTML文檔和HTML元素 HTML標簽由開始標簽和結束標簽組成.開始標簽為尖括號包圍的元素名,結束標簽為尖括號包圍的斜杠和元素名 例如:<h2> My First Heading</h2> HTML基本標簽 標題(Heading)是通過h1 - h6等標簽進行定義的.段落 是通過…

允許服務與桌面交互_vivo 正式推出 Origin OS,融合自然設計與全新交互

點擊右上角關注我們&#xff0c;每天給您帶來最新最潮的科技資訊&#xff0c;讓您足不出戶也知道科技圈大事&#xff01;今天下午&#xff0c;vivo 推出了全新 Origin OS 手機系統。它采用了源于自然界的設計理念&#xff0c;同時加入了全新并且允許用戶進行深度自定義的交互方…

Error - Found cycle in the ListNode

Error - Found cycle in the ListNode 刷力扣時遇到這個錯誤&#xff0c;節點成環 自己摸索了一下發現確實形成循環&#xff0c;原題是206反轉鏈表&#xff0c;我用的是棧&#xff0c;先將鏈表節點依次進棧&#xff0c;然后依次出棧鏈接&#xff0c;構成反轉。但是我忽略了第一…

JUnit 4.9(測試版3)中的規則

不久前&#xff0c; David Saff宣布了JUnit 4.9的beta版 。 因此&#xff0c;我認為現在是研究該版本中的新增功能的好時機。 JUnit領域中最有用的創新之一是Rule。 我在這里寫了有關規則的文章 。 我在這里寫了有關JUnit規則的用例 。 規則很棒。 借助JUnit 4.9&#xff0c;它…

計算機網絡-終端

我們常用的電腦來說&#xff0c;外圍設備就是終端。 外圍設備包括顯示器、鼠標、鍵盤等等。 負責向主機輸入數據的就叫輸入終端&#xff0c;比如鼠標、鍵盤、麥克風、攝像頭&#xff1b; 負責接收主機輸出數據的設備就被稱作輸出終端&#xff0c;比如顯示器、耳機。 注意一點…

為什么我喜歡Java的細節

他們說&#xff0c;Java太冗長了。 您可以找到Hello World程序的比較結果&#xff0c;這些程序在ruby中使用2行&#xff0c;在Java中使用10行&#xff0c;要讀取文件&#xff0c;您需要使用Java 20行和php中1行。 盡管示例經常被夸大&#xff08;例如&#xff0c;計算導入次數&…

dll 源碼_【技術分享】 | 一個JAVA內存馬的源碼分析

前言偶然接觸到了這樣一個JAVA內存馬&#xff0c;其作者也是冰蝎的作者&#xff0c;項目地址&#xff1a;https://github.com/rebeyond/memShell正好最近在接觸JAVA&#xff0c;借此機會學習下大佬的代碼&#xff0c;對自己的編程思路也有了一定的提升。當然筆者只是一個腳本小…

ThunderSearch(閃電搜索器)_網絡空間搜索引擎工具_信息收集

文章目錄 ThunderSearch簡介1 項目地址2 使用方式2.1 配置文件config.json說明2.2 構建和運行 3 使用式例 ThunderSearch簡介 ThunderSearch&#xff08;閃電搜索器&#xff09;是一款使用多個(【支持Fofa、Shodan、Hunter、Zoomeye、360Quake網絡空間搜索引擎】網絡空間搜索引…

字符串匹配方法

介紹兩種字符串匹配方法1.暴力匹配母串用s表示&#xff0c;長度為m子串用p表示&#xff0c;長度為n時間復雜度為:(m-n1)n算法&#xff1a;從s串的第一個字符開始匹配&#xff0c;若匹配&#xff0c;繼續根據p向后匹配&#xff0c;若后續的不匹配&#xff0c;s右移重新匹配p 2.K…

區分幾進制的標志

自己總是記不住進制的開頭標記&#xff0c;就寫下來忘了就看看 1.二進制&#xff1a;Binary&#xff0c;數字以0b 、0B開頭 2.八進制&#xff1a;octal number system&#xff0c;數字自然以0打頭 3.十六進制&#xff1a;hexadecimal&#xff0c;以0x、0X開頭

每個人都知道MVC…

從一個最近的博客中&#xff0c;您可能已經了解到我最近一直在進行一些采訪&#xff0c;因為他們是針對Web應用程序開發人員的&#xff0c;所以我問的一個問題是“您能解釋一下MVC模式是什么嗎&#xff1f;”&#xff0c;值得稱贊的是&#xff0c;每個候選人知道答案。 對于不認…

php無限分類

無限循環 1.需要套2個foreach 2.2個foreach結構一樣 純代碼獲取數據 public function CycleData($parent_id0){$where[parent_id] $parent_id;$res $this->m->where($where)->field(id,name)->select();foreach($res as $k>$v){$result[$v[id]][id] $v[id];$r…

動態網頁數據的采集方案

我在上一篇文章中介紹了使用ScrapySharp快速從網頁中采集數據&#xff0c;這種方式是通過直接發送的Http請求來獲取的原始頁面信息&#xff0c;對于靜態網頁非常有效&#xff0c;但還有許多網站中的頁面內容并非全部存放在原始的頁面中&#xff0c;很多內容是通過javascript來動…

r語言ggplot2 多線圖繪制圖例_plotnine: Python版的ggplot2作圖庫

騰訊課堂 | Python網絡爬蟲與文本數據分析同樣的基本作圖任務&#xff0c;plotnine比matplotlib和seaborn代碼量少&#xff0c;更美觀。所以我又重新發一遍&#xff0c;大家可以先收藏起來&#xff0c;后面總有用到的時候~R語言的ggplot2繪圖能力超強&#xff0c;python雖有mat…

單元和集成測試的代碼覆蓋率

我最近在一個寵物項目中著手構建自動化的UI&#xff08;集成&#xff09;測試以及普通的單元測試。 我想將所有這些集成到我的Maven構建中&#xff0c;并提供代碼覆蓋率報告&#xff0c;以便我可以了解測試覆蓋率不足的區域。 我不僅發布了項目的源代碼&#xff0c;還整理了一個…