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


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

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

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

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

  • дразняще Джеймс Страхан пишет:

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

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

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

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

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

11 65

11 ответов:

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

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

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

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

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

Солнечный

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

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

удачи! Даниэль

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

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

public NewsResource(@Inject NewsService service)

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

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

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

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

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

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

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

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

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

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 адаптер, который может не функционировать должным образом с будущими выпусками точки Джерси. GWizard также предлагает RESTEasy JAX-RS модуль, который является предпочтительным.

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

плагин 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

эти примеры были все большие старты для меня, но я хотел полный стек MVC с использованием Джерси-Guice в его ядре. Я работал над улучшением этого в течение некоторого времени. На этой неделе этот стек MVC полностью развернут в Центральном репозитории Maven в качестве архетипа. Это означает, что теперь вы можете создать стек new 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 но вы можете заменить все, что вы используете.

Я нашел интересный проект для lightweight Jetty + Guice+Jackson web services:https://github.com/talis/jersey-common/

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

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

как солнечная сказала:

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