2012-10-11 29 views
6

Tôi đang xây dựng một ứng dụng Java EE bằng JBoss 7.1.Trình chặn Java EE và @ViewScoped bean

Để kiểm tra đầy đủ các hành động của người dùng, tôi đang lên kế hoạch sử dụng Trình chặn để ghi lại mọi yêu cầu về phương thức của hạt của tôi.

Để làm như vậy tôi có đấu thầu sau đây:

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

Sau đó, tôi xác định lớp đánh chặn của tôi:

@Logged 
@Interceptor 
public class UserActionInterceptor implements Serializable { 

private static final long serialVersionUID = 1L; 
private Logger log = LoggerFactory.getLogger(UserActionInterceptor.class); 

public UserActionInterceptor() { 
} 

@AroundInvoke 
public Object logMethodEntry(InvocationContext invocationContext) throws Exception { 
    log.debug(invocationContext.getMethod().getName() + " invoked."); 
    return invocationContext.proceed(); 
    } 
} 

tốt Cho đến nay đây là làm việc. Nếu tôi ràng buộc một lớp bằng cách sử dụng Interceptor này, tôi sẽ nhận được một số đăng nhập. Tuy nhiên nó trở nên phức tạp hơn khi tôi muốn nhắm mục tiêu các lớp đậu của tôi.

Nếu tôi có loại đậu @RequestScoped và liên kết nó với trình chặn của tôi, nó hoạt động. Tuy nhiên, nếu tôi có một loại đậu @ViewScoped thì nó không.

Tôi nhìn lên định nghĩa của @ViewScoped và tôi thấy:

@Retention(value=RUNTIME) 
@Target(value=TYPE) 
@Inherited 
public @interface ViewScoped 

Tôi có cảm giác rằng vấn đề nằm ở thực tế là chú thích này không có các loại mục tiêu PHƯƠNG PHÁP và nó ngăn chặn kẻ đánh chặn của tôi chặn các cuộc gọi đến các phương thức lớp.

Có ai có cùng vấn đề trước đó không? Có ai biết nếu nó có thể mở rộng phạm vi của đậu để các phương pháp của nó có thể bị chặn mà không làm thay đổi bản chất của @ViewScoped?

Trả lời

3

Điều này xảy ra vì máy đánh chặn không thể truy cập vào @ManagedBean. @ViewScope không phải là một phần của CDI và nó đi kèm với các hạt JSF.

Để làm cho nó hoạt động, cách chắc chắn nhất là sử dụng @ViewScoped với CDI bằng cách sử dụng một trong các phần mở rộng cung cấp nó. Các tùy chọn của bạn bao gồm MyFaces CODI và Seam 3 (ví dụ).

tôi đã nhận nó làm việc (giống như cách bạn mô tả nó) bằng cách cài đặt MyFaces CODI và sử dụng các chú thích sau đây với những hàng nhập khẩu:

import javax.faces.bean.ViewScoped; 
import javax.inject.Named; 

@Named 
@ViewScoped 
@Interceptors({ MyInterceptor.class}) 
Các vấn đề liên quan