![](/img/trans.png)
[英]Guice + Jersey 2 + ContainerRequestFilter and @Context
[英]Jersey containerRequestFilter for different api versions
我正在使用Jersey創建API。 我有一個在containerRequestFilter類中調用的身份驗證機制。 一切都可以正常工作。.現在對API進行版本控制,並成功對所有資源進行版本控制,但是在requestfilter的情況下,不確定其工作方式..Am使用注釋進行版本控制
例如,對於登錄資源,URL將為/v1/signin
和/v2/signin
,使用Java注釋(如資源類名稱上方的@Path("v1/login")
提及。
我如何以這種樣式版本化我的請求過濾器
請幫助..am真的很新
謝謝
假設您使用的是Jersey 2.x,則可以使用Dynamic Binding ,稍加反思即可檢查@Path
批注中的值。 就像是
import javax.ws.rs.Path;
import javax.ws.rs.container.DynamicFeature;
import javax.ws.rs.container.ResourceInfo;
import javax.ws.rs.core.FeatureContext;
import javax.ws.rs.ext.Provider;
@Provider
public class Version1Feature implements DynamicFeature {
@Override
public void configure(ResourceInfo resourceInfo, FeatureContext context) {
Path classAnnotation = resourceInfo.getResourceClass().getAnnotation(Path.class);
if (classAnnotation != null) {
String pathValue = classAnnotation.value();
if (pathValue != null) {
if (pathValue.contains("v1")) {
context.register(Version1Filter.class);
}
}
}
}
}
這將檢查每個資源類的@Path("v1/login")
。 每個包含"v1"
類注釋,它將動態注冊該類的Version1Filter
。 您還可以使用resourceInfo.getResourceMethod().getAnnotation(Path.class)
在方法級別進行檢查。 您擁有的每個資源方法都會調用configure
方法。
應該為每個版本創建一個不同的功能。 您也可以對所有版本使用相同的功能,例如
@Provider
public class VersioningFeature implements DynamicFeature {
@Override
public void configure(ResourceInfo resourceInfo, FeatureContext context) {
Path classAnnotation = resourceInfo.getResourceClass().getAnnotation(Path.class);
if (classAnnotation != null) {
String pathValue = classAnnotation.value();
if (pathValue != null) {
if (pathValue.contains("v1")) {
context.register(Version1Filter.class);
} else if (pathValue.contains("v2")) {
context.register(Version2Filter.class);
}
}
}
}
}
但是對我來說,為每個版本實現一個不同的功能更有意義,因為在創建新版本時無需觸摸功能實現。
對於Jersey 1.x,它並不那么優雅。 您需要在過濾器中顯式地進行檢查。 就像是
import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerResponse;
import com.sun.jersey.spi.container.ContainerResponseFilter;
public class Version1Filter implements ContainerResponseFilter {
@Override
public ContainerResponse filter(ContainerRequest cr, ContainerResponse cr1) {
String pathValue = cr.getPath();
if (pathValue.contains("v1")) {
cr1.getHttpHeaders().putSingle("X-Header", "Version 1.0");
}
return cr1;
}
}
您可以對Jersey 2進行相同的操作,但就我個人而言,我認為該功能更加優雅。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.