WebAppContext pass argument for servlet constructor

I have a webAppContext in the main class, and I have a servlet that has an annotation and a WebServlet constructor with arguments. How to pass arguments from Main class to Servlet?

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)); } } 
+5
source share
1 answer

Well, as far as I understand, you created a web application using JavaSE and embedded Jetty. You use annotations to add servlets to your server. And then Jetty creates your servlets, which it calls the default constructors. But you need to somehow pass references to objects created in main() to your servlets.

So there are several solutions:

  • Create your own dependency injection : add the singleton Context class to your application. In main (), put your services in Map<Class<?>, Object> Context. And get them in servlets.
  • Use dependency injection frameworks. Like Spring .
  • Go to J2EE and use EJB . In this case, you need to forget about your main() and manage the web server.

PS The berth server has the addBean(...) method. And you can add your "bean" to the server (in code or in the config). But as far as I know, it is impossible to get this bean in the servlet.

+3
source

All Articles