不同 api 版本的 Jersey containerRequestFilter
Jersey containerRequestFilter for different api versions
正在创建一个 API ,为此我正在使用 Jersey 。我有一个在 containerRequestFilter class 中调用的身份验证机制。到目前为止一切正常..
现在正在对 API 进行版本控制,并成功对所有资源进行了版本控制,但在 requestfilter 的情况下,我不确定它是如何工作的。我正在使用注释进行版本控制
例如,对于登录资源,url 将是 /v1/signin
和 /v2/signin
这是使用 java 注释提到的,如 @Path("v1/login")
上面的资源 class name..
我如何以这种方式对我的请求过滤器进行版本控制
请帮忙..我真的很陌生
谢谢
假设您使用的是 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);
}
}
}
}
}
这将检查每个资源 class 的 @Path("v1/login")
。每个包含 "v1"
的 class 注释,它会为那个 class 动态注册 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 执行相同的操作,但我个人认为该功能更优雅。
正在创建一个 API ,为此我正在使用 Jersey 。我有一个在 containerRequestFilter class 中调用的身份验证机制。到目前为止一切正常.. 现在正在对 API 进行版本控制,并成功对所有资源进行了版本控制,但在 requestfilter 的情况下,我不确定它是如何工作的。我正在使用注释进行版本控制
例如,对于登录资源,url 将是 /v1/signin
和 /v2/signin
这是使用 java 注释提到的,如 @Path("v1/login")
上面的资源 class name..
我如何以这种方式对我的请求过滤器进行版本控制
请帮忙..我真的很陌生
谢谢
假设您使用的是 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);
}
}
}
}
}
这将检查每个资源 class 的 @Path("v1/login")
。每个包含 "v1"
的 class 注释,它会为那个 class 动态注册 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 执行相同的操作,但我个人认为该功能更优雅。