2015-10-03 5 views
1

Je configure et j'applique en utilisant Undertow, j'ai configuré un ResourceHandler pour les fichiers statiques, et Servlet pour être utilisé par apache-camel pour exposer les services de repos.Utiliser la servlet de repos dans Camel avec Guice et Undertow

Je l'ai fait en utilisant spring et servlet3.0 dans un conteneur d'application.

Dans une classe extension org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer

@Override 
public void onStartup(ServletContext servletContext) throws ServletException 
{ 
    super.onStartup(servletContext); 
    ServletRegistration.Dynamic servlet = servletContext.addServlet("RestServlet", new CamelHttpTransportServlet()); 
    servlet.setLoadOnStartup(1); 
    servlet.addMapping("/rest/*"); 
} 

Et en route chameau

restConfiguration() 
      .component("RestServlet") 
      .bindingMode(RestBindingMode.json) 
      .dataFormatProperty("prettyPrint", "true"); 

assez proche de ce qui est décrit dans http://camel.apache.org/servlet.html

Mais si je le fais dans Undertow comme embarqué je reçois org.apache.camel.NoSuchBeanException: No bean could be found in the registry for: RestServlet of type: org.apache.camel.spi.RestConsumerFactory car je suppose que Guice ne trouve jamais les servlets créés par Undertow. J'ai essayé d'exposer manuellement le CamelHttpTransportServlet comme une liaison de Guice mais cela ne semble pas changer les choses.

ClassLoader classLoader = getClass().getClassLoader(); 
    ResourceHandler staticHandler = new ResourceHandler(new ClassPathResourceManager(classLoader, STATIC_RESOURCE_ROOT)) 
      .addWelcomeFiles(INDEX_HTML); 

    DeploymentInfo deploymentInfo = Servlets.deployment() 
      .setClassLoader(classLoader) 
      .setContextPath(ROOT_MAPPING) 
      .setDeploymentName(DEPLOYMENT_NAME) 
      .addServlet(
        Servlets.servlet("RestServlet", CamelHttpTransportServlet.class) 
          .addMapping(REST_MAPPING) 
          .setLoadOnStartup(1) 
      ); 

    DeploymentManager manager = Servlets.defaultContainer().addDeployment(deploymentInfo); 
    manager.deploy(); 

    PathHandler path = Handlers.path() 
      .addPrefixPath(REST_MAPPING, manager.start()) 
      .addPrefixPath(ROOT_MAPPING, staticHandler); 

    undertow = Undertow.builder() 
      .addHttpListener(port, LOCALHOST) 
      .setHandler(path) 
      .build(); 
    undertow.start(); 

Le travail des ressources statiques comme prévu, et il semble aussi le servlet reste est en cours d'exécution et d'obtenir les réponses, mais CamelContext ne démarre pas.

Je ne peux pas utiliser de restauration ou quoi que ce soit en camel car le port sera alors utilisé, j'ai donc besoin d'utiliser un port différent pour les fichiers statiques et de repos. Existe-t-il un moyen pour que camel identifie le Servlet initié par Undertow?

Répondre

1

Ok, j'ai finalement découvert où ça s'est mal passé.

Je suppose que j'ai toujours utilisé .component("servlet") et non .component("RestServlet"), mais Camel ne lierait pas automatiquement cela avant.

Je changé cette section pour

restConfiguration() 
      .bindingMode(RestBindingMode.json) 
      .component("servlet") 
      .dataFormatProperty("prettyPrint", "true") 
      .endpointProperty("servletName", "RestServlet); 

Et le déploiement j'ai changé le mappage de servlets à /* ou bien request.getPathInfo() retournerait null à l'intérieur CamelHttpTransportServlet. NB J'ai rencontré un problème parce que j'ai d'abord mis contextPath à /rest/* qui a foiré les sessions et les cookies

DeploymentInfo deploymentInfo = Servlets.deployment() 
      .setClassLoader(classLoader) 
      .setContextPath("/rest/") 
      .setDeploymentName(DEPLOYMENT_NAME) 
      .addServlet(
        Servlets.servlet("RestServlet", CamelHttpTransportServlet.class) 
          .addMapping("/*") 
          .setLoadOnStartup(1) 
      );