netbeans 源文件_具有NetBeans,嵌入式GlassFish,JPA和MySQL数据源的Arquillian
netbeans 源文件
這是一個(gè)偶然的帖子。 我一直在研究交易CDI觀察者,并嘗試使用嵌入式GlassFish對(duì)它進(jìn)行一些集成測(cè)試。 但是令人驚訝的是,這種方法不能很好地工作,我仍在弄清楚,使用普通的嵌入式GlassFish時(shí)問題出在哪里。同時(shí),我轉(zhuǎn)到了Arquillian 。 去年我仔細(xì)查看了Arquillian 1.0.0.Alpha4之后,是時(shí)候看看這些家伙為1.0.0決賽準(zhǔn)備了什么。 有些東西發(fā)生了一些變化,我很驚訝只在網(wǎng)上找到一些基本的例子。 這就是我開始寫這篇文章的主要原因。 要獲得所有這三種技術(shù)一起工作的更完整示例。
入門
首先,獲得最新的NetBeans 7.1的新副本。 幾周后就出來了,看起來真的很好。 如果愿意,您可以下載Java EE版本的副本,該版本隨附預(yù)先捆綁的最新GlassFish OSS Edition 3.1.1。 安裝并啟動(dòng)它。 還要grep MySQL Community Edition的副本并安裝它。 返回NetBeans,通過新的項(xiàng)目向?qū)гO(shè)置新的Maven Web應(yīng)用程序。 我們將其稱為“ simpleweb”,并告訴它在GF 3.1.1上運(yùn)行(如果尚未運(yùn)行,則應(yīng)在服務(wù)創(chuàng)建之前創(chuàng)建Services> Server> GlassFish實(shí)例,或者在項(xiàng)目設(shè)置期間創(chuàng)建它)。
實(shí)施您的應(yīng)用程序
即使這不是測(cè)試驅(qū)動(dòng)的,我還是喜歡使用這種方法,因?yàn)槲胰匀幌嘈?#xff0c;這是您在項(xiàng)目中發(fā)現(xiàn)的最常見的情況。 您已經(jīng)準(zhǔn)備好運(yùn)行很多東西,并且正在尋找某種自動(dòng)集成測(cè)試。 因此,假設(shè)您有一個(gè)非常基本的實(shí)體,我們將其稱為“ com.mycompany.simpleweb.entities.AuditLog”。 您可以使用NetBeans新實(shí)體向?qū)?chuàng)建它。 實(shí)體創(chuàng)建過程中的第三步是提供程序和數(shù)據(jù)庫設(shè)置。 定義一個(gè)新的數(shù)據(jù)源,并將其命名為“ jdbc / auditlog”。 作為連接規(guī)范,請(qǐng)使用MySQL J驅(qū)動(dòng)程序,并且我假設(shè)您已經(jīng)建立了一個(gè)數(shù)據(jù)庫并正在運(yùn)行(假設(shè)這被稱為auditlog)。 測(cè)試連接并完成向?qū)А?
如果您使用向?qū)?#xff0c;則將獲得一些免費(fèi)禮物。 除了事實(shí),您現(xiàn)在在源代碼樹中有AuditLog實(shí)體,您還可以在src / main / resources中找到一個(gè)META-INF / persistence.xml文件,并在src / main / setup中找到一個(gè)glassfish-resources.xml。 稍后需要這樣做,請(qǐng)記住這一點(diǎn)。 向您的實(shí)體添加一些其他屬性。 現(xiàn)在,我添加“字符串帳戶”。 并且不要忘記定義一個(gè)Version字段“ Timestamp timestamp”。 還有一點(diǎn)點(diǎn)命名查詢來獲取所有AuditLogs的列表也是很好的
@NamedQuery(name = "findAllAuditLogs", query = "SELECT OBJECT (e) FROM AuditLog e")@Version private Timestamp timestamp; 如果使用向?qū)?#xff0c;請(qǐng)確保檢查pom.xml。 該向?qū)г谔峁┑姆秶刑砑恿艘恍〆clipselink依賴項(xiàng),因此在這里應(yīng)該沒有太大的區(qū)別。 接下來是添加com.mycompany.simpleweb.service.AuditRepositoryService EJB。 這應(yīng)該負(fù)責(zé)AuditLog實(shí)體上的所有CRUD操作。
向其中添加一些代碼以插入AuditLog:
還有更多代碼來查找表中的條目總數(shù):
public int findAll() {TypedQuery<AuditLog> query = em.createNamedQuery("AuditLog.findAllAuditLogs", AuditLog.class);return query.getResultList().size();}目前為止就這樣了。
添加基本??測(cè)試依賴項(xiàng)
接下來,我們將添加一些非常基本的測(cè)試依賴項(xiàng)。 打開您的項(xiàng)目pom.xml文件,然后將Arquillian的以下部分添加到您的項(xiàng)目中:
除此之外,您還需要嵌入式Glassfish依賴項(xiàng)。
<dependency><groupid>org.glassfish.extras</groupid><artifactid>glassfish-embedded-all</artifactid><version>3.1</version><scope>test</scope> </dependency>我們還需要MySQL J驅(qū)動(dòng)程序:
<dependency><groupid>mysql</groupid><artifactid>mysql-connector-java</artifactid><version>5.1.18</version><scope>test</scope> </dependency> 配置Arquillian
在所有必要的依賴關(guān)系就緒之后,我們需要進(jìn)一步配置Arquillian。 這是通過arquillian.xml完成??的,該文件必須放在src / test / resources文件夾中(您可能之前需要在NetBeans外部創(chuàng)建它),并且應(yīng)如下所示:
engine參數(shù)告訴Arquillian將測(cè)試存檔的打包版本放置到target / arquillian文件夾中。 這對(duì)于解決問題非常有用。 容器限定符將測(cè)試運(yùn)行程序指向由實(shí)體創(chuàng)建向?qū)?chuàng)建的glassfish-resources.xml。 全做完了。 我想建議的一件事是制作persistence.xml的副本,并將其放置到重命名為test-persistence.xml之類的test / resources文件夾中。 我認(rèn)為最好的做法是可以選擇配置測(cè)試JPA,而配置JPA則不同于生產(chǎn)JPA。 作為一個(gè)簡單的例子,我們希望在測(cè)試過程中看到更多日志記錄輸出,因此復(fù)制的版本還應(yīng)包含所需的參數(shù)。 我還想將用于測(cè)試的表生成策略更改為拖放表:
<property name="eclipselink.ddl-generation" value="drop-and-create-tables" /> <property name="eclipselink.logging.level.sql" value="FINEST" /> <property name="eclipselink.logging.parameters" value="true" />讓我們看一下測(cè)試。
添加一個(gè)測(cè)試用例
讓我們添加一個(gè)測(cè)試。 對(duì)于NetBeans,這很容易:右鍵單擊EJB,然后選擇“工具>創(chuàng)建JUnit測(cè)試”。 選擇JUnit 4.x,并接受名稱建議“ com.mycompany.simpleweb.service.AuditRepositoryServiceTest”。 現(xiàn)在,您的項(xiàng)目有了一個(gè)新的“ Test Packages”文件夾。 如您所見,測(cè)試是錯(cuò)誤的。 NetBeans假定您要基于嵌入式EJBContainer進(jìn)行測(cè)試。 不錯(cuò)的猜測(cè),但我們想在此處添加一些Arquillian。 刪除EJBContainer導(dǎo)入并將類剝離為此:
現(xiàn)在是時(shí)候使用ShrinkWrap定義測(cè)試的部署檔案了。 測(cè)試的部署存檔是使用帶有Arquillian的@Deployment批注的靜態(tài)方法定義的。
@Deploymentpublic static JavaArchive createTestArchive() {return ShrinkWrap.create(JavaArchive.class, "test.jar").addPackage(AuditLog.class.getPackage()).addPackage(AuditRepositoryService.class.getPackage()).addAsManifestResource(new ByteArrayAsset("<beans>".getBytes()),ArchivePaths.create("beans.xml")).addAsManifestResource("test-persistence.xml",ArchivePaths.create("persistence.xml"));}在添加了應(yīng)包含的軟件包之后,添加了一個(gè)空的beans.xml(現(xiàn)在應(yīng)該足夠了),并添加了test-persistence.xml作為名為persistence.xml的清單資源。 大。 最后一件事是定義測(cè)試本身。
@EJB AuditRepositoryService repository;@Testpublic void insertLog() throws Exception {repository.writeLog("Markus");int numberOfLogs = repository.findAll();Assert.assertEquals(1, numberOfLogs);}我們正在插入一個(gè)簡單的測(cè)試實(shí)體,并從數(shù)據(jù)庫中獲取計(jì)數(shù),該計(jì)數(shù)通過assertEquals檢查。 就這樣。 啟動(dòng)您的測(cè)試。 (右鍵單擊AuditRepositoryServiceTest類,然后選擇“測(cè)試文件(Strg + F6)。
檢查發(fā)生了什么
輸出窗口顯示起始GlassFish的Std.out。 如果進(jìn)一步檢查輸出,將會(huì)看到JDBC連接池和JDBC資源已創(chuàng)建:
信息:命令添加資源結(jié)果:PlainTextActionReporterSUCCESS描述:添加資源AdminCommandnull JDBC連接池mysql_auditlog_rootPool創(chuàng)建成功。 JDBC資源jdbc / auditlog已成功創(chuàng)建。 并部署了“測(cè)試”應(yīng)用程序: 信息:WEB0671:在[/ test]處加載應(yīng)用程序[test] 17.01.2012 10:12:39 org.glassfish.deployment.admin.DeployCommand執(zhí)行 INFO:測(cè)試成功部署了6.461毫秒。
掃描輸出確實(shí)會(huì)指向一些EclipseLink東西,但是附加的sql日志記錄似乎無效。 這是因?yàn)镋clipseLink需要知道將輸出指向哪個(gè)記錄器。 通常,日志輸出將重定向到自動(dòng)發(fā)現(xiàn)的服務(wù)器記錄器。 到目前為止,我們沒有進(jìn)行任何日志記錄配置,僅依賴于Java Logging的默認(rèn)值。 因此,讓我們添加一些日志記錄配置。 將一個(gè)空的logging.properties文件放入src / test / resources并向其中添加一些簡單的行:
handlers = java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.ConsoleHandler.level = FINEST 將maven sure-fire插件添加到pom.xml的build部分:
如果現(xiàn)在執(zhí)行清理和構(gòu)建,則會(huì)看到所需的日志輸出顯示在NetBeans構(gòu)建輸出中。
有限:插入音頻日志(ID,帳戶,時(shí)間戳)值(?,?,?)
綁定=> [1,馬庫斯,2012-01-17 11:02:54.0] 實(shí)際上,如果您使用Strg + F6,您仍然只會(huì)看到INFO級(jí)別的消息。 要解決此問題,您需要更改NetBeans運(yùn)行操作設(shè)置。 右鍵單擊您的項(xiàng)目,然后選擇“屬性”。 選擇“操作”和“測(cè)試文件”。 將以下內(nèi)容作為新行添加到“設(shè)置屬性”區(qū)域中:
java.util.logging.config.file = src / test / resources / logging.properties
現(xiàn)在,您還可以通過一次測(cè)試查看所需的日志級(jí)別輸出。 就是這樣 您可以下載完整的示例maven項(xiàng)目(作為ZIP文件) ,并帶有提到的類,并進(jìn)行一些操作。 玩得開心!
即使上面的帖子旨在成為一個(gè)更復(fù)雜的演示,事實(shí)證明,我還是錯(cuò)過了設(shè)置方面的一個(gè)大問題。 當(dāng)您開始向?qū)嶓w引入增強(qiáng)功能時(shí),一切工作都很好。 僅舉幾例:延遲加載,更改跟蹤,獲取組等。 JPA提供者喜歡稱其為“增強(qiáng)”,通常將其稱為“編織”。 編織是一種操作已編譯Java類的字節(jié)碼的技術(shù)。 EclipseLink JPA持久性提供程序使用編織來增強(qiáng)提到的內(nèi)容的JPA實(shí)體并進(jìn)行內(nèi)部優(yōu)化。 編織可以在運(yùn)行時(shí)加載實(shí)體時(shí)動(dòng)態(tài)執(zhí)行,也可以在編譯時(shí)通過對(duì)Entity .class文件進(jìn)行后處理來靜態(tài)執(zhí)行。 通常建議使用動(dòng)態(tài)編織,因?yàn)樗子谂渲?#xff0c;并且不需要對(duì)項(xiàng)目的構(gòu)建過程進(jìn)行任何更改。 您可能已經(jīng)從EclipseLink看到了一些更好的日志輸出,如下所示:
[…] –開始weaver類轉(zhuǎn)換器處理類[com / mycompany / simpleweb / entities / AuditLog]。
[…] –編織的持久性(PersistenceEntity)[com / mycompany / simpleweb / entities / AuditLog]。
[…] –編織變更跟蹤(ChangeTracker)[com / mycompany / simpleweb / entities / AuditLog]。 […] –編織懶惰(間接使用ValueHolder)[com / mycompany / simpleweb / entities / AuditLog]。 […] –編織提取組(FetchGroupTracker)[com / mycompany / simpleweb / entities / AuditLog]。 […] –結(jié)束weaver類轉(zhuǎn)換器處理類[com / mycompany / simpleweb / entities / AuditLog]。
Arquillian和嵌入式GlassFish的問題
想象一下,您以昨天博客中的示例為例,將簡單的String account屬性更改為如下所示:
這正是上述情況之一,您的JPA提供程序需要在執(zhí)行之前對(duì)類文件進(jìn)行一些增強(qiáng)。 如果不修改項(xiàng)目,將導(dǎo)致一些非常討厭的異常:
異常描述:訪問不存在的編織_vh_方法[_persistence_get_person_vh]時(shí)將發(fā)生NullPointerException。 未正確編織該類–對(duì)于EE部署,請(qǐng)檢查application.xml部署描述符中的模塊順序,并驗(yàn)證包含持久性單元的模塊是否在使用該持久性單元的任何其他模塊之前。
[…]
內(nèi)部異常:java.lang.NoSuchMethodException:com.mycompany.simpleweb.entities.AuditLog._persistence_get_person_vh() 映射:org.eclipse.persistence.mappings.ManyToOneMapping [person] 描述符:RelationalDescriptor(com.mycompany.simpleweb.entities.AuditLog –> [DatabaseTable(AUDITLOG)]) 在org.eclipse.persistence.exceptions.DescriptorException.noSuchMethodWhileInitializingAttributesInMethodAccessor(DescriptorException.java:1170) 在org.eclipse.persistence.internal.descriptors.MethodAttributeAccessor.initializeAttributes(MethodAttributeAccessor.java:200) […]
表示缺少某些內(nèi)容。 而這種缺失的方法是由編織過程引入的。 如果您反編譯編織的實(shí)體,則可以看到JPA提供程序在抱怨什么。 這是增強(qiáng)型實(shí)體類的外觀。 這只是編織過程引入到您的代碼中的增強(qiáng)方法之一。
public WeavedAttributeValueHolderInterface _persistence_get_person_vh(){_persistence_initialize_person_vh();if(_persistence_person_vh.isCoordinatedWithProperty() || _persistence_person_vh.isNewlyWeavedValueHolder()){Person person1 = _persistence_get_person();if(person1 != _persistence_person_vh.getValue())_persistence_set_person(person1);}return _persistence_person_vh;} 動(dòng)態(tài)與靜態(tài)編織
顯然,默認(rèn)的動(dòng)態(tài)編織不適用于上述設(shè)置。 為什么? 編織是一個(gè)被寵壞的孩子。 它僅在要編織的實(shí)體類僅存在于應(yīng)用程序類加載器中時(shí)才起作用。 嵌入式GlassFish,Arquillian和maven sure-fire-plugin的結(jié)合使這一點(diǎn)有些混亂,故事的結(jié)尾是,您的實(shí)體完全沒有任何增強(qiáng)。 比較這個(gè)不錯(cuò)的討論,以獲得更詳細(xì)的解釋。 如果動(dòng)態(tài)波動(dòng)不起作用,則必須使用稱為靜態(tài)編織的后備。 靜態(tài)意味著:在構(gòu)建過程中對(duì)實(shí)體進(jìn)行后處理。 有了maven項(xiàng)目,這聽起來很容易。 讓我們尋找這樣的東西。 您可能會(huì)發(fā)現(xiàn)的第一件事是StaticWeaveAntTask 。 第二件事可能是Craig的eclipselink-staticweave-maven-plugin 。
讓我們從StaticWeaveAntTask開始。 您必須使用maven-antrunner-plugin來進(jìn)行介紹。 從左到右復(fù)制課程,并進(jìn)行大量的爭(zhēng)吵以使您的課程路徑牢牢掌握。 Laird Nelson在為所有三個(gè)大型JPA提供程序(EclipseLink,OpenJPA,Hibernate)提供示例配置原型方面做得很出色,您可以嘗試一下。 有關(guān)正在發(fā)生的事情的詳細(xì)說明可以在他的博客中找到 。 感謝萊爾德的指示! 不要誤會(huì)我的意思:這是一種有效的方法,但是我根本不喜歡它。 主要是因?yàn)樗o構(gòu)建帶來了巨大的復(fù)雜性,并且看到了太多的項(xiàng)目,甚至沒有管理正常Maven項(xiàng)目所需的技能,這對(duì)我來說根本不是解決方案。 我嘗試了Craig Day完成的靜態(tài)編織插件。
向simpleweb添加靜態(tài)編織
因此,讓我們從昨天的項(xiàng)目中打開pom.xml并引入新的插件:
做完了 現(xiàn)在,您的類已經(jīng)編好了,如果您通過插件配置引入一些日志記錄,您實(shí)際上可以看到,您的實(shí)體類會(huì)發(fā)生什么。 該插件可通過repo1.maven.org獲得。 我遇到的唯一問題是,引入的對(duì)EclipseLink 2.2.0的依賴關(guān)系不是(或當(dāng)然)不能通過同一存儲(chǔ)庫獲得,因此您可能需要使用正確的存儲(chǔ)庫和依賴關(guān)系為自己構(gòu)建它。 您可以通過插件的Google代碼頁來獲取源代碼。
不要忘記將編織屬性添加到您的test-persistance.xml中:
<property name="eclipselink.weaving" value="static" /> [更新:2012年1月19日]
Craig發(fā)布了該插件的新1.0.2版本,該版本解決了EclipseLink依賴項(xiàng)的問題。 現(xiàn)在,您可以簡單地包括所需的EclipseLink版本作為插件的依賴項(xiàng)。 還需要正確的EclipseLink Maven存儲(chǔ)庫。 具有配置的日志級(jí)別的完整示例如下所示:
參考: 具有NetBeans的Arquillian,嵌入式GlassFish,JPA和MySQL數(shù)據(jù)源和具有NetBeans的Arquillian,嵌入式GlassFish,JPA和MySQL數(shù)據(jù)源–來自我們JCG合作伙伴 Markus Eisele在企業(yè)軟件開發(fā)和Java博客上的第二部分。
翻譯自: https://www.javacodegeeks.com/2012/01/arquillian-with-netbeans-glassfish.html
netbeans 源文件
總結(jié)
以上是生活随笔為你收集整理的netbeans 源文件_具有NetBeans,嵌入式GlassFish,JPA和MySQL数据源的Arquillian的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。