如何在Spring MVC项目中有效地使用Scala?

时间:2012-06-26 20:43:20

标签: java spring scala maven

我想创建一个多模块(maven)spring MVC应用程序,其模块如下:

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

现在在这个项目中使用Scala,我可以在任何地方写scala吗? 或者我应该使用scala作为我的服务模块,使用java作为Web模块吗?

我知道hibernate必须在java中。

思考?建议?

是否有任何问题需要注意?这是一个好主意吗?我是否需要破解某些部件才能将它们粘合在一起?

2 个答案:

答案 0 :(得分:17)

是的,您可以将Scala用于Spring MVC代码和Hibernate类。

以下是我的一个项目中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项目。

答案 1 :(得分:3)

你可以使用scala& java一起用于你认为最适合的任何东西。

  

我知道hibernate必须在java中。

这不一定是真的。您可以将scala类用作Hibernate ORM对象。您只需要确保编译的.class文件最终得到Hibernate所期望的相同的getter,setter和默认构造函数。

甚至您的Web App模块也可以用scala编写。控制器只需要遵守Spring MVC期望的合同。

通常,几乎任何用Java编写的东西都可以用scala重写。粗略的是有例外,但不能完全限制自己尝试。假设你现有的代码没有做任何疯狂的事情(即黑魔法反射),那应该没问题。

这里有趣的问题是如何让它与Maven一起工作......

existing SO question描述使用maven-scala-plugin来实现这种项目(具有混合scala和java资源的多模块)。我将添加到此解决方案的唯一额外评论是,根据我的经验,我们只能使用scala模块依赖于Java源,而不是相反。这是因为我们的maven配置使用了java编译器和scala编译器。从理论上讲,scala编译器也可以编译Java文件,如果你将它配置为只使用一个编译器,你就不会遇到这种限制。

编辑:

  布兰克曼评论说:
  @Jesse所以你也这样做了吗?我不确定我是否理解了maven问题。

是的,我参与了一些使用混合java和scala源的项目。我们没有将Scala用于Hibernate层,但我们做了其他所有事情。

我描述的maven问题是我们的maven-scala-plugin配置的结果。您必须配置它以了解如何编译scala文件。 我们的配置(可能不正确)设置为首先使用javac编译java文件,然后使用scalac编译scala文件。这意味着我们不允许编写引用scala类的java代码,因为它们在编译时不可用。通过正确的配置,应该可以使用scalac编译器将所有源代码编译在一起,这将消除这种尴尬的限制。我上面链接的SO问题有示例配置以及关于我正在讨论的编译时问题的一些讨论。如果您需要更多参考来设置插件,请查看插件的网站(也链接到上面)以获取官方文档。