在Undertow中部署基于Spring的Web应用程序

时间:2015-01-09 15:00:11

标签: spring spring-mvc undertow

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

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

有一个ServletContainerInitializerInfo(Javadoc)似乎符合我的目的,例如我可以实例化它,然后按照Undertow docs (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();

问题在于我不知道在调用instanceFactory构造函数时用handlesTypesServletcontainerInitializerInfo参数替换什么。此外,addServletContainerInitalizer方法的名称拼写错误(应该是Initializer而不是Initalizer)。

有人可以帮忙吗?

谢谢!

1 个答案:

答案 0 :(得分: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<?>>());