Практические советы по использованию услуги Jersey и Guice для RESTful

Из того, что я могу найти в Интернете, современное состояние интеграции Guice + Jersey застопорилось с 2008 года, когда, похоже, обе команды вышли из тупика. Суть проблемы заключается в том, что аннотации JAX-RS выполняют инъекцию полей и методов, и это не очень хорошо сочетается с инъекцией зависимостей Guice.

Несколько примеров, которые я нашел, недостаточно для выяснения:

  • Сообщение Iqbalyusuf на Джерси + Guice на Google App Engine Java страдает от большого количества шаблонов (ручное получение и вызов инжектора), Я хочу, чтобы привязка и инъекция выполнялись за кулисами через аннотации Guice.

  • Статья Джонатана Каррана Создание службы RESTful с Джерси, Гисом и JSR-250 дало мне надежду, потому что она намного более актуальна ( 2010), но не пошел дальше, чем показать, как запустить службу Джерси внутри Guice ServletModule. Тем не менее, нет примеров осуществления реальной инъекции зависимостей. Полагаю, это было для упражнения для читателя. Сообщение Curran может на самом деле быть правильным первым шагом к подключению Guice и Jersey, и поэтому я планирую начать с этого.

  • tantalizingly Джеймс Страман пишет:

    JAX-RS хорошо работает с зависимостью как, например, Spring, Guice, GuiceyFruit или JBossMC - вы может в основном выбрать тот, который вы предпочитают.

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

То, что мне не хватает, - это практические примеры и объяснения того, как объединить аннотации JAX-RS и Guice. Например:

  • Я считаю, что я не могу использовать инъекцию конструктора с любым ресурсом, так как Джерси хочет контролировать это.
  • Я не уверен, могу ли я комбинировать @Inject с @PathParam, @QueryParam и др.
  • Как использовать инъекцию в реализации MessageBodyWriter

Есть ли у кого-нибудь примеры, предпочтительно с источником, нетривиального приложения, которое объединяет Джерси и Гиза, не жертвуя тем или иным процессом? Я держусь на этой дороге, несмотря на то, что битки на списках Джерси и Гуиса заставляют меня думать, что я повторяю работу других, которые пришли передо мной.

Ответ 1

Интеграция Guice с Джерси не застопорилась. И наоборот. Благодаря Полю и его когортам за Джерси, последний релиз 1.7 содержит специальный класс JerseyServletModule для работы с сервлетами на основе Guice. Встраивание конструктора на основе Guice в ресурс JAX-RS работает! Проблема заключается в использовании аннотаций JAX-RS, таких как @QueryParam, в конструкторе ресурса JAX-RS. Вам это не нужно! Вы используете Guice для POJO-инъекций полностью, включая синглеты. Затем JAX-RS просто обледенение на торте для анализа HTTP-RESTful API, таких как URL-путь, параметры запроса, тип контента и т.д. Вам также не нужен пример "промышленной силы". И Guice, и Джерси уже прошли боевые испытания. Вам просто нужен полный рабочий пример, чтобы увидеть, как он работает. Затем вы можете экспериментировать с расширенными функциями самостоятельно. Ознакомьтесь со следующей ссылкой для полного примера, используя Guice 3.0 и Jersey 1.7, которые являются последними выпусками:
http://randomizedsort.blogspot.com/2011/05/using-guice-ified-jersey-in-embedded.html

Ответ 2

Я создал приложение для примера Guice/Jersey/Jetty/Jackson:

http://github.com/sunnygleason/j4-minimal

Если у вас есть какие-либо вопросы или предложения по улучшению например, не стесняйтесь сообщать мне через github. Цель состоит в том, чтобы это очень доступное введение в REST в стек Java.

Надеюсь, что это поможет - у нас отличный день!

-Sunny

Ответ 3

Вдохновленный образцом приложения Sunnys, я создал подобный примерный проект, который использует стандартные файлы WAR для развертывания, например. в Apache Tomcat. Проект можно найти здесь:

https://github.com/danbim/template-guice-jersey-tomcat

Удачи! Daniel

Ответ 4

Я считаю, что я не могу использовать конструктор инъекции с любым ресурсом, как Джерси хочет управлять этим

Вы не можете использовать инъекцию конструктора guice, потому что создание ресурса управляется трикотажем. В этом случае вы можете использовать аннотацию jersey @Inject перед параметром конструктора, который вы хотите ввести:

public NewsResource(@Inject NewsService service)

Ответ 5

У меня возникали аналогичные проблемы, изначально пытавшиеся использовать Guice для инъекций конструктора на аннотированных классах в Джерси, но в итоге они работали, хотя и с довольно тривиальным приложением.

Я выполнил следующие инструкции: jersey-guice javadoc

Трюк в моем случае состоял в том, что мне нужно было удалить стандартную конфигурацию Jersey из моего web.xml(например, Jersey ServletContainer) и сохранить только прослушиватель Guice и фильтр Guice. Как только я сделал, что Guice был вызван для создания аннотированного объекта JAX-RS, и Джерси вводил мои аннотированные методы JAX-RS (например, @GET и т.д.), Как и ожидалось.

Ответ 6

Хотя пример Sunny Gleason замечательный, он немного устарел.

Итак, после многого изо дня в день, пытаясь заставить друг друга играть в Guice и Jersey, я создал следующий примерный проект, чтобы вы начали:

https://github.com/MaliciousMustard/gradle-guice-jersey-jetty

В этом проекте используются следующие технологии:

  • Guice for DI
  • Джерси для API RESTful
  • Джексон для отображения POJO на JSON
  • Jetty для веб-сервера
  • Gradle

Я думаю, самое главное, что вам не нужно явно указывать каждый новый класс ресурсов, который вы добавляете. Пока вы добавляете их в сканируемый пакет (смотрите malicious.mustard.modules.JerseyModule), они будут найдены автоматически!

Ответ 7

GWizard включает в себя модуль, который дает вам готовые интеграцию между Jersey2 и Guice. Здесь приведен пример полной службы JAX-RS:

public class Main {
    @Path("/hello")
    public static class HelloResource {
        @GET
        public String hello() {
            return "hello, world";
        }
    }

    public static class MyModule extends AbstractModule {
        @Override
        protected void configure() {
            bind(HelloResource.class);
        }
    }

    public static void main(String[] args) throws Exception {
        Guice.createInjector(new MyModule(), new JerseyModule()).getInstance(Run.class).start();
    }
}

Обратите внимание, что это основано на Squarespace jersey2-guice adapter, который может не работать должным образом с будущими версиями выпусков Джерси. GWizard также предлагает модуль RESTEasy JAX-RS, который является предпочтительным.

Вот запись в блоге об этом, которая может помочь: http://blorn.com/post/107397841765/guice-and-jersey-2-the-easy-way

Ответ 8

Эти примеры были для меня отличным стартом, но я хотел получить полный стек MVC с использованием Jersey-Guice. Я работал над уточнением этого на некоторое время. На этой неделе этот стек MVC полностью развернут в хранилище Maven Central как архетип. Это означает, что теперь вы можете создать новый стек Jersey-Guice с одной командой Maven:

mvn archetype:generate \
    -DarchetypeGroupId=org.duelengine \
    -DarchetypeArtifactId=duel-mvc-archetype \
    -DarchetypeVersion=0.2.1

Это автоматически генерирует ваш собственный проект с указанным именем пакета, поэтому вам не нужно вручную редактировать проект шаблона.

Подробнее см. проект Readme.md: https://bitbucket.org/mckamey/duel-mvc

Подробности о двухсторонних представлениях (клиентский шаблон и виды на стороне сервера), которые я использую здесь: https://bitbucket.org/mckamey/duel, но вы может заменить все, что вы используете.