2013-08-16 9 views
11

Przeprowadzamy migrację niektórych naszych usług danych z Jersey 1.x, stosując koszulkę-sprężynę do Jersey 2.x, używając koszulki-sprężyny3.Określanie niestandardowego kontekstu aplikacji

Mamy kilka klas testowych, które dziedziczą po JerseyTest. Niektóre z tych klas używają niestandardowych plików applicationContext.xml, które nie są określone w pliku web.xml.

W Jersey 1.x klasy testowe, które rozszerzyły JerseyTest, mogą wywołać super konstruktora za pomocą WebappDescriptor.Builder, do którego można przekazać parametr kontekstu w celu ustawienia lub zastąpienia ścieżki kontekstu aplikacji.

E.g.

public MyTestClassThatExtendsJerseyTest() 
{ 
    super(new WebAppDescriptor.Builder("com.helloworld") 
    .contextParam("contextConfigLocation", "classpath:helloContext.xml") 
    .servletClass(SpringServlet.class) 
    .contextListenerClass(ContextLoaderListener.class) 
    .requestListenerClass(RequestContextListener.class).build()); 
} 

Jak można to samo osiągnąć w przypadku produktu Jersey 2.x?

Przeszedłem przez API docs, user guides i niektóre z sources, ale nie mogłem znaleźć odpowiedzi.

Dziękuję.

Odpowiedz

7

Załóżmy swój Application wygląda następująco:

@ApplicationPath("/") 
public class MyApplication extends ResourceConfig { 

    /** 
    * Register JAX-RS application components. 
    */ 
    public MyApplication() { 
     // Register RequestContextFilter from Spring integration module. 
     register(RequestContextFilter.class); 

     // Register JAX-RS root resource. 
     register(JerseySpringResource.class); 
    } 
} 

Twój główny zasób JAX-RS jak:

@Path("spring-hello") 
public class JerseySpringResource { 

    @Autowired 
    private GreetingService greetingService; 

    @Inject 
    private DateTimeService timeService; 

    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String getHello() { 
     return String.format("%s: %s", timeService.getDateTime(), greetingService.greet("World")); 
    } 
} 

I masz deskryptor wiosna nazwie helloContext.xml dostępne bezpośrednio z klasy ścieżce. Teraz chcesz przetestować swoją metodę zasobów getHello przy użyciu Jersey Test Framework. Możesz napisać test jak:

public class JerseySpringResourceTest extends JerseyTest { 

    @Override 
    protected Application configure() { 
     // Enable logging. 
     enable(TestProperties.LOG_TRAFFIC); 
     enable(TestProperties.DUMP_ENTITY); 

     // Create an instance of MyApplication ... 
     return new MyApplication() 
       // ... and pass "contextConfigLocation" property to Spring integration. 
       .property("contextConfigLocation", "classpath:helloContext.xml"); 
    } 

    @Test 
    public void testJerseyResource() { 
     // Make a better test method than simply outputting the result. 
     System.out.println(target("spring-hello").request().get(String.class)); 
    } 
} 
+0

dostrzegłem 'metody property' w API dokumentacji, ale nie było dla mnie jasne, czy metoda może być zastosowana do parametrów kontekstu. Zaktualizowałem swój kod zgodnie z twoim bardzo pouczającym przykładem. Z moich dzienników wyjściowych i testów wynika, że ​​teraz wywoływany jest właściwy plik kontekstu aplikacji. Bardzo ci dziękuje za pomoc. Mam teraz dodatkowe pytanie, jak pobrać instancje komponentów bean z działającej konfiguracji. Czy mogę utworzyć nowe pytanie? –

+0

Jeśli odpowiedź na to pytanie brzmi "tak", utwórz nowe pytanie. Dzięki. –

+0

Dziękuję. Wysłałem kolejne pytanie. [Pobierz zarządzaną fasolę z pojemnika JerseyTest z jersey-spring3] (http://stackoverflow.com/questions/18282409/retrieve-a-managed-bean-from-a-jerseytest-container- with-jersey-spring3). Łączę to tutaj, ponieważ może to być korzystne dla osób czytających tę odpowiedź. –

8

To nie dla mnie, bo nie używałem konfigurację stylu .xml używałem @Configuration adnotacje. Musiałem więc bezpośrednio podać kontekst aplikacji do klasy ResourceConfig.

I zdefiniowany sposób skonfigurować w moim JerseyTest tak:

@Override 
protected Application configure() { 
    ResourceConfig rc = new ResourceConfig(); 

    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class); 
    rc.property("contextConfig", ctx); 
} 

gdzie SpringConfig.class jest moja klasa z @Configuration adnotacji i importowania org.springframework.context.annotation.AnnotationConfigApplicationContext

Powiązane problemy