2012-10-11 19 views
6

JBoss 7.1 kullanarak bir Java EE uygulaması inşa ediyorum. kullanıcı eylemleri tam denetim almak içinJava EE Müdahale ve @ViewScoped fasulye

, benim fasulyenin yöntemlerin her çağırmayı günlüğe Müdahale kullanmak için planya ediyorum.

@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(); 
    } 
} 

Şimdiye kadar bu çalışıyor ince:

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

Sonra benim önleme sınıfını tanımlar:

yüzden şu biding var yapmak için. Bu Interceptor'ı kullanarak bir sınıfa bağlanırsam, bir miktar kayıt olurum. Ancak fasulye sınıflarımı hedeflemek istediğimde daha da zorlaşıyor.

ben tip @RequestScoped bir fasulye var ve çalışıyor benim interceptor onu bağlamak edin. Ancak, @ViewScoped türünde bir fasulye varsa o zaman değil.

Ben @ViewScoped tanımını baktı ve buldum:

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

Sorun bu ek açıklama hedef tür YÖNTEMİ ve öyle olmadığını aslında yattığını his var engelleyicimin sınıf yöntemlerine çağrıları engellemesini önler.

Herkes önce aynı sorunu vardı mı? Birisi, fasulyenin kapsamını genişletmenin mümkün olup olmadığını, bu yöntemlerin @ViewScoped'in yapısını değiştirmeden yakalanabileceğini biliyor mu? önleme @ManagedBean erişemediği için

cevap

3

bu gerçekleşir. @ViewScope, CDI'nin bir parçası değildir ve JSF çekirdekleri ile birlikte gelir. o iş yapmak için

, en emin yolu sağlar uzantılarından birini kullanarak CDI ile @ViewScoped kullanmaktır. Seçenekleriniz MyFaces CODI ve Seam 3'ü (örneğin) içerir.

Ben var o çalışma (aynı yolu tarif), bu ithalat ile aşağıdaki ek açıklamaları MyFaces CODI yükleme ve kullanarak:

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

@Named 
@ViewScoped 
@Interceptors({ MyInterceptor.class}) 
İlgili konular