2016-11-03 2 views
0

Wenn diese Seite geladen wird, wird ein Viewparam verwendet und ein Konverter zum Abrufen eines Objekts verwendet.JSF - Übergeben eines f: param, wenn der Paginator in einer ViewScoped-Bean verwendet wird

Im den folgenden Fehler bekommen, wenn der paginator verwendet, weil der viewParam ist nicht auf den

bei java.lang.Long.parseLong (Unknown Source) bei com.civi.HelloWorld.controller Wandler weitergegeben werden. UserConverter.getAsObject (UserConverter.java:36)

Jedes Mal, wenn die Seite aktualisiert wird, muss ein Parameter übergeben werden.

Also, wenn der pagintor in der Datentabelle mit Ich brauche die f zu senden: param inorder für den viewParam den Konverter zu verwenden, um das Objekt

<f:metadata> 
    <f:viewParam 
     name="idUser" 
     value="#{userBean.tipTourUser}" 
     converter="#{userConverter}" 
     required="true" 
     requiredMessage="Bad request. Please use a link from within the system." /> 
</f:metadata> 


<h:form id="abc" styleClass="simpleformstyle"> 
<p:dataTable id="transactionsTable" 
    var="transaction" 
    resizableColumns="true" 
    value="#{userBean.tipTourUser.tips}" 
    rendered="#{not empty userBean.tipTourUser.tips}" 

    rows="2" 
    paginator="true" 
    paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
    rowsPerPageTemplate="1,2,3" 
    paginatorPosition="bottom" > 

//SOMETHING LIKE THIS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    <f:param name="idUser" value="#{userBean.tipTourUser.idUser}" />  
//SOMETHING LIKE THIS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 

    <p:column> 
     <f:facet name="header"> 
      <h:outputText style="float: left;" value="Date received" />  
     </f:facet> 
     <h:outputText value="#{transaction.received}" > 
      <f:convertDateTime pattern="d-M-yyyy" /> 
     </h:outputText> 
    </p:column> 
</p:dataTable> 
</h:form> 

UserBean

@ViewScoped 
@Named 
public class UserBean implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @EJB 
    private UserService userService; 

    private User tipTourUser; 

    private boolean editmode; 


    //sets the edit mode and stores the original values 
    public void edit() { 
     editmode = true;  
    } 


    //resets the original values and leaves the edit mode 
    public void cancel() { 
     editmode = false; 
    } 


    //saves updated values and leavers the edit mode 
    public void save(User user) {       
     tipTourUser = userService.updateUser(user); 

     editmode = false;  
    } 


    public boolean isEditmode() { 
     return editmode; 
    } 


    public User getTipTourUser() { 
     return tipTourUser; 
    } 


    public void setTipTourUser(User tipTourUser) { 
     this.tipTourUser = tipTourUser; 
    } 

} 

Converter

zu laden
@Named 
@RequestScoped 
public class UserConverter implements Converter 
{ 
    @EJB 
    private UserService userService; 


    public UserConverter() { 
    } 

    //get User object from idUser, key = idUser 
    @Override 
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String key) throws ConverterException {   
     return userService.getUser(Long.parseLong(key)); 
    } 


    @Override 
    public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) throws ConverterException { 
     return arg2.toString(); 
    } 
} 
+0

Wann genau laden Sie die Seite neu? Ist es überhaupt notwendig oder kannst du keinen Ajax benutzen? – djmj

+0

Wenn ich die Seitennummerierung in der Datentabelle verwende (Seiten wechseln oder RowsPerPageDropdown), wird die Seite neu geladen und versucht, den viewParam zu erhalten, aber der f: -Parameter gibt gerade nichts weiter als – blitzeus

+0

Sie haben ein 'h: form' um die Datentabelle? PrimeFaces Datatable Paginierung aktualisiert die Seite nicht standardmäßig. Es ist eine AJAX-Komponente. – djmj

Antwort

1

Sie brauchen eine h:form um Ihre Datentabelle, dann ist es eine AJAX-Komponente und nicht die Seite bei Seitenumbruch neu zu laden.

Für grundlegende GET-Seitenverknüpfungen müssen Sie den Ansichtsparameter an jede Umleitung übergeben. Sonst ist es verloren. Etwas wie folgt aus:

<h:link> 
    <o:param name="idUser" value="#{userBean.tipTourUser}" converter="#{userConverter}" /> 
    <f:param name="page" value="#{userBean.page}" /> 
</h:link> 

Hinweis:

Verwendung omnifaces o: param, da es einen Konverter Attribut stellt Ihre Conversion-Logik trocken zu halten.

+0

Normalerweise brauchen Sie es nicht. Haben Sie versucht, 'o: viewParam' zu verwenden? Sonst müssen Sie mehr Bean-Code anzeigen, um mehr Hilfe zu erhalten. – djmj

Verwandte Themen