2013-08-16 17 views
11

Wir migrieren einige unserer Datendienste von Jersey 1.x mit Jersey-Feder zu Jersey 2.x mit Jersey-Feder3.Angeben des benutzerdefinierten Anwendungskontexts

Wir haben ein paar Testklassen, die von JerseyTest erben. Einige dieser Klassen verwenden angepasste applicationContext.xml-Dateien, die nicht in der Datei web.xml angegeben sind.

In Jersey 1.x konnten die Testklassen, die JerseyTest erweiterten, den Superkonstruktor mit einem WebappDescriptor.Builder aufrufen, an den ein Kontextparameter übergeben werden konnte, um den Anwendungskontextpfad festzulegen oder zu überschreiben.

z.

Wie kann das gleiche mit Jersey 2.x erreicht werden?

Ich habe die API docs, user guides und einige der sources gekämmt, konnte aber keine Antwort finden.

Vielen Dank.

Antwort

7

Nehmen wir an, Ihr Application wie folgt aussieht:

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

Ihre JAX-RS Root-Ressourcen wie:

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

Und Sie haben Frühjahr Descriptor helloContext.xml verfügbar direkt von der Klasse-Pfad benannt. Jetzt möchten Sie Ihre getHello Ressourcenmethode mit Jersey Test Framework testen. Sie können Ihren Test wie schreiben:

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

ich die 'property' Methode in der API-spotted Dokumentation, aber es war mir nicht klar, dass die Methode auf die Kontextparameter angewendet werden könnte. Ich habe meinen Code entsprechend Ihrem sehr informativen Beispiel aktualisiert. Aus meinen Ausgabeprotokollen und Tests scheint es, dass die richtige Anwendungskontextdatei jetzt aufgerufen wird. Vielen Dank für Ihre Hilfe. Ich habe jetzt eine zusätzliche Frage, wie man Bean-Instanzen von der laufenden Konfiguration abruft. Soll ich eine neue Frage erstellen? –

+0

Nun, wenn diese Frage beantwortet wird, dann ja, erstellen Sie eine neue Frage. Danke. –

+0

Danke. Ich habe eine Follow-up Frage gestellt. [Erhalte eine verwaltete Bohne aus einem JerseyTest-Behälter mit Jersey-Spring3] (http://stackoverflow.com/questions/18282409/retrieve-a-managed-bean-from-a-jerseytest-container-with-jersey-spring3). Ich verlinke es hier, wie es für Leute nützlich sein könnte, die diese Antwort lesen. –

8

Das ist nicht für mich arbeiten, wie ich nicht die XML-Stil-Konfiguration mit wurde, ich @Configuration Anmerkungen wurde mit. Also musste ich der ResourceConfig-Klasse den Anwendungskontext direkt bereitstellen.

I definierte die configure-Methode in meinem JerseyTest wie so:

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

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

wo SpringConfig.class meine Klasse mit der @Configuration Annotation und Import org.springframework.context.annotation.AnnotationConfigApplicationContext

Verwandte Themen