2013-03-29 24 views
8
ile çalışıyor

Kolayca ifşa edebileceğim temel bir JAXRS hizmetim var, ancak bir kez bağımlılık enjeksiyon API'si kullanmak istiyorum ve Google Guice'nin en iyilerinden biri olduğundan şüpheleniyorum. Bu düşünceyle, bunu entegre etmek denedi, ama dokümantasyon gidiş biraz ağır ve benGoogle Guice, JaxRS (Jersey)

  • Web.xml
  • Bağlamında doğru kombinasyonunu deneyin ve bulmak için etrafında avlamak zorunda oldum dinleyici (kullanmalıyım ServletContainer veya GuiceContainer)
  • Servis
  • @Singleton veya @Request ya hiçbir şey ile hizmet açıklama belirtir
  • (Ben @Singleton ile açıklama olmalıdır - dokümanlar yapayım diyorum ama o zaman varsayılan kapsamını talep etmek söylüyor)
  • Yapıcı parametrelerini şununla belirtin. @ InjectParam

Ancak şu anda Google Guice'den hata alıyorum ve @ InjectParam ek açıklamasını kullanıp kullanmamaya bağlı olarak değişiyorlar. Sonra @InjectParam ile açıklama ben açıklama yoksa

Sonra ben Bu benim web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
    <filter> 
     <filter-name>guiceFilter</filter-name> 
     <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>guiceFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <listener> 
     <listener-class>com.hillingar.server.ServletContextListener</listener-class> 
    </listener> 

    <session-config> 
     <session-timeout> 
      30 
     </session-timeout> 
    </session-config> 
</web-app> 

Bu

Mar 29, 2013 9:54:59 PM com.sun.jersey.spi.inject.Errors processErrorMessages 
SEVERE: The following errors and warnings have been detected with resource and/or provider classes: 
    SEVERE: Missing dependency for constructor public com.hillingar.server.rest.UserService(com.hillingar.server.dao.interfaces.UserDao,com.hillingar.server.SessionUtility) at parameter index 0 
    SEVERE: Missing dependency for constructor public com.hillingar.server.rest.UserService(com.hillingar.server.dao.interfaces.UserDao,com.hillingar.server.SessionUtility) at parameter index 1 

olsun

 Mar 29, 2013 9:52:04 PM com.sun.jersey.spi.inject.Errors processErrorMessages 
    SEVERE: The following errors and warnings have been detected with resource and/or provider classes: 
    SEVERE: The class com.hillingar.server.dao.interfaces.UserDao is an interface and cannot be instantiated. 
    SEVERE: Missing dependency for constructor public com.hillingar.server.SessionUtility(com.hillingar.server.dao.interfaces.UserDao) at parameter index 0 

olsun benim ServletContextListener

package com.hillingar.server; 

import java.util.logging.Logger; 

import javax.servlet.ServletContextEvent; 

import com.google.inject.Guice; 
import com.google.inject.Singleton; 
import com.hillingar.server.dao.jdbcImpl.UserJdbc; 
import com.hillingar.server.dao.interfaces.UserDao; 
import com.sun.jersey.guice.JerseyServletModule; 
import com.sun.jersey.guice.spi.container.servlet.GuiceContainer; 
import com.sun.jersey.spi.container.servlet.ServletContainer; 

public class ServletContextListener implements javax.servlet.ServletContextListener { 

    Logger logger = Logger.getLogger(this.getClass().getName()); 

    @Override 
    public void contextDestroyed(ServletContextEvent arg0) { 
    } 

     /* 
     * Covered in URL 
     * https://code.google.com/p/google-guice/wiki/ServletModule 
     */ 
    @Override 
    public void contextInitialized(ServletContextEvent arg0) { 

      // Note the user of JerseyServletModule instead of ServletModule 
      // otherwise the expected constructor injection doesn't happen 
      // (just the default constructor is called) 
      Guice.createInjector(new JerseyServletModule() { 
       @Override 
       protected void configureServlets() { 

        /* 
        * Note: Every servlet (or filter) is required to be a 
        * @Singleton. If you cannot annotate the class directly, 
        * you must bind it using bind(..).in(Singleton.class), 
        * separate to the filter() or servlet() rules. 
        * Mapping under any other scope is an error. This is to 
        * maintain consistency with the Servlet specification. 
        * Guice Servlet does not support the 
        * deprecated SingleThreadModel. 
        */ 
        bind(SecurityFilter.class).in(Singleton.class); 
        bind(ServletContainer.class).in(Singleton.class); 

        /* 
        * Filter Mapping 
        * 
        * This will route every incoming request through MyFilter, 
        * and then continue to any other matching filters before 
        * finally being dispatched to a servlet for processing. 
        * 
        */ 

        // SECURITY - currently disabled 
        // filter("/*").through(SecurityFilter.class); 

        /* 
        * Registering Servlets 
        * 
        * This registers a servlet (subclass of HttpServlet) called 
        * ServletContainer, the same one that I would have used in 
        * the web.xml file, to serve any web requests with the 
        * path /rest/* i.e. ... 
        * 
         <servlet> 
          <servlet-name>ServletAdaptor</servlet-name> 
          <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
          <load-on-startup>1</load-on-startup> 
         </servlet> 
         <servlet-mapping> 
          <servlet-name>ServletAdaptor</servlet-name> 
          <url-pattern>/rest/*</url-pattern> 
         </servlet-mapping> 

        */ 
        serve("/rest/*").with(ServletContainer.class); // JAX-RS 

        // Using this and it starts bitching about 
        // com.sun.jersey.api.container.ContainerException: The ResourceConfig instance does not contain any root resource classes. 
        // So presumably wants an Application class that enumerates 
        // all my services? 
        //serve("/rest/*").with(GuiceContainer.class); 

        /* 
        * Bindings 
        */ 
        bind(UserDao.class).to(UserJdbc.class); 
        bind(SessionUtility.class); 
       } 
      }); 
    } 

} 

Bu

package com.hillingar.server.rest; 

import com.google.inject.Inject; 
import com.google.inject.Singleton; 
import java.util.List; 

import javax.servlet.http.HttpServletRequest; 
import javax.ws.rs.Consumes; 
import javax.ws.rs.GET; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.Context; 
import javax.ws.rs.core.SecurityContext; 

import com.hillingar.server.SessionUtility; 
import com.hillingar.server.dao.interfaces.UserDao; 
import com.hillingar.server.model.User; 
import com.hillingar.server.model.dto.AuthenticationResponse; 

@Path("/user") 
@Produces("application/json") 
@Consumes({"application/xml","application/json"}) 
@Singleton // <-- Added Singleton here 
public class UserService { 

    private UserDao userDao; 
    private SessionUtility sessionManager; 

     /* 
      Error if I annotate with @InjectParam... 

      Mar 29, 2013 9:52:04 PM com.sun.jersey.spi.inject.Errors processErrorMessages 
      SEVERE: The following errors and warnings have been detected with resource and/or provider classes: 
      SEVERE: The class com.hillingar.server.dao.interfaces.UserDao is an interface and cannot be instantiated. 
      SEVERE: Missing dependency for constructor public com.hillingar.server.SessionUtility(com.hillingar.server.dao.interfaces.UserDao) at parameter index 0 

      Error If I don't annotate at all... 
      Mar 29, 2013 9:54:59 PM com.sun.jersey.spi.inject.Errors processErrorMessages 
      SEVERE: The following errors and warnings have been detected with resource and/or provider classes: 
       SEVERE: Missing dependency for constructor public com.hillingar.server.rest.UserService(com.hillingar.server.dao.interfaces.UserDao,com.hillingar.server.SessionUtility) at parameter index 0 
       SEVERE: Missing dependency for constructor public com.hillingar.server.rest.UserService(com.hillingar.server.dao.interfaces.UserDao,com.hillingar.server.SessionUtility) at parameter index 1 

      (both output Initiating Jersey application, version 'Jersey: 1.13 06/29/2012 05:14 PM') 
     */ 
    @Inject 
    public UserService(UserDao userDao, SessionUtility sessionManager) { 
     this.userDao = userDao; 
       this.sessionManager = sessionManager; 
    } 

    @GET 
    public List<User> test(@Context HttpServletRequest hsr) { 
       // USER DAO IS ALWAYS NULL - CONSTRUCTOR INJECTION NOT WORKING 
     User loggedInUser = userDao.findBySessionId(hsr.getSession().getId()); 
       ... 
     return users; 
    } 

} 
+0

için ServletContextListener Değişti benim UserService nedir? – condit

+0

Yapıcıyı parametresiz olarak değiştirdim (ve @Inject öğesinden kaldırıldı), daha sonra hem UserDao hem de SessionUtility için getter ve ayarlayıcıyı (@Inject ile setters) oluşturdu. Hala aramayacaksın. –

+0

Bu sabah iki şeyi değiştirdim, sonra beklediğim gibi çalışmaya başladı, 1) GuiceServletContextListener'ı genişletmek ve getInjector yöntemini geçersiz kılmak için servlet içerik dinleyicimi değiştirdim, 2) Enjektörün içinde hizmet kullanmaya geri döndü ("/ rest/*") .o (GuiceContainer.class); ve bu sefer çalıştı! –

cevap

5

alanlara olarak yerine yapıcı bir parçası olarak `UserDao` ve` SessionUtility` enjekte ne olur

package com.hillingar.server; 

import java.util.logging.Logger; 

import javax.servlet.ServletContextEvent; 

import com.google.inject.Guice; 
import com.google.inject.Injector; 
import com.google.inject.Singleton; 
import com.google.inject.servlet.GuiceServletContextListener; 
import com.hillingar.server.dao.jdbcImpl.UserJdbc; 
import com.hillingar.server.dao.interfaces.UserDao; 
import com.hillingar.server.rest.UserService; 
import com.sun.jersey.guice.JerseyServletModule; 
import com.sun.jersey.guice.spi.container.servlet.GuiceContainer; 
import com.sun.jersey.spi.container.servlet.ServletContainer; 

// (1) Extend GuiceServletContextListener 
public class ServletContextListener extends GuiceServletContextListener { 

    Logger logger = Logger.getLogger(this.getClass().getName()); 

    // (1) Override getInjector 
    @Override 
    protected Injector getInjector() { 
     return Guice.createInjector(new JerseyServletModule() { 
      @Override 
      protected void configureServlets() { 
       bind(SecurityFilter.class).in(Singleton.class); 
       bind(UserService.class);// .in(Singleton.class); 
       bind(ServletContainer.class).in(Singleton.class); 

       // (2) Change to using the GuiceContainer 
       serve("/rest/*").with(GuiceContainer.class); // <<<<--- 

       bind(UserDao.class).to(UserJdbc.class); 
       bind(SessionUtility.class); 
      } 
     }); 
    } 
} 
İlgili konular