I am using the DynamicFeature in Jersey to dynamically bind a container request filter to some particular resource methods. In addition to the DynamicFeature, I also have regular filters that apply to all resource methods. However, I found the priorities/orders of these filters not working as expected. For example:
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!");
}
}
In the ResourceConfig, I register the DynamicFeature and filters with priorities:
register(MyDynamicFeature.class, 1);
register(MyStaticFilter.class, 3);
Ideally, if requests comes through the filters, I'd expect to see from the log:
Hey! I am dynamic!
Hey! I am static!
because the dynamic filter has a higher priority than the static one, but instead, I saw
Hey! I am static!
Hey! I am dynamic!
So it seems like dynamically bound filters always come at the end after the statically bound ones. Why doesn't it honor the priorities I set?
解决方案
Try to use javax.annotation.Priority annotations instead of the 2nd parameter in FeatureContext::register and ResourceConfig::register calls, which overrides the annotation.
@Priority(1)
public class MyDynamicFilter implements ContainerRequestFilter {
...
@Priority(2)
public class MyStaticFilter implements ContainerRequestFilter {
...
featureContext.register(MyDynamicFilter.class);
...
register(MyDynamicFeature.class);
register(MyStaticFilter.class);
And if that leads to the same problem, update your dependencies.