Cтоит ли использовать Play!

Play! – хорошо раскрученный стек для быстрой  разработки java web приложений.  Включает в себя web layer,шаблоны, локализцию, jpa, разные утилиты для работы с почтой, шедулер для джоб, а также большое количество плагинов. Такой мини J2EE стек, позволяющий писать в PHP стиле =) Может запускаться как и standalone приложение, так и паковаться как war и запускаться в сервлет-контейнере. Основной особенностью является возможность видеть изменения в браузере без редеплоя. Для разработчиков, которые точно не уверены, что делают их код – это очень удобно. Можно нажать F5 и сразу посмотреть =)
Поделюсь некоторыми своими субъективными соображениями.

Минусы:
1) Отсутствие стадартной maven структуры проекта. Вместо этого dependencies.yml файл, где надо указывать artifact-Id, group-id, version. После этого командой play dependencies –sync нужные зависимости скачиваются в папку lib. Очень неудобно. Вызов этой команды удаляет .svn файлы из папки lib =) Play использует maven, чтобы ресолвить зависимости, но другие возможности maven недоступны.

2) Очень удобно создавать war файл из проекта, командой play war. Жаль, что она не работает, если в проекте есть .svn файлы. Соответственно, надо либо их удалять, либо делать svn import, который импортирует только закомиченный код.

3) Если же есть желание запускать play как standalone, готовитесь к проблемам на проде. По ссылке stackoverflow я описал проблему, с которой столкнулся.

4) Отсутствие нормальной интеграции с DI, а также какого-либо решения из коробки. Я использовал Google Guice. Как заинжектить бины в контроллер, методы которого обязаны быть статическими ?  Вот так-  requestStaticInjection(SipController.class); Не всегда удобно. Если же бин обращается к JPA из конструтора при использовании Guice, то он не сможет обращаться к JPA, придется открывать сессию руками. play.Play.plugin(JPAPlugin.class).startTx(true);

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

6) Чтобы получить IP адрес запроса, надо написать - Http.Request.current().remoteAddress. Мне не очень нравится такой стиль. Все состояния хранятся в каких-то ThreadLocal статических переменных.

7) Многие фреймворки интегрируются посредством создания listener или servlet в web.xml. Но здесь нет web.xml. Я хотел использовать hessian, но его никак не подключить. Пришлось использовать REST.

8) Отсутствие таких мега-фич, как JMX мониторинг из коробки. Например в Spring есть ManagedResource аннотации, которые позволяют экспозить бин через JMX. Пришлось реализовать самому, в рантейме регистрируя DynamicMBean.

9) В контроллерах нельзя сделать forward, только redirect. Если из одного контроллера надо вызвать другой, надо редиректить ему запрос. Пример с контроллерами:
public static void index() {
  doAction();
}
public static void doAction() {}
Если метод doAction  объявлен как public внутри этого же контроллера, то произойдет редирект! если private, то просто произойдет вызов этого метода. Если надо вызвать doAction из другого контроллера, то произойдет редирект, возможности forward сделать нету. И на доках Play! написано, что это удобнее.

10) Вся сессия хранится на клиенте в кукисах. поэтому размер её ограничен, можно конечно самому организовать сессию.  Но насколько секьюрен такой поход?  Например, когда пользователь логиниться, кладем его email в клиентские кукисы, предварительно шифруя.  Когда клиент придет с этими же кукисами, кукисы будут дешифрованы.  

11) Если заглянуть внутрь play, то можно увидеть код, не внушающий доверя. Вместо метода return, пробрасывается  исключение. Который потом обрабаывается где-то уровнем выше. Т.е метод можно вернуть разные типы исключений =)
Класс ActionInvoker
                // OK, re-throw the original action result
                if (actionResult != null) {
                    throw actionResult;
                }


Плюсы:

1) Очень удобная система шаблоном.

2) Много плагинов, правда единственный, который я хотел использовать greenscript, работал с багом, иногда возвращая 200, вместо 304.

3) Не нужно деплоить изменения. На мой взгляд, довольно сомнительно, если уж так хочется нажимать F5, используйте JRebel.


Вывод:

- Удобен для начинающих разработчиков и очень прост в использовании.
- Ставит в определенные рамки, выйти за которые не всегда удается.
- Заставляет писать код в непривычном стиле.
- Код фрейморвка не внушает доверя.



Комментариев нет:

Отправить комментарий