【发布时间】:2015-01-11 09:45:40
【问题描述】:
对于 dropwizard 模块,我正在尝试将 deltaspike 和 cdi 与 jetty 独立服务器一起使用。
编辑(来自评论):“我的问题(忘记dropwizard这个词):我如何一起使用deltaspike/weld/jetty,为什么deltaspike文档中的示例代码不起作用?”
根据documentation,应该简单地通过添加一个ServletListener来完成,但我得到的只是一个NPE,因为“Bar”没有被注入。
这是我使用的示例代码。
import org.apache.deltaspike.cdise.api.CdiContainer;
import org.apache.deltaspike.cdise.api.CdiContainerLoader;
import org.apache.deltaspike.cdise.servlet.CdiServletRequestListener;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.slf4j.bridge.SLF4JBridgeHandler;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class BarServlet extends HttpServlet {
static {
SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();
}
public static void main(String... args) throws Exception {
CdiContainer cdiContainer = CdiContainerLoader.getCdiContainer();
cdiContainer.boot();
cdiContainer.getContextControl().startContexts();
Server server = new Server(1234);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
server.setHandler(context);
context.addEventListener(new CdiServletRequestListener());
context.addServlet(BarServlet.class, "/*");
server.start();
}
public static class Bar {
public String hello() {
return "bar";
}
}
@Inject
private Bar bar;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().print(bar.hello());
}
}
【问题讨论】:
-
您的问题似乎与 dropwizard/jetty 相关。有什么东西可以通过 dropwizard 为 jetty servlet 提供注入支持吗? Dropwizard 利用 guice,而不是 CDI。
-
你说得对,我想将 CDI 与 dropwizard 一起使用。 Guice 不是一个选项,因为我想将现有的基于 CDI 的应用程序作为微服务运行,并且不能为 guice 重写它。尽管如此,上面的示例并没有使用 dropwizard,我只使用了 deltaspike 文档中说明的依赖项来与 jetty 一起使用......并且失败了。
-
DropWizard 是专门为 Guice 设计的,但你不能只换一个不同的 IoC 容器并期望它工作。也许你想看看吊床 - github.com/johnament/hammock
-
Dropwizard 本身不使用 guice,它根本不使用 DI(球衣 hk2 除外)。有几个非官方的 guice 扩展允许使用 guice 进行 DI,仅此而已。和春天一样。我的问题(忘记dropwizard这个词):如何一起使用deltaspike/weld/jetty,为什么deltaspiek文档中的示例代码不起作用?
-
我面临同样的问题。 ServletContextHandler 是特定于 Jetty 的,调用 addServlet(BarServlet.class, "/*");导致 ServletContextHandler 使用 ServletHolder,它使用 java.lang.Class 的 getInstance() 方法,当然,它完全不支持 CDI。 ServletHolder 的自定义实现可以作为解决方法,但我希望 DeltaSpike 能够开箱即用地支持类似的东西。
标签: jetty cdi dropwizard jboss-weld deltaspike