Jersey 2.3 Interceptor Beispiel nicht funktioniert
Ich versuche, das Trikot 2.3 Interceptor Beispiel finden Sie hier mit Tomcat 7 und name verbindlich zu arbeiten. Ich habe die folgenden gemäß dem Beispiel in den link...
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
public @interface Compress{}
und
@Compress
public class GZIPWriterInterceptor implements WriterInterceptor {
@Override
public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
final OuputStream outputStream .....
..some logging added here..
}
und
@Path("helloword")
public class HelloWorldResource {
@GET
@Path("to-much-data")
@Compress
public String getVeryLongString(){
String str = "a very ...
..... large string";
return str;
}
}
Ich habe nicht Hinzugefügt nichts extra für die web.xml zum registrieren der Interceptor dies nicht diskutiert, die in der Bedienungsanleitung Dokumentation. Ich beachten Sie, dass dies war die Methode verwendet, in ealier version von Jersey.
Getestet habe ich wenn die Kompression Interceptor arbeitete mit einem client erstellt, aus der jersey-client-api. Ich habe dafür gesorgt, das HttpHeaders.ACCEPT_ENCODING, "gzip"
Header Hinzugefügt wird, um die Invocation.Builder
vor dem Absenden der Anfrage. Ich habe auch Hinzugefügt die Protokollierung zu GZIPWriterInterceptor
. Wenn ich test, um zu sehen, ob die Antwort ist gezippt, kommt es zurück in plain text (Content-Type - text/plain
wird in der response header) und ich sehe nicht, das GZIPWriterInterceptor
Meldung in den logs.
Hat jemand eine Idee, was ich falsch mache oder was ich versuchen könnte?
BEARBEITEN - ich aktualisiert meine web.xml der Versuch zu registrieren, die GZIPWriterInterceptor Klasse.
......
.
<servlet>
<servlet-name>Jersey Test Servlet</servlet-name>
<servlet-value>org.glassfish.jersey.servlet.ServletContainer</servlet-value>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.test.jersey</param-value>
</init-param>
<init-param>
<param-name>com.ws.rs.ext.WriterInterceptor</param-name>
<param-value>com.test.jersey.GZIPWriterInterceptor</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
.
.......
Dieser noch nicht gearbeitet. Registriere ich die GZIPWriterInterceptor mit dem parameter-Namen der WriterInterceptor oder etwas anderes?
UPDATE - ich habe es geschafft die Kompression zu arbeiten, durch die Erweiterung javax.ws.rs.core.Anwendung und registrieren jede Klasse, die ich verlange (HelloWorldResource.class, GZIPWriterInterceptor.class, Compress.class), wie beschrieben in der Bereitstellung Agnostiker Anwendung Modell finden Sie hier.
Registrierte ich meine Klasse in der Anwendung web.xml...
<display-name>JerseyInterceptorTest2</display-name>
<servlet>
<servlet-name>Jersey Rest Test</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.jersey.test.MyApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Rest Test</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
Habe ich erfolglos versucht, sich zu registrieren meiner Pakete durch die Erweiterung ResourceConfig gemäß Beispiel 4.2. und von der früheren Methode durch die web.xml
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.test.jersey</param-value>
</init-param>
Es ist immer noch nicht klar, warum die package-Registrierung funktioniert nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei Dinge, die Sie tun müssen:
WriterInterceptor
versehen mit@Compress
annotation. Bitte, tun Sie dies, um sicherzustellen, dass Ihre provider und Ressource-Methode werden miteinander abgeglichen.Application
Klasse oder durchweb.xml
. Die Dokumentation könnte ein wenig vage über diese (wir beheben, dass).jersey.config.server.provider.classnames
stattcom.ws.rs.ext.WriterInterceptor
.Interceptor-Klasse werden kommentiert mit
@Provider
auch, wie diese:Diese werden dann abgeholt, die in einem Paket scan.
Den docs hier nicht angeben, dass explizit.
Stellen Sie sicher, dass alle Klassen(Komprimieren,GZIPWriterInterceptor,HelloWorldResource) sind unter der gleichen Verpackung angegeben durch den parameter " - jersey.config.server.Anbieter.Pakete" in web.xml.
Es kam mir eine situation, die @NameBinding nicht arbeiten, und ich fand heraus, dass ich die Kompresse in einem anderen Paket.