tôi giả sử rằng bạn đang sử dụng Jersey 2.x (thực hiện cho JAX-RS 2.0 API).
Bạn có hai cách để đạt được mục tiêu của mình.
1. Sử dụng Tên bindings:
1,1 Tạo chú thích tùy chỉnh chú thích với @NameBinding:
@NameBinding
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationForResourceOne {}
1,2. Tạo bộ lọc bằng chú thích của bạn:
@Provider
@PreMatching
@AnnotationForResourceOne
public class ResourceOneFilter implements ContainerRequestFilter {
...
}
1.3. Và ràng buộc bộ lọc tạo ra với phương pháp tài nguyên được lựa chọn:
@Path("/resources")
public class Resources {
@GET
@Path("/resourceOne")
@AnnotationForResourceOne
public String getResourceOne() {...}
}
2. Sử dụng DynamicFeature:
2,1. Tạo bộ lọc:
public class ResourceOneFilter implements ContainerRequestFilter {
...
}
2.2. Thực hiện giao diện javax.ws.rs.container.DynamicFeature:
@Provider
public class MaxAgeFeature implements DynamicFeature {
public void configure(ResourceInfo ri, FeatureContext ctx) {
if(resourceShouldBeFiltered(ri)){
ResourceOneFilter filter = new ResourceOneFilter();
ctx.register(filter);
}
}
}
Trong kịch bản này:
- lọc không chú thích với
@Provider
chú thích; Phương thức
configure(...)
được gọi cho mọi phương thức tài nguyên;
ctx.register(filter)
liên kết bộ lọc với phương pháp tài nguyên;
DynamicFeature hoạt động như một nét duyên dáng. –
Bạn có chắc chắn chú thích '@ PreMatching' là cần thiết trong ví dụ NameBinding không? – Zakhar
Các ràng buộc tên không hoạt động đối với tôi – Kunal