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コントローラーのテストを含む。



All Articles