Run groovy with java

Интеграция Groovy в JEE приложение

В данной заметке я хочу рассказать, как интегрировать язык Groovy в существующее JEE приложение на основе Maven. Выражаю благодарность Антону Щастному schaan за разрешение на использование исходного кода его проекта в качестве отправной точки. Поэтому данный топик можно считать продолжением его статьи Учимся готовить: Spring 3 MVC + Spring Security + Hibernate.

Подготовка проекта.

Я использую Eclipse в сборке SpringSource Tool Suite. Выкачиваем проект ContactManager. Но не торопитесь его открывать в IDE. Будет даже надежнее, если вы вообще удалите все файлы проекта: .classpath .project и каталог .settings. Ибо с момента публикации статьи Антона технологии шагнули вперед, вышли новые версии STS (с другой структурой проекта и новой версией плагина m2e), поэтому мы сначала исправим pom-файл, затем на его основе STS нам создаст новый проект.

Для простоты я удалил из pom.xml зависимости от аспектов и Spring Roo. Также заменил MySQL на более привычный мне PostgreSQL (см. файл jdbc.properties). Но это все присказка, а вот и сказка: добавляем зависимость

 org.codehaus.groovy groovy-all 1.8.6  

Собственно это почти все, Groovy уже интегрирован в наш проект. Осталось только разобраться с совместной компиляцией Java и Groovy.

groovy-eclipse-compiler

Около года мы пользовались плагином gmaven. В работе с ним были свои «подводные камни», нет смысла уже о них вспоминать, потому что мы перешли на groovy-eclipse-compiler. Редактируем pom.xml

 org.apache.maven.plugins maven-compiler-plugin 2.3.2 1.6 1.6 UTF-8 groovy-eclipse-compiler   org.codehaus.groovy groovy-eclipse-compiler 2.6.0-01    

Все, с pom.xml закончили, запускаем STS и импортируем в него проект. File -> Import -> Maven -> Existing Maven Projects. «Зараженный Groovy» проект выглядит совершенно обычно.

Читайте также:  Посмотреть код php файла

STS не ругается, это хорошо, но для чистоты эксперимента нужно собрать все мавеном. Выполняем

[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ contactmanager --- [INFO] Using Groovy-Eclipse compiler to compile both Java and Groovy files
Переходим на Groovy

Итак с java мы практически попрощались, дальше будем писать на Groovy. Контактов набралось уже изрядно и мы хотим эти самые контакты группировать по типам: «семья», «работа» и т.д.

Начнем с POJO, то бишь с POGO.

Создадим каталог src/main/groovy, добавим его в BuildPath, создадим пакет (в нашем примере com.acme.contactmanager.domain)

На пакете кликаем правой кнопкой -> New -> Groovy class

Назовем его… скажем… Полуэкт ContactType и напишем его исходный код:

@Entity @Table(name = "CONTACT_TYPES", uniqueConstraints = [ @UniqueConstraint(columnNames = ["code"]), @UniqueConstraint(columnNames = ["name"]) ]) class ContactType < @Id @GeneratedValue Integer id @Basic @Column(unique = true, nullable = true) String code @Basic @Column(unique = true, nullable = true) String name @Basic @Column(nullable = true) Boolean defaulttype = false @OneToMany(fetch = FetchType.LAZY, cascade = [CascadeType.REFRESH, CascadeType.MERGE], mappedBy = "contacttype") Listcontacts = null > 

Ничего сверхестественного, обычные аннотации, разве что в массивах вместо фигурных скобок квадратные. Нет модификаторов, геттеров-сеттеров, точек с запятой, все чисто-аккуратно.

Сообщаем хибернейту, что у нас появилась новая сущность

Добавляем новое поле в Contact.java, тут уже без геттеров-сеттеров не обойтись

 @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.REFRESH, optional = false) private ContactType contacttype; public ContactType getContacttype() < return contacttype; >public void setContacttype(ContactType contacttype)

Собираемся, деплоимся и, если в хибернейте стоит опция hibernate.hbm2ddl.auto=update, то видим в БД новую таблицу CONTACT_TYPES и новое поле CONTACTS.contacttype_id.

Примечание: Если в БД уже есть контакты, то not null ограничение хибернейт поставить не сможет, несмотря на присутствие аннотации optinal=false. Заполнение ссылок дефолтными значениями и выставление not null ограничения оставлю читателям в качестве домашнего задания.

Groovy DAO

Но рано останавливаться на достигнутом. Следующий шаг — groovy-dao. Он, как и в случае с java, должен состоять из пары «интерфейс-реализация», иначе Spring будет недоволен. Повторяем шаги с созданием пакета (на этот раз — com.acme.contactmanager.dao) и созданием класса ContactTypeDAO.groovy

interface ContactTypeDAO < void addContactType(ContactType contactType) ListlistContactTypes() void removeContactType(Integer id) ContactType getDefault() > 

Все на 99% как в java, поэтому переходим к реализации. Не вершина программерского мастерства, но для примера достаточно. Метод listContactTypes() уже содержит основные прелести, ради которых мы все и затеяли (см. комментарии в коде):

@Repository class ContactTypeDAOImpl implements ContactTypeDAO < @Autowired private SessionFactory sessionFactory; private Session getCurrentSession() < sessionFactory.getCurrentSession() >@Override @Transactional void addContactType(ContactType contactType) < currentSession.save(contactType) >@Override @Transactional List listContactTypes() < // в вызовах любых get-методов можно опускать префикс get и пустые скобки def result = currentSession.createQuery("from ContactType").list() // проверка, что список пустой, выглядит так if(!result)< // Нужен List>? Что может быть проще! def types = [ // кавычки для ключей не обязательны, // значения могут быть любого типа [name:'Семья', code:'family', defaulttype: false], [name:'Работа', code:'job', defaulttype: false], [name:'Знакомые', code:'stuff', defaulttype: true] ] // вместо цикла можно использовать замыкание types.each < type ->ContactType contactType = new ContactType( // в любой Groovy-класс по умолчанию добавляется конструктор, // принимающий параметром Map code: type.code, name : type.name, defaulttype : type.defaulttype ) currentSession.save(contactType) // перегруженный оператор > // ключевое слово return не обязательно result > @Override @Transactional void removeContactType(Integer id) < ContactType contactType = currentSession.get(ContactType.class, id) if (contactType) < currentSession.delete(contactType) >> @Override @Transactional ContactType getDefault() < currentSession.createCriteria(ContactType.class) .add(Restrictions.eq('defaulttype', true)) .uniqueResult() >> 

Осталось интегрировать спежеиспеченный DAO в Java-service:

public interface ContactService < // старые методы где-то тут . public ListlistContactType(); >
@Service public class ContactServiceImpl implements ContactService < // старые методы где-то тут . @Autowired private ContactTypeDAO contactTypeDAO; @Override @Transactional public ListlistContactType() < return contactTypeDAO.listContactTypes(); >>

Добавляем вызов в контроллер:

 @RequestMapping("/index") public String listContacts(Map map) < map.put("contact", new Contact()); map.put("contactList", contactService.listContact()); // список типов контактов для JSP map.put("contactTypeList", contactService.listContactType()); return "contact"; >

Добавляем локализованные сообщения в файлы messages*.properties и выпадающий список типов на JSP (см. в проекте), собираемся, деплоимся. Проверяем:

Дальше можно использовать Groovy для тестов, парсить XML и т.д. и т.п.

Спасибо за внимание, пишите на Groovy!

Ссылки

PS как добавить тесты в проект написано тут. В том числе — тесты для web-контроллеров.

Источник

Getting started with Groovy and Java 11 project

Since JDK 11 requirements have changed for Groovy, you need to perform some additional steps to successfully run the Groovy code in IntelliJ IDEA.

In this tutorial, you’ll create a Groovy project with JDK 11, add simple code, and run a Groovy script.

Step 1. Create a project

Let’s create a Groovy project with Java.

Create a new Groovy project

Create Groovy project

  1. On the welcome screen, click New Project . To the options on the right, IntelliJ IDEA automatically adds a project SDK (JDK). In our tutorial we use the open JDK 11 version. The Groovy library should be downloaded on your machine. IntelliJ IDEA expects the standard Groovy SDK layout which is provided with the official distributions available at http://groovy-lang.org/download.html. Download the SDK, unpack it into any directory, and specify this directory as the library home. In this tutorial, it is Groovy 2.5.6. Click Next .
  2. On the next page of the wizard, let’s specify the name (GroovyDemo11) and location of the project. Click Finish .

Step 2. Add and Run code

Let’s create a Groovy script.

Add Groovy script

  1. In the Project tool window, right-click the src directory and select New | Groovy Script . IntelliJ IDEA opens the file in the editor.
  2. Type the following code:
  • Press Ctrl+Shift+F10 to run the script. Run Groovy scriptWhen you run this code, you will get the internal error: Run tool window: Groovy internal errorSo, let’s tweak the run configuration and try to solve our problem.
  • Step 3. Edit the run configuration

    Add the following code to the VM options in the run configuration dialog:

    Modify the run configuration

    1. In the Project tool window, right-click the created Groovy script file ( hello.groovy ) and select More Run/Debug | Modify Run Configuration .
    2. In the dialog that opens, let’s add the following code code to the VM options field:

    Groovy run configuration dialog

  • Click OK to save the changes. However, if you rerun the script now, you will still get the same internal error as before.
  • Step 4. Add dependencies and rerun the script

    Since you use Groovy 2.5.6 and Java 11 in the project, you need to add the extra JAXB Jars that this Groovy version comes with to the project as dependencies.

    Add JAXB dependency

    1. Press Ctrl+Alt+Shift+S to open the Project Structure dialog.
    2. In the dialog that opens, select the Modules option from the Project Settings list.
    3. From the option on the right, select the Dependencies tab.
    4. Click App welcome create new projecton the bottom of the dialog and select JARs or Directories . Project Structure dialog / Module page
    5. In the dialog that opens, locate extras-jaxb directory that the Groovy SDK comes with and add it as a dependency. Finder: extras_jaxb
    6. Click OK to save the changes. Now when you run the script, you will get the expected output in the Run tool window. Run tool window: Hello, Groovy!

    Источник

    Оцените статью