名稱繫結
名稱繫結是一種概念,它允許向 JAX-RS 執行時說明僅針對特定資源方法執行特定過濾器或攔截器。當過濾器或攔截器僅限於特定的資源方法時,我們說它是名稱繫結的。沒有這種限制的過濾器和攔截器稱為全域性。
定義名稱繫結註釋
可以使用 @NameBinding
註釋將過濾器或攔截器分配給資源方法。此批註用作應用於提供者和資源方法的其他使用者實現的批註的元標註。請參閱以下示例:
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
public @interface Compress {}
上面的示例定義了一個新的 @Compress
註釋,它是一個名稱繫結註釋,因為它用 @NameBinding
註釋。@Compress
註釋可用於將過濾器和攔截器繫結到端點。
將過濾器或攔截器繫結到端點
假設你有一個執行 GZIP 壓縮的攔截器,並且你希望將此類攔截器繫結到資源方法。為此,請註釋資源方法和攔截器,如下所示:
@Compress
public class GZIPWriterInterceptor implements WriterInterceptor {
@Override
public void aroundWriteTo(WriterInterceptorContext context)
throws IOException, WebApplicationException {
final OutputStream outputStream = context.getOutputStream();
context.setOutputStream(new GZIPOutputStream(outputStream));
context.proceed();
}
}
@Path("helloworld")
public class HelloWorldResource {
@GET
@Produces("text/plain")
public String getHello() {
return "Hello World!";
}
@GET
@Path("too-much-data")
@Compress
public String getVeryLongString() {
String str = ... // very long string
return str;
}
}
@Compress
應用於資源方法 getVeryLongString()
和攔截器 GZIPWriterInterceptor
。只有在執行具有此類註釋的任何資源方法時,才會執行攔截器。
在上面的例子中,攔截器只能用於 getVeryLongString()
方法。對於方法 getHello()
,不會執行攔截器。在這個例子中,原因可能很清楚。我們想只壓縮長資料,我們不需要壓縮 Hello World!
的短響應。
名稱繫結可以應用於資源類。在示例中,HelloWorldResource
將使用 @Compress
進行註釋。這意味著在這種情況下所有資源方法都將使用壓縮。
請注意,全域性過濾器始終執行,因此即使對於具有任何名稱繫結註釋的資源方法也是如此。