2013-09-03 6 views
1

제가 만든이 샘플 jsf 프로젝트에서이 문제가 발생했습니다. 관리 빈은 인스턴스화되지 않습니다. Bean 클래스 :.JSF 2 관리 빈이 인스턴스화되지 않습니다.

@ManagedBean(name="loginMB") 
@RequestScoped 
public class LoginMB extends AbstractMB { 

    private static final long serialVersionUID = -8523135776442886000L; 
    @ManagedProperty("#{userMB}") 
    private UserMB userMB; 

    //getters and setters 

    public String login() {  
     UserSupport userSupport = new UserSupportImpl();   
     User user = userSupport.isValidLogin(email, password);  
     if (user != null) { 
      getUserMB().setUser(user); 
      FacesContext context = FacesContext.getCurrentInstance(); 
      HttpServletRequest request = (HttpServletRequest) context 
        .getExternalContext().getRequest(); 
      request.getSession().setAttribute("user", user); 
      return "loggedIn"; 
      //return "/pages/protected/index.xhtml"; 
     } 
     displayErrorMessageToUser("Check your email/password"); 
     return null; 
    } 
} 

ManagedBean은 주석과 RequestScope 주석이

수입 javax.faces.bean에서 가져온 *;

이 난 콩 이상 사용했습니다 어떻게,

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:p="http://primefaces.org/ui"> 
<h:head> 
</h:head> 
<h:body> 
    <p>#{bundle.loginHello}</p> 
    <h:form> 
     <p:growl showDetail="false" life="3000" /> 
     <h:panelGrid columns="2"> 
      <h:outputLabel value="#{bundle.loginUserName}" /> 
      <h:inputText value="#{loginMB.email}" label="Email" id="email" required="true">    
       <f:validateLength minimum="6" /> 
      </h:inputText> 
      <h:outputLabel value="#{bundle.loginPassword}" /> 

      <h:inputSecret value="#{loginMB.password}" label="Password" id="senha" required="true" autocomplete="off" >   
       <f:validateLength minimum="6" /> 
      </h:inputSecret> 


     </h:panelGrid> 
     <p:commandButton action="#{loginMB.login}" value="Log in" ajax="false" /> 
    </h:form> 
</h:body> 
</html> 

다른 관리 빈

@SessionScoped 
@ManagedBean(name = "userMB") 
public class UserMB implements Serializable { 
    public static final String INJECTION_NAME = "#{userMB}"; 
    private static final long serialVersionUID = 1L; 

    private User user; 
     ....... 
} 

예외 :

javax.el.PropertyNotFoundException: /login.xhtml @14,83 value="#{loginMB.email}": Target Unreachable, identifier 'loginMB' resolved to null 
at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100) 
at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:95) 

얼굴-config.xml에

,691 특별히 자신의 속성 또는 메서드 중 하나를 호출하지 않는 한 363,210
<faces-config 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd" 
    version="2.1"> 

    <application> 
     <resource-bundle> 
      <base-name>messages</base-name> 
      <var>bundle</var> 
     </resource-bundle> 
     <message-bundle>messages</message-bundle> 
    </application> 

    <navigation-rule> 
     <from-view-id>/login.xhtml</from-view-id> 
     <navigation-case> 
      <from-action>#{loginMB.login}</from-action> 
      <from-outcome>loggedIn</from-outcome> 
      <to-view-id>/index.xhtml</to-view-id> 
      <redirect /> 
     </navigation-case>  
    </navigation-rule> 
    <!-- <managed-bean> 
     <managed-bean-name>loginMB</managed-bean-name> 
     <managed-bean-class> com.sample.jsfjpa.beans.LoginMB</managed-bean-class> 
     <managed-bean-scope>request</managed-bean-scope> 
    </managed-bean> 
    <managed-bean> 
     <managed-bean-name>userMB</managed-bean-name> 
     <managed-bean-class> com.sample.jsfjpa.beans.UserMB</managed-bean-class> 
     <managed-bean-scope>session</managed-bean-scope> 
    </managed-bean> --> 
</faces-config> 

enter image description here

+0

을 아마 때문에 범위입니다 콩의, 나는 모른다. SessionScoped를 만들고 시도해보십시오. –

+0

@KorayTugay, 나는 그것을 시험해 보았다. 그러나 운이 없다. 그런데 나는 질문을 업데이트했다. 콩이 인스턴스화 된 것 같지 않습니다. – bluelabel

+0

빈에 액세스하는 방법을 보여주십시오. 생성자가 호출 될 때 필드는 주입되지 않습니다. – atamanroman

답변

2

관리 콩은 생성되지 않습니다. 이는 @ApplicationScoped (@ManagedBean(eager=true))을 제외한 모든 범위에서 발생하며 JSF 컨텍스트가로드 될 때 특별히 작성됩니다.

여기서 #{loginMB}을 참조하고 있지만 #{userMB}을 참조하지 않으므로 생성 할 기회가 없습니다.

예를하기 위해 귀하의 @SessionScoped 관리 Bean 당신은 당신의 로그인 페이지에 다음 코드를 추가 할 수 있습니다하십시오 listener that is executed 이전 페이지 렌더링을 설정

<f:metadata> 
    <f:event type="preRenderView" listener="#{userMB.initialize}" /> 
</f:metadata> 

합니다. 여기서 빈 메소드를 호출 할 수있다. (실행하기 위해 JSF는 이미 생성되지 않았다면 당신의 bean을 생성 할 것이다).

은 몇 가지 장점을 가지고 새로운 f:viewAction에 대한 preRenderView 방법을 대체 할 수있는 JSF 2.2에서 시작 (그것의 매개 변수가를 그리고 그것은 포스트 백에 호출되지 않습니다) :

<f:metadata> 
    <f:viewAction action="#{userMB.initialize}" /> 
</f:metadata> 
+0

login.xhtml에서 login 버튼을 클릭하면 아무런 문제가 발생하지 않습니다. javax.el.PropertyNotFoundException : /login.xhtml @ 14,83 value = "# {loginMB.email}": 대상에 연결할 수 없습니다. 식별자 'loginMB'가 com.sun.faces.facelets에서 null \t으로 확인되었습니다. el.TagValueExpression.getType (TagValueExpression.java:100) \t com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue (HtmlBasicInputRenderer.java:95)' – bluelabel

+0

그런 다음 주석이 어떤 식 으로든 생략 된 것 같습니다. 경로에 faces-config.xml 파일이 있습니까? 이 [link] (http://stackoverflow.com/questions/7519151/how-to-mix-annotations-with-faces-config-xml)를 확인하십시오. –

+0

이 faces-config 파일로 질문을 업데이트했습니다. – bluelabel