Практические советы по использованию Jersey и Guice для сервиса RESTful - PullRequest
65 голосов
/ 19 апреля 2010

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

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

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

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

  • мучительно Джеймс Страхан пишет :

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

    Но я не вижу доказательств того, что это правда с точки зрения практикующего.

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

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

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

Ответы [ 11 ]

53 голосов
/ 30 мая 2011

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

21 голосов
/ 21 июля 2010

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

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

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

Надеюсь, это поможет - хорошего дня!

-Sunny

9 голосов
/ 20 декабря 2010

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

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

Веселись! Daniel

3 голосов
/ 29 февраля 2016

Хотя пример Санни Глисона великолепен, он немного устарел.

Итак, сегодня, изо всех сил пытаясь заставить Гиса и Джерси хорошо играть друг с другом, я создал для вас следующий пример проекта:

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

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

  1. Guice для DI
  2. Джерси для RESTful API
  3. Джексон для отображения POJO в JSON
  4. Причал для веб-сервера
  5. Gradle

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

3 голосов
/ 19 ноября 2010

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

Я следовал инструкциям здесь: Джерси-Джавадок

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

3 голосов
/ 21 апреля 2010

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

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

public NewsResource(@Inject NewsService service)
2 голосов
/ 07 января 2015

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();
    }
}

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

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

1 голос
/ 08 марта 2012

Плагин Jersey-Guice Javadoc дает довольно хорошее описание:

http://jersey.java.net/nonav/apidocs/1.1.5/contribs/jersey-guice/com/sun/jersey/guice/spi/container/servlet/package-summary.html

1 голос
/ 23 июля 2011

Все эти примеры были отличным началом для меня, но я хотел получить полный стек 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, но вы можете заменить на все, что используете.

0 голосов
/ 25 сентября 2018

Я создал пример приложения Guice 4.2, Jetty 9.4 и Jersey 2.7:

https://github.com/bnsd55/jetty-jersey-guice-starter-kit

Как сказала Санни:

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

...