13

安静な Web サービス リソースへのリソースの CDI インジェクションを許可するにはどうすればよいですか? 私は、Weld 2 (cdi)、jersey (jaxrs)、および grizzly (Web サーバー) を使用して、標準の Java で実行しています。これが私の簡単な Web リソースです。

import training.student.StudentRepository;
import javax.inject.Inject;
import javax.ws.rs.*;

@Path("student")
public class StudentWebResource {
  @Inject
  private StudentRepository studentRepository;  

  @GET
  @Path("count")
  @Produces(MediaType.TEXT_PLAIN)
  public Integer getCount() {
    return studentRepository.studentCount();
  }
}

そして、これが私の単純なWebサーバーを開始する方法です。

public class Main {
  public static void main(String[] args) throws Exception {
    startCdiApplication();
  }

  public static void startCdiApplication() throws Exception {
    Weld weld = new Weld();
    try {
      WeldContainer container = weld.initialize();
      Application application = container.instance().select(WebServer.class).get();
      application.run();
    } 
    finally {
      weld.shutdown();
    }
  }
}

そして、CDI注入解決のために溶接を使用するようにジャージーに通知するために、コードを変更する必要があると思われます。

...
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.server.ResourceConfig;

public class WebServer implements Application {

  /*
   * startup the grizzly http server to make available the restful web services
   */
  private void startWebServer() throws IOException, InterruptedException {
    final ResourceConfig resourceConfig = new ResourceConfig().packages("training.webservice").register(new JacksonFeature());
    final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(getBaseUri(), resourceConfig);
    server.start();
    Thread.currentThread().join();
  }

  ...

  @Override
  public void run() throws IOException, InterruptedException {
    startWebServer();
  }
}
4

3 に答える 3

2

少なくとも Weld 2.2.0.Final 以降では、HK2 Binder をいじる必要はありません。

公式の溶接ドキュメントに記載されているように、登録するだけですorg.jboss.weld.environment.servlet.Listener。ドキュメントから抜粋したコード:

public class Main {
    public static void main(String[] args) throws ServletException, LifecycleException {
        Tomcat tomcat = new Tomcat();
        Context ctx = tomcat.addContext("/", new File("src/main/resources").getAbsolutePath());

        Tomcat.addServlet(ctx, "hello", HelloWorldServlet.class.getName());
        ctx.addServletMapping("/*", "hello");

        ctx.addApplicationListener(Listener.class.getName());

        tomcat.start();
        tomcat.getServer().await();
    }

    public static class HelloWorldServlet extends HttpServlet {
        @Inject
        private BeanManager manager;

        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setContentType("text/plain");
            resp.getWriter().append("Hello from " + manager);
        }
    }
}

上記のサーブレット リスナーは、Weld コンテナーのライフサイクル全体を管理します。したがって、次のことは必要ありません。

 Weld weld = new Weld();
 WeldContainer container = weld.initialize();

更新 @EdMelo が指摘したように、Grizzly HTTP サーバーは完全に準拠したサーブレット コンテナーではありません。知りませんでした、このヒントをありがとう。したがって、私の答えがまだここに当てはまるかどうかはわかりません。

于 2015-08-03T10:55:01.330 に答える