2010-04-19 11 views
65

Z tego, co mogę znaleźć online, stan wiedzy na temat integracji Guice + Jersey ustabilizował się od 2008 roku, kiedy wydaje się, że obie drużyny osiągnęły impas. Sedno problemu polega na tym, że adnotacje JAX-RS wykonują iniekcje polowe i metody, co nie jest miłe z wtryskiem zależności od Guice.Praktyczne porady dotyczące używania Jersey i Guice do usług RESTful

Kilka przykładów, które znalazłem nie idą wystarczająco daleko, aby wyjaśnić:

  • po Iqbalyusuf w sprawie Jersey + Guice on Google App Engine Java cierpi z powodu wielu boilerplate (ręcznie i wywołując coraz wtryskiwacz). Chcę wiązać i wtryskiwać się za kulisami za pomocą adnotacji Guice.

  • Artykuł Jonathan Curran o numerze Creating a RESTful service with Jersey, Guice, and JSR-250 dał mi nadzieję, ponieważ jest dużo bardziej aktualny (2010), ale poszedł dalej niż pokazanie, jak uruchomić usługę Jersey w Guice ServletModule. Jednak nie ma przykładów wykonania żadnego zastrzyku prawdziwej zależności. Przypuszczam, że zostało to jako ćwiczenie dla czytelnika. Stanowisko Currana może być właściwie właściwym pierwszym krokiem w kierunku połączenia Guice i Jersey, więc planuję zacząć od tego.

  • tantalizingly James Strachan writes:

    JAX-RS działa dobrze z ram iniekcji zależność takich jak Spring, Guice, GuiceyFruit lub JBossMC - ty można wybrać w zależności od tego w zasadzie jeden ty wolą.

    Ale nie widzę dowodów, które są prawdziwe z punktu widzenia praktyka.

Brakuje mi praktycznych przykładów i wyjaśnień, jak łączyć adnotacje JAX-RS i Guice. Na przykład:

  • wierzę, nie mogę użyć konstruktora wtrysku z dowolnego zasobu jako Jersey chce kontrolować ten
  • jestem pewien, czy mogę połączyć @Inject z @PathParam, @QueryParam, et al.
  • Jak korzystać zastrzyk w realizacji MessageBodyWriter

Czy ktoś ma przykłady, najlepiej ze źródła, z niebanalną aplikacji, która łączy Jersey i Guice bez poświęcania jednego lub drugiego w tym procesie? Nieustannie śledzę tę drogę, ale fragmenty na listach Jersey i Guice sprawiają, że myślę, że powtarzam pracę innych, którzy byli przede mną.

+1

Nie mogę wymyślić żadnego zastosowania do połączenia adnotacji "@Inject z @PathParam, @QueryParam". Czy możesz podać jeden? – Jonas

Odpowiedz

53

Integracja Guice z Jersey nie uległa stagnacji. Przeciwieństwo jest prawdą. Dzięki Paulowi i jego kohortom za Jersey, najnowsze wydanie 1.7 zawiera specjalną klasę JerseyServletModule do pracy z serwletami opartymi na Guice. Wstrzykiwanie konstruktora oparte na guice do zasobu JAX-RS działa! Problem polega na użyciu adnotacji JAX-RS, takich jak @QueryParam w konstruktorze zasobu JAX-RS. Nie potrzebujesz tego! Używasz Guice do wstrzykiwania POJO do końca włącznie z singletonami. Następnie JAX-RS jest tylko wisienką na torcie do analizowania opartych na HTTP API RESTful takich jak ścieżka URL, parametry zapytania, typ zawartości i itp. Nie potrzebujesz też przykładu "industrial strength". Zarówno Guice, jak i Jersey są już testowane w walce. Potrzebujesz tylko pełnego przykładu, aby zobaczyć, jak to działa. Następnie możesz samodzielnie eksperymentować z zaawansowanymi funkcjami. Sprawdź poniższy link, aby uzyskać pełną przykład przy użyciu Guice 3.0 i Jersey 1.7, które są najnowsze wersje:
http://randomizedsort.blogspot.com/2011/05/using-guice-ified-jersey-in-embedded.html

+1

+1 wyszukiwanie w Google dla jersey + guice zawiera wiele przestarzałych postów, więc trudno jest zauważyć, że stan jest naprawdę dobry od teraz. To naprawdę dobra wiadomość! – Waldheinz

+0

zmiana akceptowanej odpowiedzi na tę. @ sunny-gleason's jest nadal dobry, ale ten jest najgorszym przykładem wstrzyknięcia konstruktora zarządzanego przez Guice'a. Podziękowania @Nehc – toolbear

+0

Zobacz http://jersey.java.net/nonav/apidocs/1.11/contribs/jersey-guice/com/sun/jersey/guice/spi/container/servlet/package-summary.html, aby uzyskać przegląd co trafia do web.xml. – Gili

3

wierzę, nie mogę użyć konstruktora zastrzyk z dowolnego zasobu jako Jersey chce kontrolować ten

Nie można użyć konstruktora wtrysku Guice, ponieważ stworzenie zasobu zarządza Jersey.W tym przypadku można użyć Jersey @Inject adnotacji przed parametrem konstruktora chcesz się wstrzykuje:

public NewsResource(@Inject NewsService service) 
21

stworzyłem przykładową aplikację Guice/Jersey/Jetty/Jackson tutaj:

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

Jeśli masz jakieś pytania lub sugestie, jak poprawić przykład , proszę wysłać mi wiadomość przez github. Celem jest uczynienie bardzo przystępnym wprowadzeniem do REST na stosie Java.

Mam nadzieję, że to pomoże - życzę miłego dnia!

-Sunny

+2

Ten przykład był świetny i dostał mnie w 99%, ale z tego, co mogę powiedzieć, nie kończy się na użyciu jacksona. Odkryjesz to, jeśli spróbujesz użyć adnotacji jackson do robienia rzeczy takich jak ukrywanie pól (@JsonIgnore). Aby zamknąć pętlę, musisz zmienić "serve (" * "). With (GuiceContainer.class); ' do czegoś takiego jak "serve (" * "). with (GuiceContainer.class, ImmutableMap.of (JSONConfiguration.FEATURE_POJO_MAPPING," true ") '. Możesz także usunąć wiązania JacksonJsonProvider, ponieważ nie wydają się one być @ Inject- – Bill

+0

Dziękuję za opublikowanie przykładowego kodu Czy jest możliwe wyeliminowanie potrzeby klasy EmptyServlet? Być może za pomocą jakiejś nowszej funkcjonalności w Jersey lub Guice (lub jersey-guice)? :) –

+0

Znalazłem, że nie potrzebowałem 'EmptyServlet' przy uruchomieniu przykładu wewnątrz Jersey Grizzly 2 TestContainer,' ServletContextListener' i 'Filter' wystarczyły – hertzsprung

3

miałem podobne problemy początkowo próbuje użyć Guice zrobić zastrzyk konstruktora na moich zajęciach Jersey uwagami, ale w końcu dostał to działa, choć z dość trywialny aplikacji.

I przestrzegać instrukcji tutaj: jersey-guice javadoc

Sztuką w moim przypadku było to, że musiałem usunąć standardową konfigurację Jersey z moim web.xml (jak Jersey ServletContainer) i zachować tylko słuchacza Guice i filtr Guice . Kiedy już to zrobiłem Guice został wezwany do stworzenia mojego obiektu z adnotacjami JAX-RS, a Jersey wstrzykiwał moje metody z adnotacjami JAX-RS (jak np. @GET itp.) Zgodnie z oczekiwaniami.

+0

powyższy link jest zepsuty. czy ktoś ma zaktualizowane referencje? – tatmanblue

9

Zainspirowany przykładową aplikacją Sunnys Stworzyłem podobny przykładowy projekt, który wykorzystuje standardowe pliki WAR do wdrożenia, np. w Apache Tomcat. Można znaleźć projekt tutaj:

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

zabawy! Daniel

+0

Daniel dzięki za ten przykład naprawdę mi pomógł. Mam menage, aby go uruchomić, ale kiedy chcę zwrócić nieco skomplikowany obiekt z listą jako pole lista nie jest tam w JSON. Czy możesz rzucić trochę światła na to? –

1

Te przykłady były wspaniałe zaczyna dla mnie, ale chciałem pełną MVC stos używając Jersey Guice w jego rdzeniu. Od jakiegoś czasu pracuję nad udoskonaleniem tego. Od tego tygodnia ten stos MVC jest w pełni wdrożony w repozytorium Maven Central jako archetyp. Oznacza to, że można teraz tworzyć nowe Jersey Guice stos z jednego polecenia Maven:

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

to automatycznie generuje swój własny projekt z wami określonego pakietu nazewnictwa, dzięki czemu nie trzeba ręcznie edytować projekt szablonu.

Zobacz projekt Readme.md więcej szczegółów: https://bitbucket.org/mckamey/duel-mvc

Szczegóły na widokach bocznych (dual-client-side szablonów & widoki server-side) używam tutaj: https://bitbucket.org/mckamey/duel ale można zastąpić cokolwiek używasz.

2

GWizard zawiera moduł zapewnia natychmiastową integrację między Jersey2 i Guice. Oto przykład kompletnej usługi 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(); 
    } 
} 

pamiętać, że jest oparta na Squarespace jersey2-guice adapter, która może nie działać poprawnie z przyszłymi wersjami punktowych Jersey. GWizard oferuje również moduł RESTEasy JAX-RS, który jest preferowany.

Oto notka o tym, że może pomóc: http://blorn.com/post/107397841765/guice-and-jersey-2-the-easy-way

3

Chociaż przykład Sunny Gleason jest wielkie, to jest nieco przestarzały teraz.

Tak, po zmaga się wiele dzisiaj próbuje zrobić Guice i Jersey grać ładny ze sobą, stworzyłem następujący przykładowy projekt na początek:

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

Projekt ten wykorzystuje następujące technologie :

  1. Guice dla DI
  2. Jersey do relaksującego API
  3. Jackson dla POJO do JSON mapowania
  4. Jetty do serwera WWW
  5. Gradle

Chyba najważniejszą rzeczą jest to, że nie trzeba jawnie określić każdą nową klasę zasobów dodajesz. Dopóki dodajesz je do pakietu, który jest skanowany (spójrz na malicious.mustard.modules.JerseyModule), zostaną one znalezione automatycznie!

Powiązane problemy