簡體   English   中英

新澤西州containerRequestFilter用於不同的API版本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM