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クラス
それを呼び出しましょう...言います...
@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コントローラーのテストを含む。