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.mzph.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;还整理了一个…