Integracja Jersey z Guice

0

Próbował ktoś z was łączyć Jersey i dependency injection od Guice?

Mam podstawy oskarżyć siebie o ułomność, bo próbuje to zrobić od 10 rano i coś nie idzie. Co robiłem? Nawet nie chce mi się wypisywać, po wpisaniu w google fraz w stylu: "jersey guice integration" "guice servlet example" "guice with jersey" "guice hk2 bridge" itd. próbowałem po prostu każde możliwe rozwiązanie przepisując, kopiując, zmieniając - ciągle NullPointerException.

Generalnie chodzi o połączenie Embedded Jetty + Jersey + Guice.

Tak, prosze o gotowca. Pokażcie mi live-example że to się da bo oficjalnie w to nie wierzę

Dzięki ;)

0

Możesz spróbować zrobić to korzystając z właściwości, że prawidłowy endpoint Jersey (JAX-RS) to:

  • stateless session bean
  • bezstanowy singleton

W JAX-RS 2.0 konfigurowałem Springa za pomocą adnotacji:
https://github.com/margor90comp/Jersey-2.22.1-JAX-RS-2.0-integrated-with-Spring-Framework-short-and-concise-example/blob/master/src/main/java/pl/margor/rest/app/RestApp.java

Cała różnica polega na tym, że singletona musisz pobrać z kontekstu guice, a nie spring:


@ApplicationPath("/rest")
public class RestApp extends Application {

    @Context
    protected ServletContext servletContext;

    @Override
    public Set<Object> getSingletons() {
        WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
        AutowireCapableBeanFactory bf = ctx.getAutowireCapableBeanFactory();
        Set set = new HashSet();
        set.add(bf.getBean("personRest"));
        return set;
    }

}
0

@ShermanMg nie próbowałem dokładnie tego projektu, spróbuje jak będę w domu (ale lwią część setup'u robiłem identyko)

w ogóle troche mnie zastanawia po co ta cała "integracja", przecież jersey słuzy do wystawiania restów, guice do DI. Ok - Jersey ma HK2 domyślnie, tylko czemu nie mógłbym po prostu do klas które bede tworzyl uzywac guice, a jersey niech sobie uzywa HK2 "pod spodem".
Nie bardzo rozumiem po co to integrować, po co jersey ma wiedziec ze uzywam guice. Po co ten cały GuiceFilter.. po co requesty maja przechodzic przez filtr biblioteki od DI? :)

0

Bo pewnie będziesz chciał wstrzykiwać coś w resourcy jersey'a, a te tworzone są pod spodem właśnie przez jerseya. Musisz więc poinformować jersey'a, aby wykorzystał guica do stworzenia tych endpointów.

0
 
 compile 'com.google.inject:guice:4.0'
    compile 'com.google.inject.extensions:guice-servlet:4.0'
    compile 'javax.servlet:javax.servlet-api:3.0.1'
    compile 'com.sun.jersey:jersey-core:1.19'
    compile 'com.sun.jersey:jersey-json:1.19'
    compile 'com.sun.jersey:jersey-servlet:1.19'
    compile 'com.sun.jersey:jersey-server:1.19'
    compile 'com.sun.jersey.contribs:jersey-guice:1.19'
 
    @Override
    protected void configureServlets() {
  
        ResourceConfig rc = new PackagesResourceConfig("pakiet z resources");
        for ( Class<?> resource : rc.getClasses() ) {
            bind(resource);
        }

        serve("/*").with(GuiceContainer.class);
    }
0

@ShermanMg @margor90 @airborn @Narror Najlepsze wykrzesane rozwiązanie na tą chwile to: (działa to na embedded jetty)
Zarejestrowany GuiceServlet (tylko coś mi śmierdzi, bo jak go zakomentuje to działa identycznie jak opisze niżej, tak jakby dalej to szło przez HK2 nie guice)

 
contextHandler.addFilter(GuiceFilter.class, "/*", EnumSet.allOf(DispatcherType.class));

ResourceConfig dla Jerseya

 
@ApplicationPath("/")
public class JerseyApplication extends ResourceConfig {

    @Inject
    public JerseyApplication(ServiceLocator serviceLocator) {
        packages(true, "com.maciej");

        GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);

        GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
        guiceBridge.bridgeGuiceInjector(Guice.createInjector(new GuiceDIModule()));
    }
}

GuiceDIModule (moduł Guice'a)

 
public class GuiceDIModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(MessageSender.class)
                .to(FacebookMessageSender.class);
    }
}

Jakis Resource gdzie używam MessageSender i jego implementacji FacebookMessageSender (prosty interfejs i klasa dla przykładu, bez adnotacji, bez niczego ciekawego)

@Path("/")
public class TestResource {
    private MessageSender messageSender;

    @Inject
    public TestResource(MessageSender messageSender) {
        this.messageSender = messageSender;
    }

    @GET
    public Response home() {
        return Response.ok().entity(messageSender.send("Hello my friend, how are you?")).build();
    }
}

I co ciekawe rest zwraca mi napis, ale pod spodem leci stacktrace:

kwi 12, 2016 10:50:23 PM org.glassfish.jersey.internal.Errors logErrors
WARNING: The following warnings have been detected: WARNING: HK2 service reification failed for [com.maciej.resources.TestResource] with an exception:
MultiException stack 1 of 2
java.lang.NoSuchMethodException: Could not find a suitable constructor in com.maciej.resources.TestResource class.
	at org.glassfish.jersey.internal.inject.JerseyClassAnalyzer.getConstructor(JerseyClassAnalyzer.java:192)
	at org.jvnet.hk2.internal.Utilities.getConstructor(Utilities.java:178)
	at org.jvnet.hk2.internal.ClazzCreator.initialize(ClazzCreator.java:128)
	at org.jvnet.hk2.internal.ClazzCreator.initialize(ClazzCreator.java:179)
	at org.jvnet.hk2.internal.SystemDescriptor.internalReify(SystemDescriptor.java:723)
	at org.jvnet.hk2.internal.SystemDescriptor.reify(SystemDescriptor.java:678)
	at org.jvnet.hk2.internal.ServiceLocatorImpl.reifyDescriptor(ServiceLocatorImpl.java:458)
	at org.jvnet.hk2.internal.ServiceLocatorImpl.narrow(ServiceLocatorImpl.java:2205)
	at org.jvnet.hk2.internal.ServiceLocatorImpl.igdCacheCompute(ServiceLocatorImpl.java:1150)
	at org.jvnet.hk2.internal.ServiceLocatorImpl.access$400(ServiceLocatorImpl.java:122)
	at org.jvnet.hk2.internal.ServiceLocatorImpl$8.compute(ServiceLocatorImpl.java:1144)
	at org.jvnet.hk2.internal.ServiceLocatorImpl$8.compute(ServiceLocatorImpl.java:1141)
	at org.glassfish.hk2.utilities.cache.internal.WeakCARCacheImpl.compute(WeakCARCacheImpl.java:116)
	at org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetDescriptor(ServiceLocatorImpl.java:1215)
	at org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:762)
	at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:704)
	at org.glassfish.jersey.internal.inject.Injections.getOrCreate(Injections.java:172)
	at org.glassfish.jersey.server.model.MethodHandler$ClassBasedMethodHandler.getInstance(MethodHandler.java:284)
	at org.glassfish.jersey.server.internal.routing.PushMethodHandlerRouter.apply(PushMethodHandlerRouter.java:74)
	at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:109)
	at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112)
	at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112)
	at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112)
	at org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:92)
	at org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:61)
	at org.glassfish.jersey.process.internal.Stages.process(Stages.java:197)
	at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:318)
	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
	at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
	at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)
	at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)
	at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473)
	at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427)
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388)
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341)
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:845)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1689)
	at com.google.inject.servlet.DefaultFilterPipeline.dispatch(DefaultFilterPipeline.java:46)
	at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:133)
	at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:130)
	at com.google.inject.servlet.GuiceFilter$Context.call(GuiceFilter.java:203)
	at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:130)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1676)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1174)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1106)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
	at org.eclipse.jetty.server.Server.handle(Server.java:518)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:314)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:253)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
	at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93)
	at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:246)
	at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:156)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)
	at java.lang.Thread.run(Thread.java:745)
MultiException stack 2 of 2
java.lang.IllegalArgumentException: Errors were discovered while reifying SystemDescriptor(
	implementation=com.maciej.resources.TestResource
	contracts={com.maciej.resources.TestResource}
	scope=org.glassfish.jersey.process.internal.RequestScoped
	qualifiers={}
	descriptorType=CLASS
	descriptorVisibility=NORMAL
	metadata=
	rank=0
	loader=null
	proxiable=null
	proxyForSameScope=null
	analysisName=null
	id=148
	locatorId=0
	identityHashCode=228636191
	reified=false)
	at org.jvnet.hk2.internal.SystemDescriptor.reify(SystemDescriptor.java:689)
	at org.jvnet.hk2.internal.ServiceLocatorImpl.reifyDescriptor(ServiceLocatorImpl.java:458)
	at org.jvnet.hk2.internal.ServiceLocatorImpl.narrow(ServiceLocatorImpl.java:2205)
	at org.jvnet.hk2.internal.ServiceLocatorImpl.igdCacheCompute(ServiceLocatorImpl.java:1150)
	at org.jvnet.hk2.internal.ServiceLocatorImpl.access$400(ServiceLocatorImpl.java:122)
	at org.jvnet.hk2.internal.ServiceLocatorImpl$8.compute(ServiceLocatorImpl.java:1144)
	at org.jvnet.hk2.internal.ServiceLocatorImpl$8.compute(ServiceLocatorImpl.java:1141)
	at org.glassfish.hk2.utilities.cache.internal.WeakCARCacheImpl.compute(WeakCARCacheImpl.java:116)
	at org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetDescriptor(ServiceLocatorImpl.java:1215)
	at org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:762)
	at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:704)
	at org.glassfish.jersey.internal.inject.Injections.getOrCreate(Injections.java:172)
	at org.glassfish.jersey.server.model.MethodHandler$ClassBasedMethodHandler.getInstance(MethodHandler.java:284)
	at org.glassfish.jersey.server.internal.routing.PushMethodHandlerRouter.apply(PushMethodHandlerRouter.java:74)
	at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:109)
	at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112)
	at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112)
	at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112)
	at org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:92)
	at org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:61)
	at org.glassfish.jersey.process.internal.Stages.process(Stages.java:197)
	at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:318)
	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
	at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
	at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)
	at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)
	at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473)
	at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427)
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388)
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341)
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:845)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1689)
	at com.google.inject.servlet.DefaultFilterPipeline.dispatch(DefaultFilterPipeline.java:46)
	at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:133)
	at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:130)
	at com.google.inject.servlet.GuiceFilter$Context.call(GuiceFilter.java:203)
	at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:130)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1676)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1174)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1106)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
	at org.eclipse.jetty.server.Server.handle(Server.java:518)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:314)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:253)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
	at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93)
	at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:246)
	at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:156)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)
	at java.lang.Thread.run(Thread.java:745)

Co ciekawe kilkukrotnie dokładnie ten sam.. Dodatkowo, jak np dopisze pusty konstruktor w TestResource już nic nie działa, właściwie jakakolwiek modyfikacja skutkuje sypnięciem się wszystkiego.

Popróbuje jeszcze, a jak ktoś ma jakiś pomysł to chętnie wysłucham :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1