2011-05-23 114 views
6

我使用jsf 2.0,並且我有兩個bean導航(應用程序範圍)和模塊(請求範圍)。我想在Module Bean中使用Navigation bean的方法。我這樣做 模塊豆JSF 2.0從另一個Bean訪問應用程序範圍bean

@ManagedProperty(value = "#{navigationBean}") 
    private NavigationBean navigationBean; 

但是,當我試圖讓navigationBean.SomeMethod它不工作作爲導航豆爲空。這個怎麼做?

回答

19

兩個豆需要一個fullworthy @ManagedBean。受體應該爲注射的豆提供公共的setter方法。注入的豆僅在@PostConstruct及更高版本中可用(即,在所有常規事件方法中,但因此在受體的構造函數中爲而非)。

所以,這應該工作:

@ManagedBean 
@ApplicationScoped 
public class Navigation { 
    // ... 
} 

@ManagedBean 
@RequestScoped 
public class Module { 

    @ManagedProperty(value="#{navigation}") 
    private Navigation navigation; 

    @PostConstruct 
    public void init() { 
     navigation.doSomething(); 
    } 

    public void setNavigation(Navigation navigation) { 
     this.navigation = navigation; 
    } 

} 
4

我認爲@ManagedProperty需要公共設置方法的工作。

1

我得到了解決

我在應用程序簽名布爾getReadAccess的方法(字符串角色,字符串模塊)。如果我想在另一個Bean使用的話,我必須請按照下列步驟

`javax.el.MethodExpression readAccess; 
    javax.el.ELContext elContext = null; 
    javax.faces.context.FacesContext context = FacesContext.getCurrentInstance(); 
    elContext = ((FacesContext) context).getELContext(); 
    javax.faces.application.Application application = FacesContext.getCurrentInstance().getApplication(); 
    javax.el.ExpressionFactory expressionFactory = application.getExpressionFactory(); 
    readAccess = expressionFactory.createMethodExpression(elContext, 
      "#{navigationBean.getReadAccess}", Void.class, new Class[] { 
        String.class, String.class }); 

    //--------Call---------------------------- 
    return (Boolean) readAccess.invoke(elContext, new Object[] { 
       "roleName", "moduleName" }); 

`

+3

這不是一個解決方案。這是一種解決方法/破解。 – BalusC 2011-05-24 04:28:41

相關問題