2016-11-11 8 views
1

Ich versuche, eine Jersey Resource zu erstellen, die es mir ermöglicht, einen ElasticSearch TransportClient wiederzuverwenden. Daher möchte ich eine einzige Instanz von TransportClient für alle Ressourcen verwenden, für die dies erforderlich ist. Bisher habe ich diese bekam:Jersey injizieren Instanz in Ressource

Ressource:

@Path("/request") 
public class ConfigurationResource { 

    private final TransportClient transportClient; 

    @Inject 
    public ConfigurationResource(TransportClient transportClient) 
    {  
     this.transportClient = transportClient; 
    } 

    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String AlarmStatus(){ 
     if(transportClient != null) 
      return "Not NULL! ID: "; 
     else 
      return "NULL :("; 
    } 
} 

Bindung:

public class WebMainBinder extends AbstractBinder { 
    @Override 
    protected void configure() { 
     TransportClient transportClient = null; 
     try { 
      transportClient = TransportClient.builder().build() 
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
      return; 
     } 
     bind(transportClient).to(TransportClient.class); 
    } 
} 

Hauptanwendung:

@ApplicationPath("service") 
public class WebMain extends ResourceConfig { 
    public WebMain(){ 
     register(new WebMainBinder()); 
     packages(true, "com.eniacdevelopment.EniacHome.Resources"); 
    } 
} 

Web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
    version="3.1"> 

    <servlet> 
     <servlet-name>com.eniacdevelopment.EniacHome.Application.WebMain</servlet-name> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>com.eniacdevelopment.EniacHome.Application.WebMain</servlet-name> 
     <url-pattern>/service/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

Ich habe eine Fabrik auch versucht, mit etwa so:

public class TransportClientFactory implements Factory<TransportClient> { 

    private TransportClient transportClient; 

    @Override 
    public TransportClient provide() { 
     if(this.transportClient == null){ 
      try { 
       transportClient = TransportClient.builder().build() 
         .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); 
      } catch (UnknownHostException e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } 

     return transportClient; 
    } 

    @Override 
    public void dispose(TransportClient transportClient) { 
    } 
} 

Und es dann verbindlich auf diese Weise:

bindFactory(TransportClientFactory.class) 
    .to(TransportClient.class).in(Singleton.class); 

Aber kein Erfolg. Ich bekomme weiterhin Unbefriedigende Abhängigkeiten für den Typ TransportClient mit Qualifiern @Default.

Hilfe wäre sehr willkommen!

Antwort

0

Okay bekam es funktioniert:

Als ich zuerst die App zu implementieren versucht, über einige Guave Abhängigkeit glassfish es beschwert. Ich tauschte das Guava-Glas in Glassfish/Module gegen das, was der eine Maven installiert hatte und brachte es zum Einsatz. Es könnte etwas damit zu tun haben. Keine Garantie hier.

Ich beschloss, den ganzen Glasfisch-Kram fallen zu lassen und von vorne anzufangen. Auf der Trikot Einführung Seite gibt es dieses Maven Urbild, das wie so isntalled werden kann:

mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-grizzly2 
-DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false -DgroupId=com.example -DartifactId=simple-service 
-Dpackage=com.example 
-DarchetypeVersion=2.24 

startet von dort aus mir geholfen.

0

Ich habe die DI-Container-Funktionalität von Jersey ziemlich unangenehm gefunden. Ich bevorzuge es, Guice für die Verwaltung meiner DI zu verwenden. Wenn Sie also Guice nutzen können, können Sie sehen, wie Sie Jersey und Guice anschließen können, um an diesem Demo-Projekt mitzuarbeiten: https://bitbucket.org/marshallpierce/guice-jaxrs-examples. Das common-Teilprojekt hat die gemeinsame Logik, und es gibt andere Teilprojekte für die Trikot- und Resteasy-spezifischen Teile.

Verwandte Themen