Adicionar um servlet dynamic usando o servlet 3.0 gera exceção

Eu preciso criar add servlets em tempo de execução. Quando eu corro o seguinte código.

protected void processRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { out.println(""); out.println(""); out.println(" URI out"); out.println(""); out.println(""); Integer generatedKey = Math.abs(randomiser.nextInt()); out.print(generatedKey); createServlet(Integer.toString(generatedKey),request.getServletContext()); } finally { out.println(""); out.println(""); out.close(); } } private void createServlet(String generatedKey, ServletContext servletContext) { String servletMapping = "/"+generatedKey; ServletRegistration sr = servletContext.addServlet(generatedKey, "com.path.lbs.servlets.testDynamic"); sr.setInitParameter("keyname", generatedKey); sr.addMapping(servletMapping); } 

Estou tendo o erro a seguir.

java.lang.IllegalStateException: PWC1422: Não é possível configurar o mapeamento para o servlet 1114600676 do contexto de servlet / 123-LBS, porque este contexto de servlet já foi inicializado

É impossível adicionar novos servlets em tempo de execução, ou seja, depois que o contexto de servlet é inicializado ou estou fazendo algo errado?

É impossível adicionar novos servlets em tempo de execução, ou seja, após o contexto do servlet ser inicializado?

Está correto. Você precisa fazer isso em ServletContextListener#contextInitialized() .

 @WebListener public class Config implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent event) { // Do it here. } @Override public void contextDestroyed(ServletContextEvent event) { // ... } } 

No entanto, para seu requisito funcional específico, um servlet de controlador único em combinação com o padrão de comando é muito mais adequado. Você pode então adicionar comandos (ações) durante o tempo de execução e interceptá-los com base no URI da solicitação. Veja também minha resposta em aplicativos baseados na web Design Patterns para um kickoff.