簡體   English   中英

Jersey JAX-RS實例注射

[英]Jersey JAX-RS Instance injection

我正在嘗試將一個資源實例注入到具有Singleton范圍的JAX-RS應用程序中,但是當我這樣做時,我得到:

警告:在SERVER運行時中注冊的提供程序com.test.jersey.app.MyResource不實現適用於SERVER運行時的任何提供程序接口。 由於約束配置問題,將忽略提供者com.test.jersey.app.MyResource。

我有一個如下應用程序,需要一個已經運行的MyResource實例:

public class MyApp extends ResourceConfig {
  public MyApp(MyResource res) {
    super(
        MyService.class
        );
    registerInstances(res);
  }
}

public class MyResource {
  String instanceVar;

  public MyResource(String test) {
    instanceVar = test;
  }

  public String getString() {
    return instanceVar;
  }
}

有服務:

@Path("/service")
public class MyService {
  @GET
  @Path("")
  public String get(@Context MyResource res) {
    String output;
    if (res != null) {
      output = res.getString();
    } else {
      output = "NOT SET";
    }
    return "output: " + output;
  }
}

這是使用以下運行:

public static void main(String[] args) {
  MyResource resource = new MyResource("foo");
  MyApp restApp = new MyApp(resource);
  ServletHolder servlet = new ServletHolder(new ServletContainer(restApp));
  Server jettyServer = new Server(8080);
  ServletContextHandler context = new ServletContextHandler(jettyServer, "/*");
  context.addServlet(servlet, "/*");
  try {
    jettyServer.start();
    jettyServer.join();
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    jettyServer.destroy();
  }
}

我嘗試使用AbstractBinder,但找不到將MyResource 實例綁定到服務的方法。

依賴關系:

<dependencies>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>2.23.2</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <version>2.23.2</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-jetty-http</artifactId>
        <version>2.23.2</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.23.2</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-servlet</artifactId>
        <version>9.2.19.v20160908</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-util</artifactId>
        <version>9.2.19.v20160908</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-server</artifactId>
        <version>9.2.19.v20160908</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-jmx</artifactId>
        <version>9.2.19.v20160908</version>
    </dependency>
    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.0</version>
    </dependency>
</dependencies>

使用DI系統使其可注射

final MyResource resource = new MyResource(...);
final AbstractBinder binder = new AbstractBinder() {
    @Override
    public void configure() {
        bind(resource).to(MyResource.class);
    }
};
final MyApp app = new MyApp();
app.register(binder);

也可以看看:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM