2016-11-03 20 views
0

このページがロードされると、viewparamが使用され、コンバータを使用してオブジェクトが取得されます。JSF - paginatorがViewScoped Beanで使用されている場合のf:paramの受け渡し

イムviewParamがcom.civi.HelloWorld.controllerでjava.lang.Long.parseLong(不明なソース) でコンバータ

に渡されていないため、ページネータが使用され、次のエラーを取得。 UserConverter.getAsObject(UserConverter.java:36)

ページが更新されるたびに、パラメータが渡される必要があります。

だから私はFを送信する必要がDataTableのpagintorを使用して:PARAM INORDER viewParamは、オブジェクトをロードするために、コンバータを使用するため

<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; 
    } 

} 

コンバータ

@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

正確にページをリロードしていますか?それはすべて必要か、あなたはajaxを使用できませんか? – djmj

+0

ページテーブルを変更したり、RowsPerPageDropdownを使用してページングを使用すると、ページが再読み込みされてviewParamを取得しようとしていますが、f:paramは現時点では何も渡しません – blitzeus

+0

'h:form'データテーブルの周り? PrimeFaces Datatableページネーションは、デフォルトでページをリフレッシュしません。これはAJAXコンポーネントです。 – djmj

答えて

1

データテーブルの周囲にh:formが必要です。 AJAXコンポーネントであり、改ページ時にページをリロードしません。

基本的なGETページのリンクについては、すべてのリダイレクトにビューのパラメータを渡す必要があります。それ以外の場合は失われます。

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

ヒント:

使用omnifaces O:PARAM、それはあなたの変換ロジックのDRYを保つために、コンバータの属性を提供するので、このような何か。

+0

通常は必要ありません。 'o:viewParam'を使ってみましたか?そうでなければ、より多くのヘルプを得るためにもう少しBeanコードを表示する必要があります。 – djmj

関連する問題