Подтвердить что ты не робот

Как эффективно использовать Scala в проекте Spring MVC?

Я хочу создать мультимодульное приложение (maven) spring MVC с такими модулями, как:

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

Теперь, чтобы использовать Scala в этом проекте, могу ли я писать Scala везде без проблем? Или я должен использовать Scala для моего сервисного модуля и java для веб-модуля?

Я знаю, что спящий режим должен быть в java.

Мысли? Совет?

Есть ли какие-либо проблемы, которые нужно искать? Это хорошая идея? Должен ли я взломать некоторые части, чтобы склеить их вместе?

4b9b3361

Ответ 1

Да, вы можете использовать Scala для вашего кода Spring MVC и ваших классов Hibernate.

Вот пример Spring MVC Controller в Scala, взятый из одного из моих проектов:

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

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

    "home/home"
  }
}

И пример класса домена Hibernate. Обратите внимание на использование частных классов Java-классов для Hibernate, адаптированных с помощью общедоступных классов коллекции 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 for, - это написать @Retention(RUNTIME) аннотации (для проверки JSR-303).

Я использую Maven и maven- scala -plugin со смешанными проектами Java/Scala.

Ответ 2

Вы можете использовать scala и java вместе для того, что, по вашему мнению, лучше всего подходит.

Я знаю, что спящий режим должен быть в java.

Это не обязательно так. Вы можете использовать классы scala в качестве объектов ORM Hibernate. Вам просто нужно убедиться, что скомпилированные файлы .class получаются с теми же геттерами, сеттерами и конструктором по умолчанию, который ожидает Hibernate.

Даже ваш модуль веб-приложений можно записать в scala. Контроллеры просто должны соблюдать контракт, ожидаемый Spring MVC.

В общем, почти все, написанное на Java, можно переписать в scala. Из грубых есть исключения, но не для каждого из них ограничивать себя от попыток. Предполагая, что ваш существующий код не делает ничего сумасшедшего (т.е. Отражения черной магии), это должно быть хорошо.

Интересный вопрос здесь в том, как заставить его работать с Maven...

Существует существующий вопрос SO, который описывает использование maven-scala-plugin для работы такого типа (многомодульный со смешанными scala и java-ресурсами). Единственный дополнительный комментарий, который я добавлю к этому решению, заключается в том, что, по моему опыту, мы могли бы заставить его работать с scala модулями, зависящими от java-источников, а не наоборот. Это связано с тем, что наша конфигурация maven использовала java-компилятор и компилятор scala. Теоретически компилятор scala может скомпилировать файлы Java, поэтому, если вы настроили его просто использовать один компилятор для всего, вы не столкнетесь с этим ограничением.

EDIT:

Бланкман прокомментировал:
@Jesse, так что вы тоже это сделали? не уверен, что я понял проблему с maven.

Да, я работал над несколькими проектами, которые использовали смешанные java и scala источники. Мы не использовали scala для слоя Hibernate, но мы сделали для всего остального.

Проблема maven, которую я описываю, явилась следствием конфигурации maven- scala -plugin. Вы должны настроить его, чтобы знать, как скомпилировать ваши файлы scala. Наша конфигурация (возможно, неверная) была настроена для компиляции java файлов сначала, используя javac, а затем скомпилировать файлы scala, используя scalac. Это означало, что нам не разрешалось писать java-код, который ссылался на классы scala, потому что они не будут доступны во время компиляции. При правильной настройке должно быть возможно использовать компилятор scalac для компиляции всех ваших источников вместе, что устранит это неудобное ограничение. Вопрос SO, с которым я связан выше, имеет конфигурацию примера, а также некоторую дискуссию о проблемах времени компиляции, о которых я говорю. Если вам нужна дополнительная информация о настройке плагина, ознакомьтесь с веб-сайтом плагина (также связанным с выше) для официального документа.