如何向Grizzly WebappContext添加ServletContainerInitializer并触发onStartup?
正确添加ServletContainerInitializer到Grizzly WebappContext的方式
你之前用webContext.addListener(new MyInitializer())的方式不对,因为**ServletContainerInitializer并不是ServletContextListener**,Grizzly不会把它当作监听器来触发onStartup方法。
正确的做法是使用WebappContext专门提供的addServletContainerInitializer方法,这个方法是Grizzly为注册Servlet容器初始化器量身设计的。
代码示例
import java.util.Collections; import org.glassfish.grizzly.http.server.WebappContext; // 创建WebappContext实例 WebappContext webContext = new WebappContext("WebappContext", ""); // 添加你的ServletContainerInitializer webContext.addServletContainerInitializer(new MyInitializer(), Collections.emptySet());
参数说明
第二个参数是Set<Class<?>>类型,用来指定这个初始化器要处理的类集合:
- 如果你的
MyInitializer类上使用了@HandlesTypes注解,这里可以传入注解中指定的类的集合; - 如果没有使用
@HandlesTypes,直接传Collections.emptySet()即可,完全不影响初始化器的触发。
确认你的MyInitializer实现正确
确保你的类正确实现了ServletContainerInitializer接口的onStartup方法,比如:
import javax.servlet.ServletContainerInitializer; import javax.servlet.ServletContext; import javax.servlet.ServletException; import java.util.Set; public class MyInitializer implements ServletContainerInitializer { @Override public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException { // 在这里编写你的初始化逻辑 System.out.println("MyInitializer onStartup 方法已触发!"); } }
这样配置后,当Grizzly启动WebappContext时,就会正常调用MyInitializer的onStartup方法了。
内容的提问来源于stack exchange,提问作者user5182503
相关产品推荐
相关产品推荐

