2013-02-27 29 views
9

Tôi đang cố gắng chỉ định bộ lọc phù hợp chỉ liên quan đến một số cuộc gọi API của tôi, bằng cách làm theo những gì mà RESTeasy documentation gợi ý. Đây là những gì mã của tôi trông giống như:Bộ lọc đối sánh với phương pháp cụ thể thông qua NameBinding trên RESTeasy

Tên ràng buộc:

@NameBinding 
public @interface ValidateFoo {} 

Resource:

@Path("/foo/bar") 
@Produces(MediaType.APPLICATION_JSON) 
public class FooBar { 
    @GET 
    @ValidateFoo 
    public Object doStuff() { 
     //do stuff 
    } 

    @POST 
    public Object doAnotherStuff() { 
     //do another stuff 
    } 
} 

Lọc:

@ValidateFoo 
@Provider 
@PreMatching 
public class FooValidation implements ContainerRequestFilter { 
    @Override 
    public void filter(ContainerRequestContext reqContext) throws IOException { 
     //validate stuff 
    } 
} 

Vấn đề là: bộ lọc FooValidation chạy trước mỗi gọi phương thức (ví dụ: trước khi GET và POST tới/foo/bar), không bật ly những chú thích có chú thích với @ValidateFoo (có vẻ là một lỗi đối với tôi). Nếu tôi xóa chú thích @Provider khỏi bộ lọc, nó sẽ không chạy trước bất kỳ cuộc gọi nào (như mong đợi).

Tôi thấy hành vi này một cách nhất quán, bằng cách sử dụng WebLogic hoặc Tomcat. Quản lý sự phụ thuộc của tôi được thực hiện thông qua Maven và phiên bản RESTeasy là 3.0-beta-3.

Bất kỳ ai trải nghiệm/có cùng hành vi? Tôi đã thấy một người dùng khác có vấn đề tương tự trên JBoss forums, không có may mắn cho đến nay.

CẬP NHẬT: Vẫn gặp sự cố tương tự với RESTeasy 3.0.1-Final.

Trả lời

7

Tôi gặp sự cố tương tự. Đối với tôi giải pháp là thêm cấu hình chú thích sau đây (vào @ValidateFoo):

@Target({ ElementType.TYPE, ElementType.METHOD }) 
@Retention(value = RetentionPolicy.RUNTIME) 
@NameBinding 
+0

Cảm ơn đề xuất của bạn. Tôi đã thử nó, nhưng ngay cả sau khi thay đổi, bộ lọc vẫn kết thúc được gọi trước khi mọi cuộc gọi duy nhất đến ứng dụng của tôi, không chỉ các cuộc gọi được chú thích với @ValidateFoo. – Viccari

+4

Ok, bây giờ chúng tôi đã có thể làm cho nó hoạt động. Có vẻ như RESTeasy không thích chú thích '@ PreMatching'. Bằng cách làm theo đề xuất của bạn và xóa chú thích '@ PreMatching', mọi thứ hoạt động như mong đợi. Cảm ơn! – Viccari

+3

Điều đó có ý nghĩa, bởi vì '@ PreMatching' có nghĩa là trước khi ánh xạ yêu cầu tới tài nguyên RESTEasy, vì vậy tại thời điểm đó RESTEasy không biết nếu có bất kỳ sự gắn tên nào. – stackoverflower

Các vấn đề liên quan