日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

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

發(fā)布時(shí)間:2023/12/3 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mongodb+java_Java EE + MongoDb与Apache TomEE和Jongo Starter项目 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

mongodb+java

知道MongoDB和Java EE ,但是您不確切地知道如何將它們集成在一起? 您是否閱讀了很多有關(guān)該主題的內(nèi)容,但沒(méi)有找到適合該目的的解決方案? 這個(gè)入門項(xiàng)目適合您:

您將學(xué)習(xí)如何以一種時(shí)尚的方式使用MongoDB和Java EE ,而不必依賴Spring Data MongoDB框架,但具有“相似”的基本功能。

比Maven原型更好的唯一事情是可以使用已設(shè)置的所有內(nèi)容進(jìn)行存儲(chǔ)的存儲(chǔ)庫(kù)。 跳過(guò)文檔,而僅進(jìn)行分叉編碼。 該入門項(xiàng)目包含:

  • Jongo如MongoDB的映射( www.jongo.org )。
  • Apache TomEE作為應(yīng)用程序服務(wù)和集成。 ( tomee.apache.org )
  • 測(cè)試的Arquillian 。 ( www.arquillian.org )

該示例非常簡(jiǎn)單,我們希望將顏色存儲(chǔ)在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 }

請(qǐng)注意,我們正在使用Jongo提供的@ObjectId批注將此字段設(shè)置為MongoDB id。 此外,由于它稱為_(kāi)id,因此將自動(dòng)設(shè)置id。

然后是服務(wù)層:

@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);}}

請(qǐng)注意,沒(méi)有很多代碼,但是有些要點(diǎn)確實(shí)很有趣。 讓我們對(duì)其進(jìn)行分析。

@Singleton用于將EJB定義為單例,它也與@Stateless一起使用,對(duì)于Java EE用戶而言,這里沒(méi)有消息。

該類是抽象的。 為什么? 因?yàn)樗试S我們不實(shí)現(xiàn)所有方法而是定義它們。

還實(shí)現(xiàn)java.lang.reflect.InvocationHandler 。 這是因?yàn)槲覀円褂靡粋€(gè)非常有趣的功能,該功能允許我們創(chuàng)建一個(gè)稱為invoke的后備方法。 對(duì)于已定義但尚未實(shí)現(xiàn)的任何方法,都會(huì)調(diào)用此方法。

我們有一個(gè)MongoCollection類(來(lái)自Jongo項(xiàng)目)被注入。 MongoCollection代表MongoDB中的集合。 因?yàn)槲覀冃枰O(shè)置要使用的集合,所以將創(chuàng)建一個(gè)名為@JongoCollection的注釋,以便您可以傳遞后端集合的名稱。 請(qǐng)注意, MongoCollection由CDI容器使用我們的自定義生成器生成。 對(duì)于CDI用戶,這里再無(wú)消息。

@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操作。 請(qǐng)注意,他們不執(zhí)行,他們只用@Insert,@find,@Remove注釋,...,以設(shè)置這是我們要執(zhí)行的方法的目的。 其中一些(例如查找器或刪除器)可以接收要執(zhí)行的類似Jongo的查詢。 還有一個(gè)名為countColors的方法,您可以看到它可以作為自定義方法實(shí)現(xiàn),而不必依賴于invoke方法內(nèi)實(shí)現(xiàn)的邏輯。

最后是invoke方法。 所有抽象方法都將調(diào)用此方法,并將其發(fā)送到PersistenceHandler類,該類實(shí)際上是針對(duì)Jongo的util類,用于執(zhí)行所需的操作。

就是這么簡(jiǎn)單,如果您要添加新的抽象操作,則只需在PersistenceHandler類中實(shí)現(xiàn)它們。

你們中的有些人可能會(huì)奇怪,為什么我使用注釋而不是使用典型的Spring Data方法(該方法的名稱表示操作)。 您也可以實(shí)現(xiàn)這種方法,這是在PersistenceHandler類中創(chuàng)建正則表達(dá)式的簡(jiǎn)單問(wèn)題,而不是帶有注釋的if / else,但是我更喜歡注釋方法。 執(zhí)行時(shí)間更快,更干凈,例如,您可以將批注名稱從@Find重構(gòu)為@Buscar (等效于西班牙文),而不必?fù)?dān)心是否會(huì)破壞某些正則表達(dá)式。

最后是測(cè)試:

@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)));}}

這是一項(xiàng)Arquillian測(cè)試,除一行外沒(méi)有其他特殊之處:

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

因?yàn)槲覀兪褂玫氖茿pache TomEE,所以我們使用它必須配置在代碼中用作javax.annotation.Resource的元素的方式。

META-INF / resources.xml的內(nèi)容為:

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

然后在MongoClient生產(chǎn)者中使用它來(lái)創(chuàng)建要在代碼內(nèi)使用的MongoClient實(shí)例。 請(qǐng)注意,我們將@Resource用作任何標(biāo)準(zhǔn)資源,例如DataSource ,但實(shí)際上注入了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;}}

因此,實(shí)際上Mongo連接是在META-INF / resources.xml文件中配置的,感謝TomEE,我們可以將其稱為任何標(biāo)準(zhǔn)資源。

如果要使用其他應(yīng)用程序服務(wù)器,則可以將此方法更改為它提供的方法,或者如果需要,可以使用DeltaSpike擴(kuò)展或您自己的方法。 另外,由于MongoClient數(shù)據(jù)庫(kù)是從帶有@Produces注釋的方法中獲取的,因此您可以將其注入代碼中的任何位置,因此,如果需要,可以跳過(guò)抽象服務(wù)層。

這種方法有什么好處?

首先,它是Java EE解決方案,您可以在不依賴Spring框架或任何其他庫(kù)的情況下使用它。 您可以實(shí)現(xiàn)所需的內(nèi)容,而不必下載大量?jī)H用于通過(guò)某種對(duì)象映射訪問(wèn)MongoDB的庫(kù)。

就像您可能看到的那樣,代碼非常簡(jiǎn)單,并且沒(méi)有任何魔力,您可以毫無(wú)問(wèn)題地對(duì)其進(jìn)行調(diào)試,甚至可以根據(jù)需要進(jìn)行改進(jìn)或更改。 該代碼是您的,正在等待修改。 您是否要使用本機(jī)MongoDB對(duì)象而不是Jongo ? 沒(méi)問(wèn)題,您可以實(shí)現(xiàn)它。 而且,層數(shù)不多,實(shí)際上只有一層( PersistenceHandler ),因此該解決方案的執(zhí)行速度非常快。

當(dāng)然,這并不意味著您不能使用Spring Data MongoDB 。 這是一個(gè)非常有趣的框架,因此,如果您已經(jīng)在使用Spring ,請(qǐng)繼續(xù)進(jìn)行下去,但是如果您打算使用完整的J ava EE解決方案,請(qǐng)克隆此項(xiàng)目并開(kāi)始使用MongoDB,而無(wú)需進(jìn)行任何網(wǎng)絡(luò)研究。關(guān)于如何將它們整合在一起的知識(shí)。

  • 您可以從https://github.com/lordofthejars/tomee-mongodb-starter-project克隆項(xiàng)目

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

mongodb+java

總結(jié)

以上是生活随笔為你收集整理的mongodb+java_Java EE + MongoDb与Apache TomEE和Jongo Starter项目的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。