2012-06-26 5 views
17

Я хочу создать мульти-модуль (Maven) Spring MVC аппликация, с модулями, такими как:Как эффективно использовать Scala в проекте Spring MVC?

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

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

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

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

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

+0

Мой совет: «не надо». ;) –

ответ

16

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

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

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

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

    "home/home" 
    } 
} 

И пример класса домена гибернации. Обратите внимание на использование частных классов Java-классов для Hibernate, адаптированных с помощью общедоступных классов коллекции Scala для пользователей этого класса (чему помогает класс JavaConversions от Scala).

@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-проектами.

+0

Есть ли руководство по использованию scala и Spring? Да, мы можем использовать Spring с scala, но как насчет нюансов? – Cherry

+0

Что ... пожалуйста, не пишите Scala-код вот так. Когда-либо. :( –

+1

Не могли бы вы быть более конкретными? Как бы вы написали Hibernate-код в Scala? – sourcedelica

3

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

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

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

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

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

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

Существует existing SO question, который описывает с помощью maven-scala-plugin, чтобы получить этот вид проекта рабочего (мульти-модуль со смешанными SCALA и ява ресурсов) , Единственный дополнительный комментарий, который я добавлю к этому решению, заключается в том, что, по моему опыту, мы могли бы заставить его работать с модулями 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, с которым я связан выше, имеет конфигурацию примера, а также некоторую дискуссию о проблемах времени компиляции, о которых я говорю. Если вам нужна дополнительная информация о настройке плагина, ознакомьтесь с сайтом плагина (также связанным с выше) для официального документа.

+2

При использовании Scala с Hibernate вы должны иметь в виду, что вам нужно использовать классы коллекции 'java.util' вместо коллекций Scala. – Madoc

+1

@Madoc благодарит, это мелочи, которые я прыгал, чтобы учиться благодаря благодарности! – Blankman

+0

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

Смежные вопросы