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

2022-09-02 21:48:02

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

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

现在要在这个项目中使用Scala,我可以毫无问题地到处编写Scala吗?或者我应该在我的服务模块中使用scala,对Web模块使用java?

我知道冬眠必须用java。

思潮?建议?

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


答案 1

是的,您可以将 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,私有Java集合类的使用由公共Scala集合类为该类的用户改编(由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的唯一一件事是编写注释(用于JSR-303验证)。@Retention(RUNTIME)

我使用Maven和maven-scala-plugin以及混合Java /Scala项目。


答案 2

你可以将 scala 和 java 一起使用,用于你认为每个最合适的方法。

我知道冬眠必须用java。

这不一定是真的。您可以使用 scala 类作为休眠 ORM 对象。您只需要确保编译的.class文件最终具有与 Hibernate 期望的相同的 getter、setter 和默认构造函数。

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

一般来说,几乎任何用Java编写的东西都可以用scala重写。粗略地说,有例外,但不要限制自己尝试。假设你现有的代码没有做任何疯狂的事情(即黑魔法反射),它应该没问题。

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

有一个现有的SO问题,它描述了使用maven-scala-plugin来使这种项目工作(混合了scala和java资源的多模块)。我要添加到此解决方案中的唯一额外注释是,根据我的经验,我们只能让它与依赖于java源代码的scala模块一起使用,而不是相反。这是因为我们的 maven 配置分别使用了 java 编译器和 scala 编译器。从理论上讲,scala编译器也可以编译Java文件,因此,如果您将其配置为仅使用一个编译器来处理所有内容,则不会遇到此限制。

编辑:

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

是的,我参与过几个使用混合java和scala源代码的项目。我们没有将Scala用于Hibernate层,但我们在其他所有方面都使用了Scala。

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


推荐