Использование классов Java в Grails - PullRequest
7 голосов
/ 04 мая 2009

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

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

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

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

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

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

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

PS: я довольно новичок в grails-groovy, поэтому могу упустить очевидное. Спасибо !!!

Ответы [ 3 ]

19 голосов
/ 22 мая 2009

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

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

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

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

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

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

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

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

    Это может быть довольно просто, если ваши классы уже написаны как правильные bean-компоненты, то есть с методами getter / setter для всех их свойств. Grails увидит эти унаследованные свойства, как если бы они были написаны в более простом стиле Groovy. Вы сможете указать, как проверять каждое свойство, используя простые проверки (не пустые, не пустые и т. Д.) Или с замыканиями, которые делают более сложные вещи, например, вызывая существующие методы в своих суперклассах POJO.

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

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

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

    Поиск в «gorm legacy» приводит ряд полезных обсуждений и примеров, например, это сообщение в блоге Глена Смита (соавтор готовящегося к выпуску Grails in Действие ), где он показывает файл отображения Hibernate, используемый для интеграции с «устаревшей БД из ада». Grails в действии имеет главу под названием «Продвинутый GORM Kungfu», которая обещает подробное обсуждение этой темы. У меня есть предварительная версия PDF книги, и, хотя я еще не дошел до этой главы, то, что я прочитал до сих пор, очень хорошо, и книга охватывает много тем, которые недостаточно обсуждаются в других книгах Grails. .

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

4 голосов
/ 04 мая 2009

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

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

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

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

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

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

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

3 голосов
/ 15 мая 2009

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

...