2015-01-09 749 views
1

我正尝试将我们基于Spring的Web应用程序从Tomcat 8迁移到Undertow。在Undertow部署基于Spring的Web应用程序

我们使用Spring的WebApplicationInitializer进行Spring-MVC和HibernateTransactionManager的编程配置。

有一个ServletContainerInitializerInfo(Javadoc)类,这似乎为我的目的,例如我可以实例化它,然后按照暗潮文档(link)给出的步骤来启动服务器:

ServletContainerInitializerInfo sciInfo = 
    new ServletContainerInitializerInfo(containerInitializerClass, 
     instanceFactory, handlesTypes); 

DeploymentInfo servletBuilder = Servlets.deployment() 
    .addServletContainerInitalizer(sciInfo); 

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

PathHandler path = Handlers.path(Handlers.redirect("/myapp")) 
    .addPrefixPath("/myapp", manager.start()); 

Undertow server = Undertow.builder() 
     .addHttpListener(8080, "localhost") 
     .setHandler(path) 
     .build(); 
server.start(); 

的问题是,我不不知道在调用ServletcontainerInitializerInfo构造函数时用什么来代替instanceFactoryhandlesTypes参数。另外,addServletContainerInitalizer方法的名称是拼写错误的(应该是初始化程序而不是Initalizer)。

有人可以帮忙吗?

谢谢!

回答

3

Undertow使用InstanceFactory<T>作为依赖注入或实例化后给定类的实例的其他自定义的扩展点。

handlesTypes参数将是与您的servlet容器初始值设定项中的@HandlesTypes注释对应的所有类的集合。

如果初始化没有@HandlesTypes,也不需要依赖注入,你可以简单地尝试这个办法:

MyInitializer initializer = new MyInitializer(); 

InstanceFactory<MyInitializer> instanceFactory 
    = new ImmediateInstanceFactory<>(initializer); 

ServletContainerInitializerInfo sciInfo = 
    new ServletContainerInitializerInfo(MyInitializer.class, 
     instanceFactory, new HashSet<Class<?>>()); 
+0

谢谢!我能够编译并启动应用程序。我有另一个问题,但:Undertow无法找到Spring的WebApplicationInitializer实例。我可能会为此发布一个单独的问题。 – siphiuel

+0

得到它的工作。我必须在HandlesTypes列表中指定WebApplicationInitializer的具体实现。再次感谢! – siphiuel