JEEアプリケーションでのGroovy統合

  1つのカートを利用することはできません
馬と震える雌
                         A.S. プーシキン

みなさんこんにちは!

この記事では、Groovyを既存のJEE Mavenベースのアプリケーションに統合する方法について説明します。 プロジェクトのソースコードを出発点として使用する許可を与えてくれたAnton Schastny schaanに感謝します。 したがって、このトピックは彼の記事「 調理の学習:Spring 3 MVC + Spring Security + Hibernate」の続きと考えることができます。

始めましょう。

プロジェクトの準備。

SpringSource Tool SuiteアセンブリでEclipseを使用しています。 ContactManager プロジェクトをデフレートします 。 しかし、IDEで急いで開かないでください。 すべてのプロジェクトファイル(.classpath .projectおよび.settingsディレクトリ)をすべて削除すると、さらに信頼性が高くなります。 Antonによる記事の発行以来、テクノロジーが進歩し、STSの新しいバージョンが(異なるプロジェクト構造とm2eプラグインの新しいバージョンで)出てきたため、まずpomファイルを修正し、次にSTSがそれに基づいて新しいプロジェクトを作成します。

簡単にするため、pom.xmlからアスペクトの依存関係とSpring Rooを削除しました。 また、MySQLをより使い慣れたPostgreSQLに置き換えました(jdbc.propertiesファイルを参照)。 しかし、これはすべて言い回しであり、おとぎ話です:依存関係を追加します

<dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>1.8.6</version> </dependency> 


Groovyはすでにプロジェクトに統合されています。 JavaとGroovyの共同コンパイルを扱うことだけが残っています。

groovy-eclipse-compiler

約1年間、 gmavenプラグインを使用しましたgroovy-eclipse-compilerに切り替えたため、彼との作業には「落とし穴」があり、それらを思い出しても意味がありません。 pom.xmlの編集

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.6</source> <target>1.6</target> <encoding>UTF-8</encoding> <compilerId>groovy-eclipse-compiler</compilerId> </configuration> <dependencies> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-eclipse-compiler</artifactId> <version>2.6.0-01</version> </dependency> </dependencies> </plugin> 


pom.xmlのすべてが完了し、STSを実行して、プロジェクトをインポートします。 ファイル->インポート-> Maven->既存のMavenプロジェクト。 Groovy Infectedプロジェクトは非常に正常に見えます。



STSは誓いません、これは良いことですが、実験の純度のために、すべてをMavenで収集する必要があります。 実施します
 mvn clean package 

そして、ログに必要なものが表示されます。

 [INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ contactmanager --- [INFO] Using Groovy-Eclipse compiler to compile both Java and Groovy files 


Groovyに行く

したがって、Javaを使用して実際に別れを告げ、Groovyでの記述を続けます。 すでにかなりの数の連絡先があり、これらの同じ連絡先をタイプ別にグループ化します:「家族」、「仕事」など。

POJO、つまりPO G Oから始めましょう。

src / main / groovyディレクトリを作成し、BuildPathに追加し、パッケージを作成します(この例ではcom.acme.contactmanager.domain)。

パッケージを右クリック->新規-> Groovyクラス

それを呼び出しましょう...言います... ContactType half-actとそのソースコードを書きます:

 @Entity @Table(name = "CONTACT_TYPES", uniqueConstraints = [ @UniqueConstraint(columnNames = ["code"]), @UniqueConstraint(columnNames = ["name"]) ]) class ContactType { @Id @GeneratedValue Integer id @Basic @Column(unique = true, nullable = true) String code @Basic @Column(unique = true, nullable = true) String name @Basic @Column(nullable = true) Boolean defaulttype = false @OneToMany(fetch = FetchType.LAZY, cascade = [CascadeType.REFRESH, CascadeType.MERGE], mappedBy = "contacttype") List<Contact> contacts = null } 


超自然的な、通常の注釈はありません。ただし、配列の中では、中括弧の代わりに、正方形のものがあります。 修飾子、 セッターゲッター 、セミコロンはありません。すべてがきれいで整頓されています。

新しいエンティティがあることを休止状態に通知します

 <hibernate-configuration> <session-factory> <mapping class="net.schastny.contactmanager.domain.Contact" /> <mapping class="com.acme.contactmanager.domain.ContactType" /> </session-factory> </hibernate-configuration> 


Contact.javaに新しいフィールドを追加します。ここではgetter-setterなしではできません

  @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.REFRESH, optional = false) private ContactType contacttype; public ContactType getContacttype() { return contacttype; } public void setContacttype(ContactType contacttype) { this.contacttype = contacttype; } 


ビルド、デプロイし、hibernate.hbm2ddl.auto = updateオプションがhibernateにある場合、データベースに新しいテーブルCONTACT_TYPESと新しいフィールドCONTACTS.contacttype_idが表示されます。

注: データベースに既に連絡先がある場合、optinal = false注釈が存在するにもかかわらず、休止状態は非ヌル制限を設定できません。 リンクにデフォルト値を入力し、null以外の制限を設定すると、読者は宿題になります。

グルーヴィー・ダオ

しかし、そこで止めるには早すぎます。 次のステップはgroovy-daoです。 javaの場合のように、「インターフェース実装」のペアで構成する必要があります。そうしないと、Springは不幸になります。 パッケージを作成して(今回はcom.acme.contactmanager.dao)、ContactTypeDAO.groovyクラスを作成してステップを繰り返します。

 interface ContactTypeDAO { void addContactType(ContactType contactType) List<ContactType> listContactTypes() void removeContactType(Integer id) ContactType getDefault() } 


Javaのようにすべてが99%なので、実装に移りましょう。 プログラミングスキルの頂点ではありませんが、例としては十分です。 listContactTypes()メソッドには、私たち全員が始めた主なチャームが既に含まれています(コード内のコメントを参照)。

 @Repository class ContactTypeDAOImpl implements ContactTypeDAO { @Autowired private SessionFactory sessionFactory; private Session getCurrentSession() { sessionFactory.getCurrentSession() } @Override @Transactional void addContactType(ContactType contactType) { currentSession.save(contactType) } @Override @Transactional List<ContactType> listContactTypes() { //    get-    get    def result = currentSession.createQuery("from ContactType").list() // ,   ,   if(!result){ //  List<Map<String, Object>>?    ! def types = [ //     , //      [name:'', code:'family', defaulttype: false], [name:'', code:'job', defaulttype: false], [name:'', code:'stuff', defaulttype: true] ] //      types.each { type -> ContactType contactType = new ContactType( //   Groovy-    , //   Map code: type.code, name : type.name, defaulttype : type.defaulttype ) currentSession.save(contactType) //   <<     //  result     result << contactType } } //   return   result } @Override @Transactional void removeContactType(Integer id) { ContactType contactType = currentSession.get(ContactType.class, id) if (contactType) { currentSession.delete(contactType) } } @Override @Transactional ContactType getDefault() { currentSession.createCriteria(ContactType.class) .add(Restrictions.eq('defaulttype', true)) .uniqueResult() } } 


指定されたDAOをJavaサービスに統合することは残ります。
 public interface ContactService { //   -  ... public List<ContactType> listContactType(); } 


 @Service public class ContactServiceImpl implements ContactService { //   -  ... @Autowired private ContactTypeDAO contactTypeDAO; @Override @Transactional public List<ContactType> listContactType() { return contactTypeDAO.listContactTypes(); } } 


コントローラーに呼び出しを追加します。
  @RequestMapping("/index") public String listContacts(Map<String, Object> map) { map.put("contact", new Contact()); map.put("contactList", contactService.listContact()); //     JSP map.put("contactTypeList", contactService.listContactType()); return "contact"; } 


ローカライズされたメッセージをmessages * .propertiesファイルに追加し、JSPのタイプのドロップダウンリスト(プロジェクトを参照)をデプロイします。 私たちはチェックします:



その後、テストにGroovyを使用したり、XMLを解析したりできます。 など

GitHubのプロジェクトのソースコード

Groovyにご連絡いただきありがとうございます!

参照資料

料理の学習:Spring 3 MVC + Spring Security + Hibernate
グルーヴィーな家
Groovy Eclipseコンパイラー
SpringSourceツールスイート
プログラミングGroovy:Java開発者向けの動的生産性
ロンボクプロジェクト、または定型的な戦争の宣言

PSテストをプロジェクトに追加する方法はここに書かれています 。 Webコントローラーのテストを含む。

Source: https://habr.com/ru/post/J145158/


All Articles