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
?