0

Мне нужны данные процесса из другого компонента в методе ActionListener, но он бросает NullPointerException, поэтому я пытаюсь перезагрузить экземпляр компонента bean к следующему экземпляру в методе init() с аннотацией @PostConstruct, но он все еще бросает NullPointerException. Я знаю, что может получить bean throught FacesContext.getCurrentInstance().getApplication().evaluateExpressionGet(context, expression, expectedType);, но возможно ли это через @ManagedProperty? Это код:Как я могу ввести управляемое свойство в ActionListener

Login.java

package sklad; 

import javax.annotation.PostConstruct; 
import javax.faces.application.FacesMessage; 
import javax.faces.bean.ManagedProperty; 
import javax.faces.context.FacesContext; 
import javax.faces.event.AbortProcessingException; 
import javax.faces.event.ActionEvent; 
import javax.faces.event.ActionListener; 

public class Login implements ActionListener{ 
     private Osoba os; 

     @ManagedProperty(value="#{osoba}") 
     private Osoba osoba; 

     @PostConstruct 
     public void init(){ 
      os = osoba; 
     } 

     @Override 
     public void processAction(ActionEvent a) throws AbortProcessingException { 
      FacesContext context = FacesContext.getCurrentInstance(); 
      context.addMessage("zprava", new FacesMessage(os.getId().toString() + " " + os.getHeslo())); 

     } 

     public Osoba getOsoba() { 
      return osoba; 
     } 

     public void setOsoba(Osoba osoba) { 
      this.osoba = osoba; 
     } 

     public Osoba getOs() { 
      return os; 
     } 

     public void setOs(Osoba os) { 
      this.os = os; 
     } 
    } 

Osoba.java

package sklad; 

import javax.faces.application.FacesMessage; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
import javax.faces.context.FacesContext; 
import javax.faces.event.ActionEvent; 

    @ManagedBean 
    @SessionScoped 
    public class Osoba{ 
     private Integer id; 
     private String heslo; 

     public Osoba(){} 

     public Integer getId() { 
      return id; 
     } 

     public void setId(Integer id) { 
      this.id = id; 
     } 

     public String getHeslo() { 
      return heslo; 
     } 

     public void setHeslo(String heslo) { 
      this.heslo = heslo; 
     } 
    } 

login.xhtml

<!DOCTYPE html> 
<html xmlns:h="http://xmlns.jcp.org/jsf/html" 
    xmlns:f="http://xmlns.jcp.org/jsf/core" 
    xmlns:p="http://primefaces.org/ui"> 

<h:head> 
    <title>title</title> 
    <link rel="stylesheet" type="text/css" href="../styles/login.css" /> 
</h:head> 
<h:body> 
    <p:growl id="growl" showDetail="true" life="3000" /> 
    <p:panel id="panel_login" header="Přihlášení" styleClass="panel"> 
     <p:panelGrid styleClass="panelGrid"> 
      <h:form> 
       <p:row> 
        <p:column> 
         <h:outputText value="ID: " /> 
        </p:column> 
        <p:column> 
         <h:inputText id="id_login" value="${osoba.id}" /> 
        </p:column> 
       </p:row> 

       <p:row> 
        <p:column> 
         <h:outputText value="Heslo: " /> 
        </p:column> 
        <p:column> 
         <h:inputSecret id="heslo_login" value="${osoba.heslo}" /> 
        </p:column> 
       </p:row> 

       <p:row> 
        <p:column colspan="2"> 
         <h:commandButton id="btn_login" value="Přihlásit"> 
          <f:actionListener type="sklad.Login"/> 
         </h:commandButton> 
        </p:column> 
       </p:row> 
      </h:form> 
     </p:panelGrid> 
    </p:panel> 
</h:body> 
</html> 
+0

Интересно, что происходит, если вы не используете f: actionListener, но используете более традиционный метод прослушивателя действий, как показано здесь: http://www.mkyong.com/jsf2/jsf-2-actionlistener-example /. Если вы попробуете это так, как описано выше в этой статье, действительно ли происходит инъекция? – Gimby

+0

Ницца, он работает, спасибо. –

+0

Проверьте это: http: //www.tutorialspoint.com/jsf/jsf_actionlistener_tag.htm – YouYou

ответ

1

Более традиционный способ вызова прослушивателя действий является используйте метод связывания, например:

@ManagedBean 
@RequestScoped 
public class Login { 
    ... 

    public void doLogin(ActionEvent event){ 
    // handle action 
    } 
} 

А потом в кнопке:

<h:commandButton id="btn_login" value="Přihlásit" actionListener="#{login.doLogin}"/> 

Этот подход имеет преимущество превращения Login в ManagedBean, который сделает это так, что аннотации на нем будут обрабатываться JSF - и что делает @ManagedProperty аннотация работает, как ожидалось.

Смежные вопросы