gpt4 book ai didi

java - 如何配置 jetty 与 Guice 和 Vaadin 一起运行

转载 作者:行者123 更新时间:2023-12-02 08:22:59 31 4
gpt4 key购买 nike

我像这样创建 guice servlet:

public class GuiceApplicationServlet extends AbstractApplicationServlet {

protected Provider<Application> applicationProvider;

public GuiceApplicationServlet() {
System.out.println("TTest");
}

@Inject
public GuiceApplicationServlet(Provider<Application> applicationProvider) {
super();
this.applicationProvider = applicationProvider;
System.out.println("Test");
}

@Override
protected Class<? extends Application> getApplicationClass()
throws ClassNotFoundException {
return Application.class;
}

@Override
protected Application getNewApplication(HttpServletRequest request)
throws ServletException {
return applicationProvider.get();
}
}

web.xml:

    <filter>
<filter-name>guiceFilter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>guiceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
<listener-class>pl.koziolekweb.vaadin.guice.servlet.VaadinGuiceConfiguration</listener-class>
</listener>


<servlet>
<servlet-name>Vaadin Application Servlet</servlet-name>
<servlet-class>pl.koziolekweb.vaadin.guice.servlet.GuiceApplicationServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Vaadin Application Servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

问题是,当我运行 jetty 时,Guice 创建 servlet 实例(在控制台中打印“Test”),但是当我尝试在浏览器中运行应用程序时,我得到 NPE 并在控制台中出现“TTest”。

因此 jetty 创建另一个不受 guice 管理的 servlet 实例。

问题是如何配置jetty只使用guice?

最佳答案

您必须创建一个扩展 com.​google.​inject.​servlet.ServletModule 的 guice servlet 模块(我们称之为 FooModule )。您可以通过覆盖 configureServlets() 来定义 servlet 的绑定(bind)和路径。方法。

然后您必须通过扩展com.google.inject.servlet.GuiceServletContextListener来创建上下文监听器(我们称之为 BarContextListener )。在那里你必须实现 getInjector()方法,类似于:

protected Injector getInjector() {
Injector injector = Guice.createInjector(new FooModule());
return injector;
}

然后从 web.xml 中删除所有 servlet 映射,然后添加过滤器:

   <filter>
<filter-name>guiceFilter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>guiceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

和您创建的上下文监听器:

<listener>
<listener-class>path.to.package.of.context.listener.BarContextListener</listener-class>
</listener>

通过此,您的所有 servlet 都由 Guice 管理,并在您的应用程序的服务器端启用依赖项注入(inject)。它在 Tomcat 中适用于我,所以它也应该在 Jetty 上工作。不要忘记包含 guice-servlet-<version>.jar进入你的类路径。我没有在 Vaadin 中使用它,但我想我的回答对您有一点帮助。

关于java - 如何配置 jetty 与 Guice 和 Vaadin 一起运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5121687/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com