Аннотации компонента, такие как @ManagedProperty и @PostConstruct, не работают при создании экземпляра компонента вручную из другого компонента. - PullRequest
1 голос
/ 07 декабря 2011

Я создал экземпляр объекта запроса из другого компонента запроса,

new LoginManager();

Но свойство, помеченное @ManagedProperty, не получает значение из запрошенной ссылки, только в случае создания экземпляра вышеуказанным способом. Он просто содержит null, вызывая NPE позже в коде. Также @PostConstruct не будет вызываться. Почему так и как мне с этим бороться?

@ManagedBean(name = "loginManager")
@RequestScoped
public class LoginManager {

    private String userid;
    private String password;

    @ManagedProperty(value="#{currentSession}")
    private UserSessionManager userSession;

}

Но userSession не может прочитать из bean-объекта области сеанса, когда этот bean-объект был создан с использованием: new LoginManager();

Однако я могу прочитать значение, используя FacesContext!

1 Ответ

4 голосов
/ 07 декабря 2011

Не следует вручную создавать экземпляры (управлять) bean-компонентами, используя оператор new. Вы должны позволить JSF выполнять работу по управлению bean-компонентами и вместо этого получить экземпляр, управляемый JSF (экземпляр JSF).

Либо @ManagedProperty в бобе, где вам это нужно:

@ManagedProperty("#{loginManager}")
private LoginManager loginManager;

Или, вызывая EL программно (что довольно ограниченно в вашем конкретном случае):

LoginManager loginManager = context.getApplication().evaluateExpressionGet(context, "#{loginManager}", LoginManager.class);
// ...

Если вы настаиваете на создании экземпляра и управлении бином самостоятельно, вы должны сами делать все инъекции зависимостей, также вызывая @PostConstruct самостоятельно, если таковые имеются, и, наконец, также помещать бин в желаемую область действия самостоятельно. Э.Г.

LoginManager loginManager = new LoginManager();
loginManager.setUserSession(userSession);
// Now use reflection to find and invoke @PostConstruct method.
// Finally store in the map which conforms the bean's scope.
externalContext.getRequestMap().put("loginManager", loginManager);

Этот шаблон - то, что JSF должен забрать у вас из рук. Используйте это.

...