2016-01-06 39 views
3

我在Jersey中使用DynamicFeature將容器請求篩選器動態綁定到某些特定的資源方法。除了DynamicFeature之外,我還有適用於所有資源方法的常規過濾器。但是,我發現這些過濾器的優先級/順序不能按預期工作。例如:爲什麼Jersey不尊重動態綁定過濾器的優先級?

public class MyDynamicFeature implements DynamicFeature { 

    @Override 
    public void configure(ResourceInfo resourceInfo, FeatureContext featureContext) { 
     featureContext.register(MyDynamicFilter.class, 2); 
    } 
} 

public class MyDynamicFilter implements ContainerRequestFilter { 
    @Override 
    public void filter(ContainerRequestContext containerRequestContext) throws IOException { 
     System.out.println("Hey! I am dynamic!"); 
    } 
} 

public class MyStaticFilter implements ContainerRequestFilter { 
    @Override 
    public void filter(ContainerRequestContext containerRequestContext) throws IOException { 
     System.out.println("Hey! I am static!"); 
    } 
} 

ResourceConfig,我註冊DynamicFeature和過濾器具有優先級:

register(MyDynamicFeature.class, 1); 
register(MyStaticFilter.class, 3); 

理想的情況下,如果請求來自通過過濾器,我期望從日誌中看到:

Hey! I am dynamic! 
Hey! I am static! 

因爲動態濾波器比靜態的更高的優先級,而是,我看到

Hey! I am static! 
Hey! I am dynamic! 

所以它看起來像動態綁定的過濾器總是在靜態綁定後結束。爲什麼不尊重我設定的優先事項?

回答

0

嘗試使用javax.annotation.Priority註釋,而不是FeatureContext::registerResourceConfig::register調用中的第二個參數,這會覆蓋註釋。

@Priority(1) 
public class MyDynamicFilter implements ContainerRequestFilter { 
... 
@Priority(2) 
public class MyStaticFilter implements ContainerRequestFilter { 
... 
featureContext.register(MyDynamicFilter.class); 
... 
register(MyDynamicFeature.class); 
register(MyStaticFilter.class); 

如果這導致相同的問題,請更新您的依賴關係。