2013-12-03 8 views
6

Pracuję nad projektem z usługami RESTful. Mam moduły jako warstwę internetową, warstwę biznesową i tak. Dodałem podstawową warstwę api (używając koszulki) i otrzymuję podstawową odpowiedź na żądanie otrzymania. Teraz muszę połączyć go z warstwą biznesową. Badałem się, ale nie jestem pewien, jak wdrożyć każde rozwiązanie do mojego projektu.Podstawowy wtrysk zależności z koszulką od warstwy biznesowej

To moja klasa źródłem podróży:

@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(); 
    } 

} 

i to używam dodawania zasobów klasy:

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

Moje 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> 

starałem się wykonaj answer in this link. I właśnie dodałem:

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

, a teraz utknąłem.

Jak dodać ten segregator do mojej klasy konfiguracji? Jaka jest najłatwiejsza implementacja bez użycia innej technologii?

Odpowiedz

9

to również kosztowało mnie dużo czasu.

Spróbuj wykonać następujące czynności:

  1. Dodaj HK2 Binder do projektu, jak opisano tutaj: https://jersey.java.net/documentation/latest/migration.html

Tu trzeba dodać wiązanie do logiki biznesowej. Masz to już (tylko dodano do kompletności).

e. sol.

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

Następnie dodać klasę „ResourceConfig” do swojego projektu i zarejestrować spoiwo jak tutaj: http://sleeplessinslc.blogspot.de/2012/10/jax-rs-20-jersey-20-preview-example.html

W twoim przypadku można po prostu przedłużyć swój ApplicationConfig z ResourceConfig zamiast ApplicationConfig (to co ja) . Wszystkie klasy zarejestrowane w "getClasses()" powinny być opisane poniżej.

e. sol.

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

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

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

Upewnij się, że twój web.xml używa konfiguracji. Zależy to od konfiguracji (glassfish, servlet v1/v2, itp.).

Ponieważ już używasz klasy ApplicationConfig, jest duża szansa, że ​​używasz już poprawnych ustawień.

Znowu tu jest przykład:

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

nadzieję, że pomoże;)

Pozdrowienia Ben


Znaleziony podobnym stanowisku teraz: Dependency injection with Jersey 2.0

-5

Musisz się zarejestrować y nasza klasa zasobów z Jersey. Więc jeśli aplikacja jest nazwany MyApplication, to można zrobić

public class MyApplication extends ResourceConfig { 

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

także w pliku web.xml dodaj MyApplication do kontenera serwletów:

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

Prosty przykład użycia Jersey z wiosennym DI puszka znaleźć here.

Powiązane problemy