Java 8、Spring、Hibernate、SSP-はじめに

最近では、Java 8が登場し、8-yorkが提供する新しいグッズを使用して何かを書きたいと思っていました。

具体的には、より機能的なスタイルのコレクションとインターフェイスのデフォルトメソッドを使用できる新しいコレクションAPIであるLamba。



この記事は、Java 8、Spring MVC、Hibernate、およびSSPを統合した私の経験の簡単な概要です。



猫の下で誰が気にしてください。



まえがき



長い間(そして今でも)、私はScala言語を賞賛し続けていますが、残念なことに、エンタープライズソフトウェアで飽和した私の脳は、まだ純粋なScalaに切り替えることを妨げています。



まず、外部ライブラリ(Hibernate、Spring、Spring MVC)にバインドしているため、まだ弱点があります。

私はそれらをScalaプロジェクトで使用しようとしましたが、松葉杖と小道具を絶えず配置しており、Scalaスタイルで書くことはできない、

むしろ、Javaで記述しますが、Scalaシンタックス+ JavaコレクションとScalaコレクション間の暗黙的な変換という形の松葉杖と小道具を使用します。



そこで、もう少し「ソフト」な方法で使い慣れたスタックを使用することにしました。 私が思いついた唯一の変更は、JSP(Java Server Pages)の代わりにSSP(Scala Server Pages)を使用することです。

View側で静的サポートを取得し、大きな頭痛を感じないようにする

リファクタリング中に何かが壊れており、展開後に既に知っていること(一部のブロックが愚かに表示を停止するか、さらに悪い場合はデータベース内のデータを台無しにする場合)



開始する



それでは始めましょう。



私のお気に入りのMavenを使用します。



プロジェクトがJava 8を使用するというヒントをMavenに与えましょう。

... <build> <plugins> ... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <executions> <execution> <phase>compile</phase> <goals> <goal>compile</goal> </goals> </execution> </executions> <configuration> <_source>1.8</_source> <target>1.8</target> </configuration> </plugin> ... </plugins> </build> ...
      
      







Spring(JDKの新しいバージョンでの変更をサポートする4番目のバージョン、および8番目のJavaで生成されたバイトコードを処理できるライブラリをプルする)/ HibernateおよびSSPに必要な依存関係を追加します。 それ以外はすべてあなたの好みです。 バージョンは、親pom'eの「依存関係管理」セクションで取り出されます。

 <dependencies> ... <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> </dependency> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> </dependency> <!-- Scalate (SSP) support--> <dependency> <groupId>org.fusesource.scalate</groupId> <artifactId>scalate-core_2.10</artifactId> </dependency> <dependency> <groupId>org.fusesource.scalate</groupId> <artifactId>scalate-spring-mvc_2.10</artifactId> </dependency> ... </dependencies>
      
      







私が最初に遭遇した問題は、Scalateライブラリーに依存するScalaコンパイラーの非互換性でした(おかげで、SSPをサポートしているため)、Java 8バイトコードです。

Scalaコンパイラーのプロジェクトに依存関係を明示的に登録する必要があったため、すべてがうまくいきます。



 <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-compiler</artifactId> <version>2.10.4</version> </dependency>
      
      







//もともと依存関係を2.11にアップグレードしたかったのですが、ガッツは大きく変わっており、Scalateの最新バージョン(1.6.1)ではまだサポートされていません。



また、SSPをプリコンパイルし、本番環境ではなくコンパイル中に問題について学習します。

したがって、このためのプラグインを追加します。



 <build> <plugins> ... <plugin> <groupId>org.fusesource.scalate</groupId> <artifactId>maven-scalate-plugin_2.10</artifactId> <version>1.6.1</version> <!--Support jdk 8--> <dependencies> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-compiler</artifactId> <version>2.10.4</version> </dependency> </dependencies> <executions> <execution> <goals> <goal>precompile</goal> </goals> </execution> </executions> </plugin> ... </plugins> </build>
      
      





//ご覧のとおり、Scalaコンパイラと同じハッチが追加されます



いくつかのコード





まあ、構成では、ほとんどすべて



これで、コードをいじり始めて、JDK 8パンを楽しむことができます。



私の基本的なDAO:



 public interface BaseDAO<T extends Model<ID>, ID extends Serializable> extends EntityManagerAware { Class<T> getEntityClass(); default void persist(T entity) { if (entity.isNew()) { entity.assignId(); } getEntityManager().persist(entity); getEntityManager().flush(); } default T find(ID id) { return getEntityManager().find(getEntityClass(), id); } default void delete(T entity) { getEntityManager().remove(entity); } default List<T> findByQuery(String jpqlQueryString) { return findByQueryWithParams(jpqlQueryString, Collections.emptyMap()); } default List<T> findByQueryWithParams(String jpqlQueryString, Map<String, Object> params) { TypedQuery<T> query = getEntityManager().createQuery(jpqlQueryString, getEntityClass()); for (Map.Entry<String, Object> entry : params.entrySet()) { query.setParameter(entry.getKey(), entry.getValue()); } return query.getResultList(); } }
      
      







残念ながら、抽象クラスの形式で追加のレイヤーなしではできませんでした。

 public abstract class AbstractBaseDAO<T extends Model<ID>, ID extends Serializable> implements BaseDAO<T, ID> { @PersistenceContext EntityManager entityManager; @Override public EntityManager getEntityManager() { return entityManager; } }
      
      







特定のDAOインターフェイス:

 public interface PersonDAO extends BaseDAO<Person, UUID> { @Override default Class<Person> getEntityClass() { return Person.class; } List<Person> findAll(); }
      
      







さて、それぞれ、実装:



 @Repository public class PersonDAOImpl extends AbstractBaseDAO<Person, UUID> implements PersonDAO { @Override public List<Person> findAll() { return findByQuery("select p from Person p"); } }
      
      







その結果、リポジトリのCRUDを取得し、私の意見では、サイドノイズの実装をクリアしました。

//もちろん、Spring Data JPAを使用すれば、CRUDペンをまったく書く必要はありませんが、そこから何かが好きではありません。手動で生成/割り当てられたIDの場合、永続化ではなく常にマージを行います。 はい、したがって、システムの動作を制御することは非常に簡単です。



また、Guavaなどのサードパーティライブラリを使用する必要性を取り除きます。これにより、より機能的なスタイルで記述し、すべてを箱から取り出すことができます。



 List<PersonForm> all = personService.findAll().stream().map(PersonForm::from).collect(Collectors.<PersonForm>toList());
      
      







リストを表示する表示:



 <%@ val people: java.util.List[name.dargiri.web.controller.PeopleController.PersonForm]%> <div class="page-header"> <h1>People</h1> </div> <table class="table table-striped"> <thead> <tr> <th>#</th> <th>Username</th> <th>Action</th> </tr> </thead> <tbody> <% for(person <- people ) { %> <tr> <td> <%=person.id%> </td> <td> <%=person.username%> </td> <td> <a href="<%=uri("/people/edit/" + person.id)%>">Edit</a> | <a href="<%=uri("/people/delete/" + person.id)%>">Delete</a> </td> </tr> <% } %> </tbody> </table>
      
      





プロジェクトの構築は簡単です。 私のプロジェクトをデフレートし、Tomcatなどでサーブレットコンテナーにバインドする場合は、次を実行します。

mvn -P =クリーンパッケージのビルド



そして、SSPがどのようにプリコンパイルされているかを確認します。

 ... [INFO] --- maven-scalate-plugin_2.10:1.6.1:precompile (default) @ web --- [INFO] Precompiling Scalate Templates into Scala classes... [INFO] processing /Users/dionis/projects/spring-mvc-java8-web-app-template/web/src/main/webapp/WEB-INF/views/scalate/main/person.ssp [INFO] processing /Users/dionis/projects/spring-mvc-java8-web-app-template/web/src/main/webapp/WEB-INF/views/scalate/main/people.ssp [INFO] processing /Users/dionis/projects/spring-mvc-java8-web-app-template/web/src/main/webapp/WEB-INF/scalate/layouts/default.ssp ...
      
      







ですから、神が禁じた何かがうまくいかず、コンパイル中の何かから何かを壊した場合、dev / qa / staging / production環境への展開後ではなく、今それについて知っています。



この例では、Twitter Bootstrapを使用しました。



スクリーンショット
ユーザー作成:





ユーザーリスト:





ユーザー編集:









サンプルコード:

github.com/dargiri/spring-mvc-java8-web-app-template



無料ボーナスとして:



Java 7でも同じこと:

github.com/dargiri/spring-mvc-java-web-app-template



Scalaでの同じこと:

github.com/dargiri/spring-mvc-scala-web-app-template



そして、あなたがまだそれを読んで、あなた自身のためにコードを引き出して、それで遊びたいならば。



IDEのプラグインを使用するよりも、IDEの下から実行することを好みます。

そのため、web-app-launcherモジュールにはLauncherクラスがあります。

Ideaを使用すると、すべてが問題なく開始されます。

Eclipse / Netbeansを使用する場合、いくつかの操作が必要です。

Eclipseの場合、JDK 8をサポートする元のEclipseを入手してください: www.eclipse.org/downloads/index-java8.php



PPSコードを書いてください。力があなたと共にあるかもしれません。



次に、プロジェクトでは、Mavenプロファイルビルドを選択する必要があります。

また、Launcherクラスで、変数MULTI_MODULE_DEFAULT_PATHの値を「web / src / main / webapp」から「../web/src/main/webapp」またはファイルシステムのルートからのフルパスに変更します。



参照:



Apache Maven-maven.apache.org

拡大縮小-scalate.fusesource.org

Scala-www.scala-lang.org

Apache Tomcat-tomcat.apache.org

Twitter Bootstrap-getbootstrap.com

Spring Data JPA-projects.spring.io/spring-data-jpa

Hibernate ORM-hibernate.org/orm

JDK 8-www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Spring-projects.spring.io/spring-framework



All Articles