2011-05-25 19 views
7

Google Guice çerçevesinde yeni yeni ve guice servlet ve RequestScope kullanarak enjekte etme konusunda bir sorum var. Tamam, şeyleri net bir şekilde ortaya koymak için kodumdan bir örnek vermeme izin verin.Guir servlet enjekte

Ben bir sunucu uygulamasını O bildiğimiz gibi bu servlet kapsamı tekil burada ilginç

@Singleton 
public class MainServlet extends HttpServlet { 
    doGet(HttpServletRequest request, HttpServletResponse response) { 
     .... some code 
     Injector injector = Guice.createInjector(); 
     ValidUser validUser = injector.getInstance(ValidUser.class) 
     // Here i got the below exception 
    } 
} 



com.google.inject.ConfigurationException: Guice configuration errors: 

1) No scope is bound to com.google.inject.servlet.RequestScoped. 
    at Bean.class while locating Bean 

var Burada

@RequestScope 
public class Bean { 
    private String user; 
    private String pass; 

    // constructor which is @inject 

    // getters and setters 
} 

örnek Bean için bir fasulye sınıfını .. var. Ayrıca http isteği - Bean örneğinden nasıl alabilirim? Çünkü bir Bean sınıfının bir örneğinin ardından anladığım kadarıyla, http isteğine girer, değil mi?

Herhangi bir yardım veya örnek kabul edilir. Teşekkür Br

Sen oluşturma ve servlet'dir üzerinde Injector içindeki doGet yöntemi kullanıyorsanız

cevap

16

... o kapsamı farkında veya geçerli istek ya da bir şey olmak için hiçbir şansı var!

Guice Servlet sen GuiceFilter geçmesi ve size bütün uygulama kullanacağız Injector yaratır GuiceServletContextListener bir alt sınıfını oluşturmak olduğunu tüm istekleri kurmak gerektirir. Bu, tümüyle Servlets bölümündeki Guice kullanım kılavuzunda açıklanmıştır.

Bunu yaptıktan sonra, can MainServlet (hatta bir @Inject açıklamalı yapıcısı kullanarak) sizin için @Inject şeyler. Sunucu uygulamasında, Bean numaralı bir istek örneğini almak için, Provider<Bean> (Bean tekil sunucu uygulamasından daha küçük bir kapsama sahip olduğundan) enjekte etmeniz gerekir. Bir istek dahilinde, geçerli istek için Bean numarasını almak için beanProvider.get() numaralı telefonu arayabilirsiniz.

Servletlerin tekil olduklarını unutmayın, çünkü bunlar normal Java servlet dünyasında da çalışırlar ... her biri her uygulama için yalnızca bir kez oluşturulur ve söz konusu sunucuya yapılan tüm istekler için bu tek örnek kullanılır.

+0

Teşekkürler, sanırım anladım. :) – brakebg