2016-11-03 3 views
4

Я пытаюсь внедрить экземпляр ресурса в приложение JAX-RS с объемом Singleton, однако, когда я делаю это я получаю:Джерси JAX-RS Instance инъекции

ВНИМАНИЕ: Поставщик ком. test.jersey.app.MyResource, зарегистрированный в среде выполнения SERVER, не реализует никаких интерфейсов провайдера, применимых во время выполнения 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> 

ответ

3

Используйте систему 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); 

Смотрите также:

+0

За исключением отсутствующего «нового» ключевого слова (строка 2) и точки с запятой (строка 7) отлично работает - СПАСИБО! – tmgstevens

Смежные вопросы