2015-10-22 26 views
5

tôi tạo một chú thích tùy chỉnh như dưới đâyInterceptorBinding không hoạt động

@InterceptorBinding 
@Retention(RUNTIME) 
@Target(TYPE, METHOD) 
public @interface Traceable {} 

tôi đã viết đánh chặn như bên dưới

@Traceable 
@Interceptor 
public class EnterExitLogger { 
    @AroundInvoke 
    public Object aroundInvoke(InvocatiobContext c) {} 
} 

Các đánh chặn và chú thích là trong một module gọi chung utils.

tôi chú thích một lớp mục tiêu của tôi với @Traceable ở cấp lớp như dưới đây

@Traceable 
public class CDIManagedBean { 
} 

Tôi tuyên bố mục đánh chặn trong file beans.xml tôi như dưới đây

<interceptors> 
    <class>my.package.EnterExitLogger</class> 
</interceptors> 

Lớp mục tiêu là trong một mô-đun riêng biệt. beans.xml nằm trong thư mục META-INF của mô-đun lớp đích.

Các phương thức của lớp đích được gọi từ lớp còn lại. Khi tôi gọi các phương thức, phương thức AroundInvoke của interceptor không được gọi.

Tôi đọc tài liệu và hiểu rằng trình chặn phải chứa một hàm tạo đối số công khai. Tôi đã thêm nó. Nhưng vẫn là kẻ đánh chặn không được gọi.

Tôi đã thêm @Tham gia vào chú thích tùy chỉnh sau khi đọc tài liệu. Nhưng vẫn là kẻ đánh chặn không được gọi.

Từ tài liệu, tôi nhận thấy bộ chặn đánh chặn giao diện Serializable. Mặc dù không đề cập đến tôi thực hiện Serializable cũng có. Vẫn không hoạt động.

Sau đó, tôi đã xóa chú thích tùy chỉnh khỏi tệp chặn, tệp beans.xml và lớp đích. Tôi cũng loại bỏ công khai không có đối số constructor từ interceptor và gỡ bỏ Serializable.

Sau đó, tôi đã chú thích lớp đích với @Interceptors(EnterExitLogger.class) và gọi luồng. Người đánh chặn của tôi đã được gọi.

Bất kỳ ai cũng có thể cho tôi biết cách thực hiện với InterceptorBinding?

P.S.

Tôi đang triển khai tai trong máy chủ WS 8.5.

Trả lời

1

Sự cố đã được khắc phục sau khi thêm tệp beans.xml trống vào mô-đun nơi các trình chặn chặn được lưu giữ. Tôi nghĩ tập tin beans.xml chỉ cần thiết khi tôi muốn sử dụng tiêm cdi.

5

Các Java EE Tutorial cung cấp một lời giải thích tốt đẹp và một vài ví dụ về hệ thống đánh chặn:

Tạo một chặn ràng buộc chú thích, mà phải được chú thích với @Inherited@InterceptorBinding:

@Inherited 
@InterceptorBinding 
@Retention(RUNTIME) 
@Target({METHOD, TYPE}) 
public @interface Logged { } 

Tạo lớp incerceptor mà được chú thích với chú thích liên kết đánh chặn được tạo ở trên cũng như chú thích @Interceptor.

Mọi phương thức @AroundInvoke cần tham số InvocationContext, trả về Object và ném Exception.Phương pháp @AroundInvoke phải gọi phương thức InvocationContext#proceed(), gây phương pháp lớp mục tiêu được gọi:

@Logged 
@Interceptor 
public class LoggedInterceptor implements Serializable { 

    public LoggedInterceptor() { 

    } 

    @AroundInvoke 
    public Object logMethodEntry(InvocationContext invocationContext) throws Exception { 

     System.out.println("Entering method: " 
       + invocationContext.getMethod().getName() + " in class " 
       + invocationContext.getMethod().getDeclaringClass().getName()); 

     return invocationContext.proceed(); 
    } 
} 

Khi một đánh chặn và loại ràng buộc được xác định, bạn có thể chú thích đậu và các phương pháp cá nhân với các loại ràng buộc để xác định rằng interceptor được gọi hoặc trên tất cả các phương thức của bean hoặc trên các phương thức cụ thể.

Ví dụ, đậu PaymentHandler được chú thích @Logged, có nghĩa là bất kỳ gọi các phương pháp kinh doanh của mình sẽ gây phương pháp của đánh chặn @AroundInvoke được gọi:

@Logged 
@SessionScoped 
public class PaymentHandler implements Serializable {...} 

Tuy nhiên bạn có thể đánh chặn chỉ là một tập hợp các phương pháp một bean bởi chỉ những phương pháp mong muốn chú thích:

@Logged 
public String pay() {...} 

@Logged 
public void reset() {...} 

để cho một đánh chặn được gọi trong một ứng dụng CDI, nó phải được quy định trong beans.xml file:

<interceptors> 
    <class>your.package.LoggedInterceptor</class> 
</interceptors> 

Nếu một ứng dụng sử dụng nhiều hơn một đánh chặn, các máy bay đánh chặn được gọi theo thứ tự quy định trong file beans.xml.

+1

Rất tiếc, tôi phải sử dụng bean.xml và khai báo thẻ , ngay cả Java EE 7! Cảm ơn. –