2015-09-12 14 views
5

Mam webAppContext w klasie głównej i mam aplet, który ma adnotację WebServlet i konstruktor z argumentami. Jak mogę przekazać argumenty od klasy głównej do serwletu?WebAppContext przekazuje argument do konstruktora serwletów

Main.java:

String webappDirLocation = "src/main/java/frontend/webapp/"; 
WebAppContext webAppContext = new WebAppContext(); 
webAppContext.setResourceBase("public_html"); 
webAppContext.setContextPath("/"); 
webAppContext.setDescriptor(webappDirLocation + "WEB-INF/web.xml"); 
webAppContext.setConfigurations(new Configuration[]{ 
       new AnnotationConfiguration(), new WebXmlConfiguration(), 
       new WebInfConfiguration(), 
       new PlusConfiguration(), 
       new MetaInfConfiguration(), 
       new FragmentConfiguration(), 
       new EnvConfiguration()} 
); 
webAppContext.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", ".*/classes/.*"); 
webAppContext.setParentLoaderPriority(true); 

web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://java.sun.com/xml/ns/javaee" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
     metadata-complete="false" 
     version="3.0"> 
</web-app> 

Servlet:

@WebServlet(name = "WebSocketGameServlet", urlPatterns = {"/gameplay"}) 
public class WebSocketGameServlet extends WebSocketServlet { 
    static final Logger logger = LogManager.getLogger(GameWebSocket.class); 
    private final static int IDLE_TIME = 6000 * 1000; 
    private AccountService accountService; 
    private Game game; 
    private WebSocketService webSocketService; 

    public WebSocketGameServlet(AccountService accountService, Game game, WebSocketService webSocketService) { 
     this.accountService = accountService; 
     this.game = game; 
     this.webSocketService = webSocketService; 
    } 

    @Override 
    public void configure(WebSocketServletFactory factory) { 
     factory.getPolicy().setIdleTimeout(IDLE_TIME); 
     factory.setCreator(new GameWebSocketCreator(accountService, game, webSocketService)); 
    } 
} 
+0

Powinieneś używać EJB Injection, ponieważ zdecydowałeś się użyć IoC (odwrócenie kontroli). –

Odpowiedz

3

Cóż, o ile mi zrozumieć, utworzone przy użyciu aplikacji internetowych i JavaSE wbudowany Jetty. Używasz adnotacji do dodawania serwletów do serwera. A następnie Jetty tworzy swoje serwlety, które wywołuje domyślne konstruktory. Ale potrzebujesz jakoś przekazać linki do obiektów utworzonych w main() do swoich serwletów.

Tak, istnieje kilka rozwiązań:

  1. tworzyć własne "dependency injection": Dodaj singleton klasy kontekstu do aplikacji. W main() prześlij swoje usługi do Map<Class<?>, Object> Kontekstu. I weź je do serwletów.
  2. Użyj szkieletów wtryskowych zależności. Podobnie jak Spring.
  3. Przejdź do J2EE i użyj EJB. W takim przypadku musisz zapomnieć o swoim własnym main() i być zarządzanym przez serwer sieciowy.

P.S. serwer pomostowy ma metodę addBean(...). I możesz dodać swoją "fasolę" do serwera (w kodzie lub w konfiguracji). Ale o ile wiem, nie jest możliwe, aby ta fasola znalazła się w serwecie.

Powiązane problemy