2012-01-23 25 views
8

Tôi đang gặp phải một hành vi lạ khi xem qua phản chiếu cho chú thích trên phương thức thuộc về lớp được ủy quyền thông qua CGLIB. Chúng tôi sử dụng CGLIB trong Spring và nếu tôi chú thích một phương thức chỉ với chú thích thì nó hoạt động tốt (tôi có thể truy xuất các chú thích thông qua phương thức getAnnotations() trên đối tượng Method của đối tác). Nếu tôi chú thích phương thức với 2 chú thích thay thế (bất kể thứ tự chú thích), getAnnotations() chỉ cần trả lại null. Cả hai chú thích đều có RetentionPolicy.RUNTIME.chú thích phương thức vô giá trị khi ủy quyền qua CGLIB

Tôi đọc có một số vấn đề với CGLIB, nhưng thật lạ khi nó chỉ hoạt động cho một chú thích và nó trả về null khi tôi đặt 2 chú thích.

Mọi đề xuất?

(Sử dụng mùa xuân 3.0.5 và 2.2.2 cglib)

Thêm mã:

1st chú thích là:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface Produces { 
    ResultType[] value(); 
} 

2 chú thích là

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface JamonMonitored { 
    String type() default ""; 
    String tag() default ""; 
} 

Và khối mã để kiểm tra chú thích là

Collection<Method> candidates = Collections2.filter(Arrays.asList(executorInstance.getClass().getMethods()), new Predicate<Method>() { 
    @Override 
    public boolean apply(Method input) { 
     return input.getAnnotation(Produces.class) != null; 
    } 
}); 

if (candidates.isEmpty()) { 
    // throws exception 
} 

Nếu tôi chú thích phương thức có cả @Sản phẩm và @JamonMonitored, getAnnotation(Produces.class) luôn là null.

+0

Bạn có thể cung cấp mã không . điều này có vẻ xen kẽ, muốn có một cái nhìn. Nhưng havent nghe nói về bất kỳ điều như vậy, hnece mã? –

+0

Và hy vọng bạn đã trải qua điều này bit bit - http://stackoverflow.com/questions/1706751/retain-annotations-on-cglib-proxies –

Trả lời

14

CGLIB hoạt động bằng cách tạo một lớp con của lớp đối tượng đích, và lớp con đó đã tạo ra các phương thức ủy nhiệm cho đối tượng đích. Khi bạn sử dụng phản chiếu để truy vấn chú thích của đối tượng proxy, bạn đang yêu cầu chú thích trên lớp proxy, không phải lớp của đối tượng đích.

Mùa xuân phải thực hiện rất nhiều chú thích để xử lý theo cách của nó xung quanh proxy, siêu lớp, giao diện và như vậy. Logic để thực hiện điều này được đóng gói và phơi bày trong lớp org.springframework.core.annotation.AnnotationUtils. Trong trường hợp của bạn, có vẻ như bạn muốn findAnnotation utility method, ví dụ:

@Override 
public boolean apply(Method input) { 
    return AnnotationUtils.findAnnotation(input, Produces.class) != null; 
} 
+2

Cảm ơn, nó hoạt động hoàn hảo! – manub

1

tùy chọn khác sẽ được để xác định @Inherited trong định nghĩa chú thích. Điều này sẽ làm cho chú thích xuất hiện ngay cả trong lớp con được tạo bởi cglib. Tất nhiên trong một số trường hợp, bạn sẽ không muốn chú thích của mình xuất hiện trong các lớp con "thực", vì vậy đây có thể không phải là một tùy chọn cho mọi kịch bản và cách để đi là sử dụng trợ giúp Spring như skaffman

+0

Dường như không làm việc xin lỗi. Ước gì nó đã làm. –

+0

@Tham gia chỉ hoạt động trên Lớp học, không phải phương pháp – Phil

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