mongodb+java_Java EE + MongoDb与Apache TomEE和Jongo Starter项目

mongodb+java

知道MongoDBJava EE ,但是您不确切地知道如何将它们集成在一起? 您是否阅读了很多有关该主题的内容,但没有找到适合该目的的解决方案? 这个入门项目适合您:

您将学习如何以一种时尚的方式使用MongoDBJava EE ,而不必依赖Spring Data MongoDB框架,但具有“相似”的基本功能。

比Maven原型更好的唯一事情是可以使用已设置的所有内容进行存储的存储库。 跳过文档,而仅进行分叉编码。 该入门项目包含:

  • Jongo如MongoDB的映射( www.jongo.org )。
  • Apache TomEE作为应用程序服务和集成。 ( tomee.apache.org )
  • 测试的Arquillian 。 ( www.arquillian.org )

该示例非常简单,我们希望将颜色存储在MongoDB集合中。

我们的POJO就像:

public class Color {@ObjectIdprivate String _id;private String name;private int r;private int g;private int b;public Color() {super();}public Color(String name, int r, int g, int b) {super();this.name = name;this.r = r;this.g = g;this.b = b;}// getters and setters
}

请注意,我们正在使用Jongo提供的@ObjectId批注将此字段设置为MongoDB id。 此外,由于它称为_id,因此将自动设置id。

然后是服务层:

@Singleton
@Lock(LockType.READ)
public abstract class ColorService implements InvocationHandler {@JongoCollection("color")@InjectMongoCollection colorMongoCollection;@Insertpublic abstract Color createColor(Color c);@Removepublic abstract int removeAllColors();@FindByIdpublic abstract Color findColorById(String id);@FindOne("{name:#}")public abstract Color findColorByColorName(String colorName);@Find("{r:#}")public abstract Iterable<Color> findColorByRed(int r);public long countColors() {return colorMongoCollection.count();}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {return PersistenceHandler.invoke(colorMongoCollection, method, args);}}

请注意,没有很多代码,但是有些要点确实很有趣。 让我们对其进行分析。

@Singleton用于将EJB定义为单例,它也与@Stateless一起使用,对于Java EE用户而言,这里没有消息。

该类是抽象的。 为什么? 因为它允许我们不实现所有方法而是定义它们。

还实现java.lang.reflect.InvocationHandler 。 这是因为我们要使用一个非常有趣的功能,该功能允许我们创建一个称为invoke的后备方法。 对于已定义但尚未实现的任何方法,都会调用此方法。

我们有一个MongoCollection类(来自Jongo项目)被注入。 MongoCollection代表MongoDB中的集合。 因为我们需要设置要使用的集合,所以将创建一个名为@JongoCollection的注释,以便您可以传递后端集合的名称。 请注意, MongoCollectionCDI容器使用我们的自定义生成器生成。 对于CDI用户,这里再无消息。

@ApplicationScoped
public class MongoCollectionProducer {@InjectDB mongoDb;Jongo jongo;@PostConstructpublic void initialize() throws UnknownHostException {jongo = new Jongo(mongoDb);}@Produces@JongoCollectionMongoCollection collection(InjectionPoint injectionPoint) {JongoCollection jongoCollectionAnnotation = Reflection.annotation(injectionPoint.getQualifiers(), JongoCollection.class);if(jongoCollectionAnnotation != null) {String collectionName = jongoCollectionAnnotation.value();return jongo.getCollection(collectionName);}throw new IllegalArgumentException();}}

然后有很多方法代表CRUD操作。 请注意,他们不执行,他们只用@Insert,@find,@Remove注释,...,以设置这是我们要执行的方法的目的。 其中一些(例如查找器或删除器)可以接收要执行的类似Jongo的查询。 还有一个名为countColors的方法,您可以看到它可以作为自定义方法实现,而不必依赖于invoke方法内实现的逻辑。

最后是invoke方法。 所有抽象方法都将调用此方法,并将其发送到PersistenceHandler类,该类实际上是针对Jongo的util类,用于执行所需的操作。

就是这么简单,如果您要添加新的抽象操作,则只需在PersistenceHandler类中实现它们。

你们中的有些人可能会奇怪,为什么我使用注释而不是使用典型的Spring Data方法(该方法的名称表示操作)。 您也可以实现这种方法,这是在PersistenceHandler类中创建正则表达式的简单问题,而不是带有注释的if / else,但是我更喜欢注释方法。 执行时间更快,更干净,例如,您可以将批注名称从@Find重构为@Buscar (等效于西班牙文),而不必担心是否会破坏某些正则表达式。

最后是测试:

@RunWith(Arquillian.class)
public class ColorTest {private static final String MONGODB_RESOURCE = "<resources>\n" + "    <Resource id=\"mongoUri\" class-name=\"com.mongodb.MongoClientURI\" constructor=\"uri\">\n" + "        uri  mongodb://localhost/test\n" + "    </Resource>\n" + "</resources>";@Deploymentpublic static JavaArchive createDeployment() {JavaArchive javaArchive = ShrinkWrap.create(JavaArchive.class).addPackages(true, Color.class.getPackage()).addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml").addAsManifestResource(new StringAsset(MONGODB_RESOURCE), "resources.xml").merge(getJongoAndMongoDependecies());return javaArchive;}private static JavaArchive getJongoAndMongoDependecies() {JavaArchive[] javaArchives = Maven.configureResolver().loadPomFromFile("pom.xml").resolve("org.mongodb:mongo-java-driver", "org.jongo:jongo").withTransitivity().as(JavaArchive.class);JavaArchive mergedLibraries = ShrinkWrap.create(JavaArchive.class);for (JavaArchive javaArchive : javaArchives) {mergedLibraries.merge(javaArchive);}return mergedLibraries;}@EJBColorService colorService;@Beforepublic void cleanDatabase() {colorService.removeAllColors();}@Testpublic void should_insert_color() {Color color = colorService.createColor(new Color("red", 255, 0, 0));assertThat(color.getId(), notNullValue());assertThat(color.getName(), is("red"));assertThat(color.getR(), is(255));assertThat(color.getB(), is(0));assertThat(color.getG(), is(0));}@Testpublic void should_count_number_of_colors() {colorService.createColor(new Color("red", 255, 0, 0));colorService.createColor(new Color("blue", 0, 0, 255));assertThat(colorService.countColors(), is(2L));}@Testpublic void should_find_colors_by_id() {Color originalColor = colorService.createColor(new Color("red", 255, 0, 0));Color color = colorService.findColorById(originalColor.getId());assertThat(color.getId(), notNullValue());assertThat(color.getName(), is("red"));assertThat(color.getR(), is(255));assertThat(color.getB(), is(0));assertThat(color.getG(), is(0));}@Testpublic void should_find_colors_by_name() {colorService.createColor(new Color("red", 255, 0, 0));Color color = colorService.findColorByColorName("red");assertThat(color.getId(), notNullValue());assertThat(color.getName(), is("red"));assertThat(color.getR(), is(255));assertThat(color.getB(), is(0));assertThat(color.getG(), is(0));}@Testpublic void should_find_colors_by_red() {colorService.createColor(new Color("red", 255, 0, 0));colorService.createColor(new Color("white", 255, 255, 255));Iterable<Color> colorByRed = colorService.findColorByRed(255);assertThat(colorByRed, hasItems(new Color("red", 255, 0, 0), new Color("white", 255, 255, 255)));}}

这是一项Arquillian测试,除一行外没有其他特殊之处:

.addAsManifestResource(新的StringAsset(MONGODB_RESOURCE),“ resources.xml”)

因为我们使用的是Apache TomEE,所以我们使用它必须配置在代码中用作javax.annotation.Resource的元素的方式。

META-INF / resources.xml的内容为:

<resources> <Resource id="mongoUri" class-name="com.mongodb.MongoClientURI" constructor="uri"> uri  mongodb://localhost/test</Resource>
</resources>

然后在MongoClient生产者中使用来创建要在代码内使用的MongoClient实例。 请注意,我们将@Resource用作任何标准资源,例如DataSource ,但实际上注入了MongoClientURI

@ApplicationScoped
public class MongoDBProducer {@Resource(name = "mongoUri")private MongoClientURI mongoClientURI;private DB db;@PostConstructpublic void init() throws UnknownHostException {MongoClient mongoClient = new MongoClient(mongoClientURI);db =  mongoClient.getDB(mongoClientURI.getDatabase());}@Producespublic DB createDB() {return db;}}

因此,实际上Mongo连接是在META-INF / resources.xml文件中配置的,感谢TomEE,我们可以将其称为任何标准资源。

如果要使用其他应用程序服务器,则可以将此方法更改为它提供的方法,或者如果需要,可以使用DeltaSpike扩展或您自己的方法。 另外,由于MongoClient数据库是从带有@Produces注释的方法中获取的,因此您可以将其注入代码中的任何位置,因此,如果需要,可以跳过抽象服务层。

这种方法有什么好处?

首先,它是Java EE解决方案,您可以在不依赖Spring框架或任何其他库的情况下使用它。 您可以实现所需的内容,而不必下载大量仅用于通过某种对象映射访问MongoDB的库。

就像您可能看到的那样,代码非常简单,并且没有任何魔力,您可以毫无问题地对其进行调试,甚至可以根据需要进行改进或更改。 该代码是您的,正在等待修改。 您是否要使用本机MongoDB对象而不是Jongo ? 没问题,您可以实现它。 而且,层数不多,实际上只有一层( PersistenceHandler ),因此该解决方案的执行速度非常快。

当然,这并不意味着您不能使用Spring Data MongoDB 。 这是一个非常有趣的框架,因此,如果您已经在使用Spring ,请继续进行下去,但是如果您打算使用完整的J ava EE解决方案,请克隆此项目并开始使用MongoDB,而无需进行任何网络研究。关于如何将它们整合在一起的知识。

  • 您可以从https://github.com/lordofthejars/tomee-mongodb-starter-project克隆项目

翻译自: https://www.javacodegeeks.com/2014/09/java-ee-mongodb-with-apache-tomee-and-jongo-starter-project.html

mongodb+java

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

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

相关文章

C语言天才!想法奇异?还是逼格满满?一份国外C语言写的传奇简历

C语言天才&#xff01;想法奇异&#xff1f;还是逼格满满&#xff1f;一份国外C语言写的传奇简历作者用代码更新了自己的简历&#xff0c;是不是很接地气&#xff0c;特符合程序员的逼格。这是一份可读可执行的语言源文件&#xff0c;也是作者编码风格的体现。C语言源码&#x…

hash值 更改git_Git切换版本

Git切换版本有三种方式&#xff1a;1.基于哈希值切换》基于哈希值切换(推荐)&#xff0c;命令&#xff1a;git reset --hard 哈希值&#xff0c;哈希值从哪来&#xff0c;git reflog查看下就知道了&#xff0c;切换版本后&#xff0c;git reflog会发现有两个HEAD&#xff0c;别…

devc++ 文件未编译问题

点击 文件 然后点击关闭全部文件, 重新打开一下软件件就好了

候选JEP:记录和密封类型

马克赖因霍尔德&#xff08;Mark Reinhold &#xff09;本周在OpenJDK琥珀色开发者邮件列表上宣布了两个新的紧密相关的候选 JDK增强提案&#xff08; JEP&#xff09; &#xff0c;其帖子分别为“ 新候选JEP&#xff1a;359&#xff1a;记录&#xff08;预览&#xff09; ”和…

fedora mysql_Fedora server 安装Mysql8

导读MySQL是一种关系数据库管理系统(RDBMS)&#xff0c;作为服务器运行&#xff0c;提供对多个数据库的多用户访问。 这是指导&#xff0c;如何在Fedora 28/27/26&#xff0c;CentOS 7.5 / 6.10和Red Hat(RHEL)7.5 / 6.10上安装或升级MySQL社区服务器最新版本8.0(8.0.12)/5.7(5…

lombok 生成代码_使用Project Lombok减少Java应用程序中的样板代码

lombok 生成代码对Java编程语言最常提出的批评之一是它需要大量的样板代码 。 对于简单的类尤其如此&#xff0c;该类只需要存储一些值就可以。 您需要这些值的getter和setter方法&#xff0c;也许您还需要一个构造函数&#xff0c;覆盖equals&#xff08;&#xff09;和 hash…

让C/C++程序员告诉你什么叫浪漫,表白黑科技,炫酷多彩求爱利器

前言缘是美丽的邂逅&#xff0c;爱是心跳的感觉&#xff0c;情是心灵的交会&#xff0c;恋是甜蜜的思念&#xff0c;走在爱与被爱的边缘&#xff0c;你见或者不见&#xff0c;爱你的心始终不改变&#xff01;C语言诠释爱——为TA写下心中情&#xff0c;生成程序传给TA&#xff…

mysql 支持json_MySQL 5.7 对 JSON 的支持

最近有个业务需要能够存储Json并做一些简单的业务逻辑处理。业务找到我说json的数据分析很难用mysql 5.6,这样的纯粹行存来处理难度很大&#xff0c;问我有没啥办法。我第一想到的是mongodb&#xff0c;第二想到的就是mysql 5.7 。 然后一查&#xff0c;哎呀&#xff0c;已经GA…

Java十六进制浮点文字

我如何遇到十六进制浮点数 我正在Java :: Geci中开发一种新功能&#xff0c;以减少代码重新格式化的可能性。 如果重新格式化&#xff0c;当前版本的代码将覆盖原本相同的代码。 这很烦人&#xff0c;因为按下重新格式化键的快捷键相当容易&#xff0c;而且许多项目甚至要求开发…

mysql内部损坏_mysql表损坏故障案例

开发人员反映猎豹有个功能报500错误&#xff0c;让我查一下服务器上有没有做过什么调整&#xff0c;额&#xff0c;不会吧&#xff0c;今天元旦啊&#xff0c;谁会闲的蛋疼去调试服务器啊&#xff0c;最后他们查到了和一个表有关的sql都执行不了&#xff0c;那肯定是这个表损坏…

C语言对电脑做的事儿啊,总有那么一丝恐怖,C语言操盘电脑两例

C语言对自己电脑做的事儿啊&#xff0c;总有那么一丝恐怖&#xff0c;C语言与电脑两例开场先抱歉&#xff0c;偷懒好多天了。今天分享给大家的l两例比较短小精悍&#xff0c;都是针对于计算机屏幕处理的两例&#xff0c;有兴趣的可以放到自己电脑上运行哦。绝对无害&#xff0c…

servlets_jQuery Ajax – Servlets集成:构建完整的应用程序

servlets网上有很多教程&#xff0c;它们解释了有关使用servlet和JSP页面进行Java Web开发的一些知识&#xff0c;但是&#xff0c;我从未找到对于初学者来说足够简洁的教程。 这样的教程应该解释创建一个简单的Web应用程序的整个过程&#xff0c;包括前端&#xff0c;后端&…

mysql分库分表的缺点_MySQL分库分表会带来哪些问题?

分库分表能有效的环节单机和单库带来的性能瓶颈和压力&#xff0c;突破网络IO、硬件资源、连接数的瓶颈&#xff0c;同时也带来了一些问题。下面将描述这些技术挑战以及对应的解决思路。1、事务一致性问题分布式事务当更新内容同时分布在不同库中&#xff0c;不可避免会带来跨库…

JEP 358:有用的NullPointerExceptions

在文章“ 更好的默认NullPointerException消息是否会传入Java&#xff1f; ”&#xff0c;我总结了当时与JEP 草案有关的背景细节&#xff0c;有关使某些类型的NullPointerException &#xff08;NPE&#xff09;消息更有用。 上周很高兴看到该JEP现在是候选 JEP &#xff08; …

C语言的恶趣味,胆小者莫入,以免入门到放弃,C语言夺命题十例!

前言这些问题测试了C语言的高级知识&#xff0c;包括一些很少使用的特性。有效的C编程需要对诸如未定义的行为&#xff0c;递归和指针算术等概念有深入的理解&#xff0c;但是这些故意复杂的例子并不代表现实世界的代码&#xff0c;当然也不会为了清晰和可维护性而获得任何奖励…

java学习里程碑_记录您的里程和社区运行情况:Java EE 7真实体验

java学习里程碑miles2run.org是跟踪跑步活动并与亲朋好友共享的简便方法。 可以创建然后跟踪基于天或基于距离的目标。 它还允许创建社区运行目标&#xff0c;并使多个跑步者参与并跟踪他们朝着该目标的活动。 您还可以找出本地跑步者并与他们联系。 该项目已开始&#xff0c;…

elementui ts vant冲突_如何解决vue多个ui框架css冲突?

解决方法有很多&#xff0c;如果可以对html改动的话&#xff0c;就给你需要细化的页面元素加多一个class或者ID就行了&#xff0c;当然这种方法应该不是你想要的。那么接下来是不改变HTML的情况下&#xff0c;直接用css的方法来实现你想要的效果——方法一 细化选择符假如全局是…

在Spring中使用@ResponseStatus获取Http状态

介绍&#xff1a; 在Spring MVC中&#xff0c;我们可以通过几种方式设置HttpResponse的状态。 在本教程中&#xff0c;我们将使用ResponseStatus批注实现它。 我们可以使用ResponseStatus标记带有状态码和应返回原因的方法或异常类。 在调用标记的处理程序方法时或引发指定的异…

遇C语言条件编译就犯怵,不知什么意思,c语言头文件中的宏定义

前言看见头文件中的条件编译就犯怵&#xff0c;不知什么意思&#xff0c;但是&#xff0c;你老师说&#xff1a;”就得那么写“&#xff0c;你照做&#xff0c;但是知其然而不知其所以然。今天分享下是自己的理解~~~纯属个人献丑&#xff0c;新手可阅&#xff0c;老鸟绕道。代码…

pcie3.0一条通道带宽_小技巧|内存双通道提升性能

今天给大家分享一个小技巧&#xff0c;如果你的电脑有两条或以上的内存条&#xff0c;不同的内存插法也是会影响性能的哦&#xff0c;也就是内存双通道。什么是双通道&#xff1f;双通道内存说白了是两条内存由串联方式改良为并联方式&#xff0c;以得到更大的内存带宽&#xf…