vaadin_Vaadin应用程序中的EJB查找

vaadin

自从我实现上一个服务定位器以来已经有很长时间了。 考虑到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

vaadin

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

host碰撞漏洞

一、host碰撞原理环境搭建 在虚拟机下搭建Nginx环境配置&#xff08;192.168.202.128&#xff09; 1. 设置一个server为ip访问时返回400 2. 设置一个sever为访问某个域名时

servlet中访问mysql无法包含中文的解决

最近写servlet应用发现&#xff0c;如果我的sql语句中包含英文&#xff0c;访问数据库就失败&#xff0c;而我数据库的编码是utf8 -- UTF-8 Unicode&#xff0c;而我servlet的字符也已经转为UTF-8 &#xff0c;还是不行。 后来多方打听&#xff0c;终于解决了这个问题&#xff…

uniapp框架之如何修改接口传参的参数

大家好&#xff0c;我是孙叫兽&#xff0c;uniapp技术交流群&#xff1a;1149933135 项目采用uniappuView开发&#xff1b; uiapp官方文档&#xff1a;https://uniapp.dcloud.io/ uview官方文档&#xff1a;http://uviewui.com/components/intro.html 谷歌浏览器扩展插件Header…

在Java 8中进行投射(还有其他功能?)

将实例转换为设计不良的类型。 尽管如此&#xff0c;在某些情况下没有其他选择。 从第一天开始&#xff0c;这种能力就已经成为Java的一部分。 我认为Java 8提出了对这种古老技术稍加改进的需求。 静态铸造 用Java进行转换的最常见方法如下&#xff1a; 静态铸造 Object ob…

windows查看文件的md5值

1、winr 输入cmd进入控制界面 2、certutil -hashfile XXXX md5(XXXX为绝对路径) Linux下查看文件md5值&#xff1a; 进入文件目录&#xff0c;使用md5sum加文件名&#xff0c;例如md5sum test.txt

mysql字符串分割函数(行转列)

由于工作需要需要处理一些以逗号分隔的字符串&#xff0c;每次都要现做很是麻烦&#xff0c;网上找了很多都没有现成的&#xff0c;好吧&#xff0c;自己动手写一个好了 1 CREATE DEFINER harri% FUNCTION str_for_substr(num int, str varchar(5000))2 RETURNS varchar(100)…

如何使用window.btoa base64对接口数组进行加密处理

大家好&#xff0c;我是孙叫兽&#xff0c;前端全栈工程师&#xff0c;uniapp技术交流群&#xff1a;1149933135 项目采用uniappuView开发&#xff1b; uiapp官方文档&#xff1a;https://uniapp.dcloud.io/ uview官方文档&#xff1a;http://uviewui.com/components/intro.htm…

值得收藏的40个黑客常用入侵端口总结

值得收藏的40个黑客常用入侵端口总结-安全-PHP中文网 常用端口&#xff1a; 21端口渗透剖析 FTP通常用作对远程服务器进行管理&#xff0c;典型应用就是对web系统进行管理。一旦FTP密码泄露就直接威胁web系统安全&#xff0c;甚至黑客通过提权可以直接控制服务器。这里剖析渗透…

csdn个人主页下如何添加微信公众号及超链接

本文以CSDN孙叫兽的博客为例。打开CSDN孙叫兽的博客主页。谷歌浏览器下找到这个页面的源代码&#xff0c;鼠标右键-检查&#xff0c;或者F12打开调试页面。第一步找选中图标&#xff0c;第二步选中目标区域&#xff0c;第三步找到对应的前端代码复制到本地文件&#xff08;选中…

2015-10-15 css3

图片模糊效果 <img id "img1" src"image/免费学PS.jpg" style"-webkit-filter: blur(5px)"> //webkit解决兼容问题一&#xff1a;特殊选择器 1. *可以匹配任何标记 2. >表示后面是前面的子元素 #d1 span //表示id为d1的div下面的…

proxy aspectj_使用AspectJ,Javassist和Java Proxy进行代码注入的实用介绍

proxy aspectj静态地或在运行时将代码片段注入已编译的类和方法中的功能可能会很有帮助。 这尤其适用于在没有源代码的第三方库中或在无法使用调试器或探查器的环境中对问题进行故障排除。 代码注入对于处理涉及整个应用程序的问题&#xff08;例如性能监视&#xff09;也很有用…

gshark(github敏感信息搜集工具)

gshark 介绍&#xff1a;这是个可视化的监测工具&#xff0c;它不仅可以监控github&#xff0c;还可以监控gitlab‍ 所需环境&#xff1a; go64位gccLinux 一个github账号token&#xff0c;获取地址&#xff1a;https://github.com/settings/tokens 不建议使用window部署&a…

CSDN个人主页下如何添加微信公众号?

本人孙叫兽,前端全站程序员。微信公众号:电商程序员。 本文以CSDN孙叫兽的博客为例。 打开CSDN孙叫兽的博客主页。 谷歌浏览器下找到这个页面的源代码,鼠标右键-检查,或者F12打开调试页面。第一步找选中图标,第二步选中目标区域,第三步找到对应的前端代码复制到…

DotNetOpenAuth实践之搭建验证服务器

系列目录&#xff1a; DotNetOpenAuth实践系列&#xff08;源码在这里&#xff09; DotNetOpenAuth是OAuth2的.net版本&#xff0c;利用DotNetOpenAuth我们可以轻松的搭建OAuth2验证服务器&#xff0c;不废话&#xff0c;下面我们来一步步搭建验证服务器 本次搭建环境&#xff…

使用可选是可选的

在上周的“收藏中的可选内容”一文发表之后&#xff0c;我不禁要多讲一些关于同一只野兽的事情。 更多细节。 最初由Google Guava引入并后来包含在Java 8软件包中的Optionial类只是包装可选对象的包装器。 从包装对象存在或包装中没有对象的意义上讲&#xff0c;包装对象是可选…

kali 清理系统垃圾文件

网上常用的shell命令 #!/bin/bash echo "clear temp file..." sudo apt-get autoclean # 清理旧版本的软件缓存 sudo apt-get clean # 清理所有软件缓存 sudo apt-get autoremove # 删除系统不再使用的孤立软件 echo "clear disk temp..." sync  #…

PDF如何XSS

简介 在上传点时&#xff0c;如果上传不了图片格式的文件&#xff0c;可以尝试上传html或者pdf文件来达到xss的效果。上传html就不多说了&#xff0c;下面来说说怎么让pdf弹窗。 操作步骤&#xff1a; 环境准备&#xff1a;python3 需要准备poc.py和poc.js poc.py内容 # FRO…

NOI 练手题 图像旋转翻转变换

题目&#xff1a;来源http://noi.openjudge.cn/ch0112/09/ 总时间限制: 1000ms内存限制: 65536kB描述给定m行n列的图像各像素点灰度值&#xff0c;对其依次进行一系列操作后&#xff0c;求最终图像。 其中&#xff0c;可能的操作及对应字符有如下四种&#xff1a; A&#xff1a…

CSDN Chrome插件来啦,听说可以提升开发者效率,我们先来研究一波

孙叫兽,安徽宿州人,北漂前端全栈程序员(朝着这个目标努力),如果你觉得这篇文章帮助了你,记得三连👉(转发+点赞+评论),技术交流请联系个人主页左侧导航栏。 这个插件的定位是提升程序员的开发效率的,至于哪方面?自己慢慢体会,我大致的感觉就是搜索引擎的导航网站的…

C盘全面清理教程!彻底清理所有垃圾!

预计阅读时间 10分钟 资源在文末获取哦 老懒粉应该知道&#xff0c;我们写过“宇宙最细”的系统安装/重装教程 但我们除了新机&#xff0c;通常情况下重装系统的目的是什么&#xff1f; 虽然不管电脑出现了什么样的软件方面问题&#xff0c;我们都可以通过重装系统来一劳永…