Jetty 将CDI/Deltaspike与码头一起使用
对于dropwizard模块,我尝试将deltaspike和cdi与jetty独立服务器一起使用 编辑(来自评论):“我的问题(忘记dropwizard这个词):我如何一起使用deltaspike/weld/jetty,为什么deltaspike文档中的示例代码不起作用?” 根据,它应该通过添加一个ServletListener来完成,但我得到的只是一个NPE,因为“Bar”不会被注入 下面是我使用的示例代码Jetty 将CDI/Deltaspike与码头一起使用,jetty,cdi,dropwizard,jboss-weld,deltaspike,Jetty,Cdi,Dropwizard,Jboss Weld,Deltaspike,对于dropwizard模块,我尝试将deltaspike和cdi与jetty独立服务器一起使用 编辑(来自评论):“我的问题(忘记dropwizard这个词):我如何一起使用deltaspike/weld/jetty,为什么deltaspike文档中的示例代码不起作用?” 根据,它应该通过添加一个ServletListener来完成,但我得到的只是一个NPE,因为“Bar”不会被注入 下面是我使用的示例代码 import org.apache.deltaspike.cdise.api.CdiC
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());
}
}
我目前的工作是:
- JBoss焊接3.0.1最终
- Apache DeltaSpike 1.8.0
- 码头9.4.7.v20170914
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-bom</artifactId>
<version>9.4.7.v20170914</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.cdi</groupId>
<artifactId>cdi-servlet</artifactId>
<version>9.4.7.v20170914</version>
</dependency>
您的问题似乎与dropwizard/jetty更相关。是否有任何东西可以通过dropwizard为jetty servlet提供注入支持?Dropwizard利用的是GUI,而不是CDI。你说得对,我想在Dropwizard中使用CDI。Guice不是一个选项,因为我希望将现有的基于CDI的应用程序作为微服务运行,并且无法为Guice重写它。尽管如此,上面的例子并没有使用dropwizard,我只使用deltaspike文档中说明的用于jetty的依赖项。。。DropWizard是专门为Guice设计的,但您不能在不同的IoC容器中进行交换并期望它工作。也许你想看看吊床-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能够支持这种开箱即用的东西。
Server server = new Server(8080);
WebAppContext context = new WebAppContext();
context.setConfigurations(new Configuration[]{
new AnnotationConfiguration(),
new WebInfConfiguration(),
new WebXmlConfiguration(),
new MetaInfConfiguration(),
new FragmentConfiguration(),
new EnvConfiguration(),
new PlusConfiguration(),
new JettyWebXmlConfiguration()}
);
context.setContextPath("/");
context.setResourceBase("src/main/webapp");
context.setParentLoaderPriority(true);
server.setHandler(context);
server.start();
// example...
CDI.current().select(Servlet.class).forEach(s ->
context.addServlet(s.getClass(), s.getClass().getSimpleName());
});
server.join();