18

次のようなモジュールを使用して、マルチモジュール (maven) の spring MVC アプリケーションを作成したいと考えています。

web
persistance (hibernate)
core (general libs)
models
job-server (queue based jobs)
services (business logic)

このプロジェクトで Scala を使用するには、どこでも問題なく scala を記述できますか? または、サービス モジュールに scala を使用し、Web モジュールに java を使用する必要がありますか?

私は休止状態がJavaでなければならないことを知っています。

考え?アドバイス?

注意すべき問題はありますか?これは良い考えですか?接着するために特定のパーツをハックする必要がありますか?

4

2 に答える 2

17

はい、Spring MVC コードと Hibernate クラスの両方に Scala を使用できます。

これは、私のプロジェクトの 1 つから取得した Scala の Spring MVC コントローラーの例です。

@Controller
class HomeController {
  val log: Logger = LoggerFactory.getLogger(this.getClass.getName)

  @RequestMapping(Array("/"))
  def home: String = {
    log.debug("HomeController::home")

    "home/home"
  }
}

Hibernate ドメイン クラスの例。クラスのユーザー向けの公開 Scala コレクション クラスによって適合された Hibernate のプライベート Java コレクション クラスの使用に注意してください (Scala の JavaConversions クラスによって支援されます)。

@Entity
class Role {
  @Id @GeneratedValue
  var id: Long = _

  @Index(name="role_name")
  var name: String = _

  var created_at: Date = _
  var updated_at: Date = _  

  @ManyToMany
  private var sub_role: java.util.Set[Role] = _
  def subRoles: Set[Role] = {
    if (sub_role == null) sub_role = new java.util.HashSet[Role]
    sub_role
  }

  @ManyToMany
  private var permission: java.util.Set[Permission] = _
  def permissions: Set[Permission] = {
    if (permission == null) permission = new java.util.HashSet[Permission]
    permission
  }
}

Java を使用しなければならなかった唯一のことは、@Retention(RUNTIME)アノテーション (JSR-303 検証用) を作成することです。

私は Maven と maven-scala-plugin を混合 Java/Scala プロジェクトで使用しています。

于 2012-06-27T01:58:27.827 に答える
3

scala と java を一緒に使用して、それぞれが最適に機能すると思われるものに使用できます。

私は休止状態がJavaでなければならないことを知っています。

これは必ずしも真実ではありません。scala クラスを Hibernate ORM オブジェクトとして使用できます。コンパイルされた .class ファイルが、Hibernate が期待するのと同じ getter、setter、およびデフォルトのコンストラクターになることを確認する必要があるだけです。

Web アプリ モジュールも scala で記述できます。コントローラーは、Spring MVC が期待する契約に従うだけで済みます。

一般に、Java で書かれたものはほとんどすべて scala で書き直すことができます。大まかに例外はありますが、成熟するたびに挑戦することを制限しないでください。既存のコードが異常なこと (つまり、ブラック マジック リフレクション) を何もしていないと仮定すると、問題ないはずです。

ここで興味深い質問は、Maven で動作させる方法です...

maven-scala-pluginを使用してこの種のプロジェクトを機能させることを説明する既存の SO の質問があります (scala と Java リソースが混在するマルチモジュール)。このソリューションに追加する唯一の追加コメントは、私の経験では、Java ソースに依存する scala モジュールでのみ動作させることができ、その逆ではないということです。これは、maven 構成が Java コンパイラーと scala コンパイラーを別々に使用したためです。理論的には、scala コンパイラーは Java ファイルもコンパイルできるため、すべてに対して 1 つのコンパイラーのみを使用するように構成した場合、この制限に遭遇することはありません。

編集:

Blankman は次
のようにコメントしています。Mavenの問題を理解しているかどうかわかりません。

はい、Java と Scala のソースが混在するいくつかのプロジェクトに取り組んできました。Hibernate レイヤーには Scala を使用しませんでしたが、他のすべてのレイヤーには使用しました。

私が説明している Maven の問題は、maven-scala-plugin 構成の結果でした。scala ファイルをコンパイルする方法を知るには、それを構成する必要があります。私たちの構成 (おそらく正しくない) は、最初に javac を使用して Java ファイルをコンパイルし、次に scalac を使用して scala ファイルをコンパイルするようにセットアップされました。これは、コンパイル時に利用できないため、scala クラスを参照する Java コードを書くことが許可されていないことを意味していました。適切な構成があれば、scalac コンパイラを使用してすべてのソースを一緒にコンパイルできるはずです。これにより、この厄介な制限が取り除かれます。上記でリンクしたSOの質問には、構成例と、私が話しているコンパイル時間の問題に関するいくつかの議論があります。プラグインの設定に関する参照がさらに必要な場合は、プラグインの Web サイト (上記にもリンクされています) で公式ドキュメントを確認してください。

于 2012-06-26T20:56:15.640 に答える