Вопрос

У меня есть приложение Java \ Spring \ Hibernate - в комплекте с классами домена, которые в основном являются спящими POJOS

Есть часть функциональности, которая, я думаю, может быть хорошо написана в Grails.

Я хочу повторно использовать классы домена, которые я создал в основном приложении Java

Каков наилучший способ сделать это ?

Должен ли я написать новые классы домена , расширяющие классы Java?это звучит безвкусно Или я могу "генерировать" контроллеры из классов домена Java?

Каковы наилучшие практики повторного использования объектов домена Java в Grails \ Groovy Я уверен, что должны быть другие, пишущие некоторые фрагменты в grails \ groovy

Если вы знаете о руководстве, в котором рассказывается о такой интеграции - это было бы потрясающе!!!

PS:Я совсем новичок в grails-groovy, поэтому, возможно, упускаю очевидное.Спасибо!!!

Это было полезно?

Решение

Вы действительно хотите / нуждаетесь в использовании Grails, а не просто Groovy?

Grails на самом деле - это не то, что вы можете использовать для добавления части в существующее веб-приложение.Весь подход "соглашение о настройке" означает, что вам в значительной степени приходится играть по правилам Grails, иначе нет смысла его использовать.И одно из этих правил заключается в том, что объекты домена являются классами Groovy, которые сильно "улучшены" средой выполнения Grails.

Возможно, было бы возможно заставить их расширять существующие классы Java, но я бы не стал делать ставку на это - и все части Spring и Hibernate вашего существующего приложения пришлось бы отбросить, или, по крайней мере, вам пришлось бы потратить много усилий, чтобы заставить их работать в Grails.Вы будете бороться с фреймворком, а не извлекать из него выгоду.

ИМО, у вас есть два варианта:

  • Перепишите свое приложение с нуля в Grails, повторно используя при этом как можно больше существующего кода.
  • Оставьте свое приложение таким, какое оно есть, и добавляйте новые материалы в Groovy, без использования Grails.

Последнее, вероятно, лучше в вашей ситуации.Grails предназначен для очень быстрого создания новых веб-приложений, вот в чем его преимущество.Добавление материалов в существующее приложение - это просто не то, для чего оно было создано.

Редактировать: Что касается разъяснений в комментариях:если вы планируете написать в основном интерфейс ввода данных / обслуживания для данных, используемых другим приложением, и использовать DB в качестве единственного канала связи между ними, это может на самом деле неплохо работать с Grails;конечно, его можно настроить на использование существующей схемы БД, а не создавать свою собственную из классов домена (хотя последнее требует меньше работы).

Другие советы

Зная, насколько хорошо Groovy и Grails преуспевают в интеграции с существующим Java-кодом, я думаю, что могу быть немного более оптимистичным, чем Майкл, в отношении ваших вариантов.

Во-первых, вы уже используете Spring и Hibernate, и поскольку ваши доменные классы уже являются POJO, с ними должно быть легко интегрироваться.Любые компоненты Spring, которые у вас могут быть, могут быть указаны в XML-файле, как обычно (в grails-app/conf/spring/resources.xml) или гораздо проще использовать Строитель весенних бобов особенность Граалей.Затем к ним можно получить доступ по имени в любом контроллере, представлении, службе и т.д.и работал с ним, как обычно.

Вот варианты, как я их вижу, для интеграции ваших доменных классов и схемы базы данных:

  • Обойдите GORM и загрузите / сохраните объекты вашего домена точно так, как вы уже делаете.

    Grails не заставляет вас использовать GORM, так что это должно быть довольно просто:создать .jar вашего Java-кода (если вы еще этого не сделали) и поместите его в приложение Grails lib справочник.Если ваш Java-проект оптимизирован, это еще проще:Grails 1.1 работает с Maven, поэтому вы можете создать pom.xml для вашего приложения Grails и добавьте свой Java-проект в качестве зависимости, как вы делали бы в любом другом проекте (Java).

    В любом случае вы сможете import ваши занятия (и любые вспомогательные занятия) и продолжайте в обычном режиме.Благодаря тесной интеграции Groovy с Java вы сможете создавать объекты, загружать их из базы данных, изменять, сохранять, проверять и т.д.точно так же, как вы сделали бы это в своем Java-проекте.Таким образом, вы не получите всех удобств GORM, но у вас будет преимущество в том, что вы будете работать со своими объектами способом, который уже имеет смысл для вас (за исключением, возможно, использования немного меньшего количества кода благодаря Groovy).Вы всегда можете сначала попробовать этот вариант, чтобы заставить что-то работать, а затем рассмотреть один из других вариантов позже, если на тот момент это покажется разумным.

    Один совет, если вы все же попробуете этот вариант:абстрагируйте фактический код сохранения в службу Grails (StorageService возможно) и пусть ваши контроллеры вызывают методы на нем, а не обрабатывают персистентность напрямую.Таким образом, вы могли бы заменить эту службу чем-то другим в будущем, если потребуется, и до тех пор, пока вы поддерживаете тот же интерфейс, ваши контроллеры не будут затронуты.

  • Создайте новые классы домена Grails в качестве подклассов ваших существующих Java-классов.

    Это может быть довольно просто, если ваши классы уже написаны как правильные компоненты, т.е.с методами получения / установки для всех их свойств.Grails будет видеть эти унаследованные свойства так, как если бы они были написаны в более простом стиле Groovy.Вы сможете указать, как проверять каждое свойство, используя либо простые проверки (не null, не blank и т.д.), Либо с помощью замыканий, которые выполняют более сложные задачи, возможно, вызывая существующие методы в их суперклассах POJO.

    Вам почти наверняка потребуется настроить сопоставления с помощью GORM отображение DSL чтобы соответствовать реалиям вашей существующей схемы базы данных.Отношения были бы такими, где это могло бы стать непростым делом.Например, у вас может быть какое-то другое решение, в котором GORM ожидает таблицу объединения, хотя, возможно, даже есть способ обойти подобные различия.Я бы посоветовал узнать как можно больше о GORM и его отображающем DSL, а затем поэкспериментировать с несколькими вашими классами, чтобы увидеть, является ли это жизнеспособным вариантом.

  • Попросите Grails напрямую использовать ваши существующие сопоставления POJOs и Hibernate.

    Я сам этого не пробовал, но, согласно Grails Страница интеграции с гибернацией предполагается, что это возможно:"Grails также позволяет вам написать свою модель домена на Java или повторно использовать существующую модель домена, которая была сопоставлена с помощью Hibernate.Все, что вам нужно сделать, это поместить файл необходимой 'hibernate.cfg.xml и соответствующие файлы сопоставления в%PROJECT_HOME%/файл Grails-приложения/каталог Conf в/спящий режим'.Вы по-прежнему сможете вызывать все динамические постоянные методы и методы запросов, разрешенные в GORM! "

    Поиск в Google "gorm legacy" позволяет найти ряд полезных обсуждений и примеров, например это сообщение в блоге автор: Глен Смит (соавтор книги, которая скоро выйдет Граали в действии), где он показывает файл отображения гибернации, используемый для интеграции с "устаревшей базой данных из ада". Граали в действии содержит главу под названием "Продвинутый ГОРМ кунфу", в которой обещается подробное обсуждение этой темы.У меня есть предварительный PDF-файл книги, и хотя я еще не добрался до этой главы, то, что я прочитал на данный момент, очень хорошо, и книга охватывает многие темы, которые недостаточно обсуждаются в других книгах Grails.

Извините, я не могу поделиться каким-либо личным опытом по этому последнему варианту, но он звучит выполнимо (и весьма многообещающе).Какой бы вариант вы ни выбрали, дайте нам знать, как это получится!

В этом посте приведены некоторые рекомендации по использованию grails для оборачивания существующих классов Java в веб-инфраструктуру .

scroll top