2013-12-03 20 views
6

Sto lavorando a un progetto con servizi RESTful. Ho moduli come livello web, livello aziendale e così via. Ho aggiunto il livello API base (usando la maglia) e ottengo una risposta di base per ottenere la richiesta. Ora devo collegarlo al livello aziendale. Stavo cercando su Google, ma non sono sicuro di come implementare ogni soluzione per il mio progetto.Iniezione dipendenza di base con jersey dal livello aziendale

Questa è la mia classe di risorse per il viaggio:

@Path("trip") 
public class TripResource { 

    @Context 
    private UriInfo context; 
    @Inject 
    private AdminService adminService; 

    public TripResource() { 
    } 

    @GET 
    @Produces("text/plain") 
    public List<TripDTO> getText() { 
     return adminService.listAllTrips(); 
    } 

} 

e questo io uso per l'aggiunta di classi risorse:

@javax.ws.rs.ApplicationPath("api") 
public class ApplicationConfig extends Application { 

    @Override 
    public Set<Class<?>> getClasses() { 
     Set<Class<?>> resources = new java.util.HashSet<Class<?>>(); 
     addRestResourceClasses(resources); 
     return resources; 
    } 
    private void addRestResourceClasses(Set<Class<?>> resources) { 
     resources.add(cz.infi.javatravelagency.ServiceResource.class); 
     resources.add(cz.infi.javatravelagency.TripResource.class); 
    } 
} 

mio pom.xml:

<name>JavaTravelAgency - Api module</name> 
    <dependencies> 
     <dependency> 
      <groupId>cz.infi</groupId> 
      <artifactId>javatravelagency-business</artifactId> 
      <version>1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.containers</groupId> 
      <artifactId>jersey-container-servlet</artifactId> 
      <version>2.4.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.media</groupId> 
      <artifactId>jersey-media-moxy</artifactId> 
      <version>2.4.1</version> 
     </dependency> 
     <dependency> 
      <groupId>javax</groupId> 
      <artifactId>javaee-web-api</artifactId> 
      <version>7.0</version> 
      <type>jar</type> 
     </dependency> 
    </dependencies> 
    <build> 
     <plugins> 
      <!-- Java language version --> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <source>6</source> 
        <target>6</target> 
       </configuration> 
      </plugin> 
      <!-- Servlet 3.0 without web.xml --> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.1.1</version> 
       <configuration> 
        <failOnMissingWebXml>false</failOnMissingWebXml> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

ho cercato di seguire answer in this link. E ho appena aggiunto:

public class MyApplicationBinder extends AbstractBinder { 
    @Override 
    protected void configure() { 
     bind(AdminServiceImpl.class).to(AdminService.class); 
    } 
} 

e ora sono bloccato.

Come posso aggiungere questo raccoglitore alla mia classe di configurazione? Qual è l'implementazione più semplice senza utilizzare altre tecnologie?

risposta

9

anche questo mi è costato un sacco di tempo.

Provare quanto segue:

  1. Aggiungi un HK2 Binder al progetto, come descritto qui: https://jersey.java.net/documentation/latest/migration.html

qui è necessario aggiungere il legame con la logica di business. Hai già questo (appena aggiunto per completezza).

e. g.

public class MyBinder extends AbstractBinder { 

    @Override 
    protected void configure() { 
     // request scope binding 
     bind(MyInjectablePerRequest.class) 
       .to(MyInjectablePerRequest.class) 
       .in(RequestScope.class); 
     // singleton binding 
     bind(MyInjectableSingleton.class).in(Singleton.class); 
     // singleton instance binding 
     bind(new MyInjectableSingleton()).to(MyInjectableSingleton.class); 
    } 
} 

Quindi aggiungere una classe "ResourceConfig" al progetto e registrare il legante come qui: http://sleeplessinslc.blogspot.de/2012/10/jax-rs-20-jersey-20-preview-example.html

Nel tuo caso si potrebbe semplicemente estendere la vostra ApplicationConfig da ResourceConfig invece di ApplicationConfig (questo è quello che ho fatto io) . Tutte le classi registrate in "getClasses()" dovrebbero quindi essere come descritte di seguito.

e. g.

/** 
* Application config 
*/ 
public class ApplicationConfig extends ResourceConfig { 

    public ApplicationConfig() { 
     register(SomeResources.class, SomeProviders.class); 

     // Register different Binders 
     addBinders(new MyBinder()); 
    } 
} 

Almeno assicurarsi che il proprio file web.xml utilizzi la configurazione. Questo dipende dal tuo setup (glassfish, servlet v1/v2, ecc.)

Come già stai usando la classe ApplicationConfig, è probabile che tu stia già utilizzando le impostazioni corrette.

Anche in questo caso è un esempio:

<servlet> 
    <servlet-name>om.example.package.to.your.config.ApplicationConfig</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>com.example.package.to.your.config.ApplicationConfig</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

Spero che questo vi aiuterà;)

saluti Ben


trovato un post simile in questo momento: Dependency injection with Jersey 2.0

-5

Devi registrarti y la nostra classe di risorse con Jersey. Quindi, se l'applicazione è denominata MyApplication, allora si può fare

public class MyApplication extends ResourceConfig { 

    /*Register JAX-RS application components.*/ 
    public MyApplication() { 
     register(TripResource.class); 
    } 
} 

anche nel file web.xml, aggiungere il MyApplication per il contenitore di servlet:

<servlet> 
    <servlet-name>SpringApplication</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>mypackage.MyApplication</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

Un semplice esempio di utilizzo di Jersey con la Primavera DI può essere trovato here.

Problemi correlati