JSF 2.0 Доступ к компоненту приложения из другого компонента - PullRequest
7 голосов
/ 23 мая 2011

Я использую jsf 2.0, и у меня есть два компонента навигации (область применения) и модуль (область запроса).Я хочу использовать методы навигационного компонента в модуле компонента.Я делаю таким образом In Module Bean

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

Но когда я пытаюсь получить navigationBean.SomeMethod, он не работает, так как навигационный бин нулевой.Как это сделать?

Ответы [ 3 ]

20 голосов
/ 24 мая 2011

Обе бобы должны быть полноценными @ManagedBean. Акцептор должен иметь метод открытого установщика для внедренного компонента. Внедренный компонент доступен только в @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 голосов
/ 23 мая 2011

Я думаю, @ManagedProperty для работы требуется общедоступный метод set.

1 голос
/ 24 мая 2011

Я получил решение

У меня есть метод в подписи приложения логический getReadAccess (роль String, модуль String).Если я хочу использовать другой бин, я должен выполнить следующие шаги

    `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" });

`

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...