2016-11-03 7 views
4

は、しかし、私が取得:ジャージーJAX-RSインスタンス注射

WARNING:プロバイダCOMを。 SERVERランタイムに登録されたtest.jersey.app.MyResourceは、SERVERランタイムに適用可能なプロバイダインタフェースを実装していません。制約の設定上の問題により、プロバイダのcom.test.jersey.app.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; 
    } 
} 

これがあることで、それはmyresourceでの既に実行中のインスタンスを必要とし、次のように

は私がアプリを持っています以下を使用して実行してください。

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> 

答えて

3

はまた、注射

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

参照を作るためにDIシステムを使用します。

+0

「new」というキーワード(行2)がなく、セミコロン(行7)が完全に機能していたこと以外は - ありがとう! – tmgstevens