使用带码头的CDI / Deltaspike

时间:2015-01-11 09:45:40

标签: jetty cdi dropwizard jboss-weld deltaspike

对于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());
    }
}

1 个答案:

答案 0 :(得分:0)

我目前正在处理:

  • JBoss Weld 3.0.1Final
  • Apache DeltaSpike 1.8.0
  • Jetty 9.4.7.v20170914

这些版本是出于某种目的而选择的; Weld 3是CDI 2.0实现。 DeltaSpike 1.8.0是CDI 2扩展。 Jetty的版本也很重要,因为该版本(及更高版本)具有CDI集成部分。

     <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>

正如您在第二个依赖项中看到的那样:cdi-servlet将确保jetty将启动cdi集成servlet。 你的主要课程可以简单地是:

  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();