Фреймворки Restful Java WEB MVC

Приложение, которое я разрабатываю, будет «отзывчивым», будет поддерживать асинхронную связь и передавать много JSON туда и обратно.

Мне нужна веб-платформа Java MVC, поддерживающая

1) Минимальное количество BLOAT и "закулисная магия". В любом фреймворке всегда есть компромисс между функциональностью фреймворка и сложностью. Но когда приходит время, когда я сталкиваюсь с проблемой и мне приходится «бороться с рамками» (а это время всегда приходит), я хочу, чтобы это была честная борьба. Сведение к минимуму размера рамки увеличивает вероятность честного боя.

2) Встроенная поддержка RESTFUL. Т.е. маршрутизация html-глаголов и согласование содержимого.

3) Прямая поддержка обработки JSON. Использование произвольного процессора json по моему выбору, то есть jackson или gson и т. Д.

4) Прямая поддержка настойчивости, например JPA и т. Д.

5) Некоторый набор систем шаблонов, например freemarker, скорость и т. д.

6) Встроенная схема безопасности аутентификации / авторизации с поддержкой безопасности «на основе ролей» ИЛИ Простая интеграция с безопасностью Spring

Все вышеперечисленное должно быть интегрировано в фреймворк. Не в каком-то стороннем пользовательском модуле, который исчезает с появлением новой версии фреймворка.

Я сел на день, поэкспериментировал и нашел следующих кандидатов

Spring MVC 3

1) Чтобы запустить пресловутый пример «Hello World» в Spring MVC 3, мне потребовались следующие jar-файлы:

  • org.springframework.beans-3.1.0.RELEASE.jar
  • org.springframework.expression-3.1.0.RELEASE.jar
  • org.springframework.asm-3.1.0.RELEASE.jar
  • org.springframework.context-3.1.0.RELEASE.jar
  • org.springframework.core-3.1.0.RELEASE.jar
  • org.springframework.web-3.1.0.RELEASE.jar
  • org.springframework.web.servlet-3.1.0.RELEASE.jar

И, наконец, некоторые определения в файле xml, "dispatcher-servlet.xml". Я не знаю, объясняется ли это BLOAT или слишком большой закулисной магией. Но это не дает мне теплого и нечеткого ощущения того, что я кое-что контролирую.

2) Spring 3 поддерживает это и из примеры я видел, это не выглядит слишком противно

3) Поддерживается, но из ссылки в (2) кажется, что обработка json ограничена использованием библиотеки Джексона. По крайней мере, если вы хотите использовать магические аннотации для согласования содержимого.

Цитировать:

«Под обложками Spring MVC делегирует HttpMessageConverter для выполнения сериализации. В этом случае Spring MVC вызывает MappingJacksonHttpMessageConverter, построенный на процессоре Jackson JSON. Эта реализация включается автоматически при использовании конфигурации на основе аннотаций mvc: элемент с Джексоном, присутствующим в вашем пути к классам "

Для меня это немного предупредительный сигнал. Я хотел бы иметь четкий программный контроль над тем, какой процессор JSON я использую. Может, мне что-то здесь не хватает. В моей книге это квалифицируется как нежелательная "закулисная магия"

4) Ага

5) Ага

6) Да

Play Framework

1) Версия 1.2 у меня на диске весила 88,5 МБ. Не запускается в контейнере сервлетов, поэтому получить пример hello world и запустить его было проще простого по сравнению с spring, где даже выяснение, какие jar-файлы мне нужны, было окутано секретом. Очевидно, что много всего происходит за кулисами игры. Думаю, все, на что я могу надеяться, это то, что он не сделает больше, чем должен. И что архитектура вменяема. Но когда мне когда-нибудь придется сражаться с фреймворком, умру ли я по прибытии? Кто знает...

2) Ага, и это элегантно. Пальцы вверх.

3) Да, но под прикрытием использует gson. Опять же, почему я не могу управлять этим программно? К счастью, в gson можно передать произвольный сериализатор, чтобы переопределить значение по умолчанию. И я думаю, что этот параметр соответствует второму параметру собственной функции play renderJSON (). Так что игра проходит с поднятой половиной большого пальца.

4) Ага. Имеет модуль JPA

5) Ага. Использует заводной. Меня устраивает.

6) Это должно быть возможно за счет объединения модулей защелки и засова. Не знаю, насколько хорошо он противостоит пружинной безопасности. Я не вижу встроенной поддержки шифрования паролей и тому подобного. И понятия не имею, насколько сложно (если даже возможно) будет интегрироваться с Spring Security. Не знаю, удобно ли мне развертывать конфиденциальные данные и полагаться на игру! рамки для безопасности. Наверное, придется что-то надстроить.

Рестлет

Возможно, это своеобразный кандидат, так как он предназначен для использования в «беспокойных веб-сервисах». Но для моих пунктов (1) - (6) и моего типа приложения, в котором большая часть взаимодействия с пользователем является асинхронным, это кажется подходящим вариантом. Я могу запускать его на статических ресурсах или динамически сгенерированном контенте и выдавать любой тип контента.

1) Restlet 1.1.1 составляет около 54 МБ. Посмотрел пример hello world. Мне понравилось отсутствие файлов XML. И так же, как и в игре, у него есть собственный сервер (коннекторы причалов). Пример hello world выглядел очень простым и понятным.

2) Да, и подход очень "программный"

3) Да, но кажется только через модуль расширения jackson. Учитывая программный характер этого фреймворка, вполне вероятно, что есть и другие варианты, но я ничего не нашел в документации или на форумах групп пользователей.

4) Называет себя «агностиком настойчивости». Хорошо, я думаю. Но я хочу упорствовать и не изобретать сантехнику самостоятельно. Или, по крайней мере, я хочу немного показать, как это МОЖЕТ быть сделано с некоторыми усилиями. Есть сторонний модуль jpa, но он построен на рестлете 1.0. У Restlet есть пружинный модуль, так что, возможно, я смогу интегрироваться с материалом Spring Persistance ...

5) Да, есть расширение freemarker

6) Имеет для этого родную схему. На первый взгляд, не такой «богатый», как пружинная безопасность. Опять же, может я смогу интегрироваться?

РЕЗЮМЕ

Spring MVC 3: поддерживает все требования, возможно, за исключением (1). Единственное, что меня беспокоит, так это то, что это кажется сложным, и у меня возникает смутное неприятное ощущение, что я не контролирую ситуацию. Я действительно не хочу «увязнуть» в фреймворке позже, когда мое приложение будет расти.

Игра: очень приятные впечатления. Даже весело. Если бы только схема безопасности была более продвинутой, или если бы я мог хотя бы интегрироваться с Spring Security (и найти документацию о том, как это сделать)

Рестлет: по какой-то причине мне понравился этот фреймворк. Программный подход вызывает чувство контроля. Но если я не могу проявить настойчивость каким-то легким способом, то это не годится. Не могу понять, почему это не встроено. Разве это не всем нужно?

  • Что говорят люди, которые использовали любой из вышеперечисленных фреймворков?
  • Мои наблюдения точны?
  • Я упустил рамки, которые должны быть здесь?
  • Альтернативы?

person user1119651    schedule 28.12.2011    source источник
comment
Если вы не ограничены Java, но также рассматриваете Groovy, вы можете взглянуть на Grails   -  person Robin    schedule 04.01.2012


Ответы (3)


сравнение Spring и Play сейчас сильно устарело, поскольку Play 2.0 был переписан на Scala и стал лучше почти во всех отношениях.

Проверьте это: http://www.playframework.org/

person fracca    schedule 23.04.2012

Я могу говорить здесь только о весне.

Когда в прошлом году мне пришлось использовать Spring для проекта, не относящегося к REST, я съежился. У меня не только было всего несколько дней, чтобы постичь основы, мне не нравилась вся эта «магия», и я не был знаком с принципами IoC.

Но это выросло на мне. Это очень быстро приросло и ко мне. С тех пор я использовал Spring для всех видов веб-проектов, включая тот, который предоставляет RESTful API.

С моей точки зрения, сильными сторонами Spring являются: а) он на самом деле довольно легкий и обычно не мешает вам после того, как вы все настроили, б) МНОЖЕСТВО примеров и отличное сообщество для поддержки, в) выполнение REST - это несложно, как только вы правильно настроите свою конфигурацию, г) дизайн API, который заставляет богов плакать от радости, и д) IoC меняет жизнь.

Говоря о вашей озабоченности по поводу раздувания ... Я использовал другие веб-фреймворки для Java, и Spring наименее раздутый из всех IMO. Это может выглядеть на много, но на самом деле это не так. По сравнению со Struts и Seam (о которых мне до сих пор снятся кошмары) Spring противоположна раздуванию. Более того, IoC позволит вам обойтись без необходимости писать тонны шаблонов, что также сделает ваше приложение менее громоздким.

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

Подводя итог, я бы высоко оценил Spring.

person The Awnry Bear    schedule 03.01.2012

Два, которые я могу порекомендовать, - это RESTlet 2.x, который я использую в каждом проекте. И RESTEasy, который я собираюсь использовать в предстоящем проекте.

Что мне нравится в RESTlet, так это то, что вся маршрутизация находится в одном месте. Это очень многофункциональный.

Что мне не нравится в RESTEasy, и я не рассматривал все это так глубоко, так это то, что в аннотациях вся маршрутизация разбросана по базе кода для каждого метода, что может быть множеством классов. Отсутствие их всех в одном месте затруднит ремонтопригодность.

Почему я все еще рассматриваю RESTEasy, наличие нескольких GET методов для каждого класса может сократить resource взрыв класса, который может произойти в RESTlet.

Оба они совместимы с JAX-RS, если это важно, и любой из них требует значительных затрат времени и функциональности.

Что касается шаблонов, используйте StringTemplate, держитесь подальше от таких вещей, как FreeMarker, они просто создают массу проблем с ремонтопригодностью. .

person Community    schedule 03.01.2012