2017-05-31 4 views
0

開発者!リッチフェイス4.5.17 Menuitemアクションメソッドが動作しない

WebアプリケーションをJEE5からJEE7に移行しています。私の問題はプレゼンテーション層に関係しています。

すべてのシステムページがRichFaces 3.3.3から4.5.17に移行されています。私は正式な移行ガイド([https://developer.jboss.org/wiki/RichFacesMigrationGuide33x-4xMigration][1])、Richfacesフォーラム(https://developer.jboss.org/en/richfaces)、もちろんStackOverflowに従っています。しかし、誰も私の問題の解決策を教えてくれませんでした。

アプリメニューは、マネージドビーンで(xhtmlのタグではなく)dinamicallyで構築されています。これは、HtmlToolBar、HtmlDropDownMenu、HtmlMenuGroup、およびHtmlMenuItemクラスを使用して、RF 3.3.3で正常に機能しました。ただし、対応するRF4クラスに移行した後は、MenuItemアクションメソッドはもう起動しません。ユーザーがMenuItemをクリックすると、ページがリフレッシュされ、目的のページではなく現在のページ自体にリクエストが行われます。

移行コードは、下記の次の

ManagedBean

package br.gov.serpro.sfitweb.ui.managedbean; 

import java.io.Serializable; 

import javax.annotation.PostConstruct; 
import javax.el.ELContext; 
import javax.el.ExpressionFactory; 
import javax.enterprise.context.SessionScoped; 
import javax.faces.context.FacesContext; 
import javax.inject.Named; 

import org.apache.log4j.Logger; 
import org.richfaces.component.Mode; 
import org.richfaces.component.UIDropDownMenu; 
import org.richfaces.component.UIMenuGroup; 
import org.richfaces.component.UIMenuItem; 
import org.richfaces.component.UIToolbar; 

import br.gov.serpro.sfitweb.bean.entity.Usuario; 
import br.gov.serpro.sfitweb.bean.enums.Permissao; 
import br.gov.serpro.sfitweb.context.ContextFinder; 
import br.gov.serpro.sfitweb.context.SFITSecurityContext; 

@Named 
@SessionScoped 
public class MenuMBTrecho implements Serializable { 
    private static final long serialVersionUID = 1L; 

    private UIToolbar toolbar; 

    public MenuMBTrecho() { 
    } 

    @PostConstruct 
    public void init() { 
     montarToolbar(); 
    } 

    public void montarToolbar() { 
     FacesContext ctx = FacesContext.getCurrentInstance(); 

     this.toolbar = (UIToolbar) ctx.getApplication().createComponent(ctx, UIToolbar.COMPONENT_TYPE, 
       "org.richfaces.ToolbarGroupRenderer"); 

     // log.debug("User" + secCtx.getUserPrincipal().getCpf()); 

     UIDropDownMenu menuPlanejamento = new UIDropDownMenu(); 
     menuPlanejamento.setLabel("Planejamento"); 
     boolean mostraMenu = false; 

     ///////// Submenu PPA ///////// 
     boolean mostraSubMenuPPA = false; 
     UIMenuGroup subMenuPPA = new UIMenuGroup(); 
     subMenuPPA.setLabel("PPA"); 

     UIMenuItem menuItem = new UIMenuItem(); 
     menuItem.setMode(Mode.ajax); 
     menuItem.setLabel("Cadastrar período de PPA"); 
     ExpressionFactory factory = FacesContext.getCurrentInstance().getApplication().getExpressionFactory(); 
     ELContext ELCtx = FacesContext.getCurrentInstance().getELContext(); 
     menuItem.setActionExpression(
       factory.createMethodExpression(ELCtx, "#{ppaMB.listarPpas}", String.class, new Class[] {})); 

     subMenuPPA.getChildren().add(menuItem); 
    } 

    public UIToolbar getToolbar() { 
     return toolbar; 
    } 

    public void setToolbar(UIToolbar toolbar) { 
     this.toolbar = toolbar; 
    } 

} 

menu.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:richext="http://java.sun.com/jsf/composite/richext" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:rich="http://richfaces.org/rich" 
     xmlns:p="http://primefaces.org/ui"> 

     <div id="menu"> 
      <h:form id="menuForm">   
       <rich:toolbar binding="#{menuMB.toolbar}"/> 
      </h:form> 
     </div> 

    </ui:composition> 

common.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:rich="http://richfaces.org/rich"  
    xmlns:a4j="http://richfaces.org/a4j"> 

<f:view contentType="text/html"> 

    <h:head> 
     <ui:include src="/public/pages/scriptTags.xhtml" /> 
    </h:head> 

    <link rel="stylesheet" 
     href="#{configMB.context}/public/resources/styles/richfaces.css" /> 

    <h:body onload="ajustaAltura();" 
     style="width:100%; padding:0px; margin: 0px; border-spacing: 0px;"> 

     <h:form id="principalMenu"> 

     <rich:messages globalOnly="false" errorClass="errorFatalMessage" 
      fatalClass="errorFatalMessage" infoClass="infoMessage" 
      warnClass="warnMessage" showSummary="true" showDetail="true"> 
     </rich:messages> 

     <ui:insert name="top"> 
      <ui:include src="/public/pages/top.xhtml" /> 
     </ui:insert> 
     <ui:insert name="header"> 
      <ui:include src="/public/pages/header.xhtml" /> 
     </ui:insert> 
     <ui:insert name="menu"> 
      <ui:include src="/private/pages/menu.xhtml" /> 
     </ui:insert> 

     <div id="corpo" align="center"> 
      <rich:panel style="width: 97%;border:0"> 
       <ui:insert name="body" /> 
      </rich:panel> 
     </div> 
     <ui:insert name="footer"> 
      <ui:include src="/public/pages/footer.xhtml" /> 
     </ui:insert> 
     </h:form> 
    </h:body> 

</f:view> 
</html> 

のfaces-config.xmlの

<?xml version="1.0"?> 
    <faces-config version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"> 

     <application> 
      <resource-bundle> 
       <base-name>br.gov.serpro.sfitweb.utils.MsgReaderUTF8</base-name> 
       <var>msg</var> 
      </resource-bundle> 
     </application> 

     <lifecycle> 
      <phase-listener>br.gov.serpro.sfitweb.ui.MessagePhaseListener</phase-listener> 
     </lifecycle> 

     <application> 
      <locale-config> 
       <default-locale>en</default-locale> 
      </locale-config> 
      <resource-bundle> 
       <base-name>com.example.faces.i18n.Text</base-name> 
       <var>text</var> 
      </resource-bundle> 
     </application> 

    </faces-config> 

web.xmlの

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"> 
    <display-name>sfitweb</display-name> 
    <distributable /> 

    <context-param> 
     <param-name>com.sun.faces.expressionFactory</param-name> 
     <param-value>com.sun.el.ExpressionFactoryImpl</param-value> 
    </context-param> 

    <!-- parametros necessario para processar os JS internos do Richfaces https://developer.jboss.org/thread/203506 --> 
    <context-param> 
     <param-name>org.richfaces.resourceOptimization.enabled</param-name> 
     <param-value>true</param-value> 
    </context-param> 
    <servlet> 
     <servlet-name>Resource Servlet</servlet-name> 
     <servlet-class>org.richfaces.webapp.ResourceServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Resource Servlet</servlet-name> 
     <url-pattern>/org.richfaces.resources/*</url-pattern> 
    </servlet-mapping> 


    <context-param> 
     <param-name>javax.faces.FACELETS_LIBRARIES</param-name> 
     <param-value>/WEB-INF/tomahawk.taglib.xml; 
      /WEB-INF/taglib/sfit.taglib.xml;</param-value> 
    </context-param> 
    <context-param> 
     <param-name>javax.faces.CONFIG_FILES</param-name> 
     <param-value>/WEB-INF/faces-config.xml</param-value> 
    </context-param> 
    <context-param> 
     <param-name>javax.faces.DEFAULT_SUFFIX</param-name> 
     <param-value>.xhtml</param-value> 
    </context-param> 
    <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Development</param-value> 
    </context-param> 
    <context-param> 
     <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
     <param-value>server</param-value> 
    </context-param> 
    <!-- parametros do Richfaces 4 --> 

    <context-param> 
     <param-name>org.richfaces.enableControlSkinning</param-name> 
     <param-value>true</param-value> 
    </context-param> 
    <context-param> 
     <param-name>org.richfaces.skin</param-name> 
     <param-value>wine</param-value> 
    </context-param> 
    <context-param> 
     <param-name>weblets.CONFIG_FILES</param-name> 
     <param-value>weblets-config.xml</param-value> 
    </context-param> 

    <!-- https://developer.jboss.org/wiki/RichFacesMigrationGuide33x-4xMigration-Upgrading 
     filtro do richfaces nao eh mais necessario no JSF 2 --> 
    <filter> 
     <filter-name>MyFacesExtensionsFilter</filter-name> 
     <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class> 
     <init-param> 
      <param-name>uploadMaxFileSize</param-name> 
      <param-value>20m</param-value> 
     </init-param> 
    </filter> 


    <filter-mapping> 
     <filter-name>MyFacesExtensionsFilter</filter-name> 
     <servlet-name>Faces Servlet</servlet-name> 
    </filter-mapping> 
    <listener> 
     <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
    </listener> 
<!-- <listener> --> 
<!--  <listener-class>br.gov.serpro.sfitweb.context.SFITSecurityServletRequestListener</listener-class> --> 
<!-- </listener> --> 
    <listener> 
     <listener-class>net.java.dev.weblets.WebletsContextListener</listener-class> 
    </listener> 
    <!-- WebService para consulta de permissoes --> 
    <listener> 
     <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class> 
    </listener> 
    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    </servlet> 
    <servlet> 
     <servlet-name>Weblets Servlet</servlet-name> 
     <servlet-class>net.java.dev.weblets.WebletsServlet</servlet-class> 
    </servlet> 
    <servlet> 
     <servlet-name>ImageUploadServlet</servlet-name> 
     <servlet-class>br.gov.serpro.sfitweb.utils.ImageUploadServlet</servlet-class> 
    </servlet> 
    <servlet> 
     <servlet-name>ImageDownloadServlet</servlet-name> 
     <servlet-class>br.gov.serpro.sfitweb.utils.ImageDownloadServlet</servlet-class> 
    </servlet> 
    <servlet> 
     <servlet-name>PossuiPermissao</servlet-name> 
     <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.jsf</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>Weblets Servlet</servlet-name> 
     <url-pattern>/weblets/*</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>ImageUploadServlet</servlet-name> 
     <url-pattern>/imageUpload</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>ImageDownloadServlet</servlet-name> 
     <url-pattern>/image</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>PossuiPermissao</servlet-name> 
     <url-pattern>/PossuiPermissao</url-pattern> 
    </servlet-mapping> 
    <session-config> 
     <session-timeout>30</session-timeout> 
    </session-config> 
    <!-- Pages Configuration --> 
    <welcome-file-list> 
     <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 
    <error-page> 
     <error-code>404</error-code> 
     <location>/public/pages/error/HTTP404.jsf</location> 
    </error-page> 
    <error-page> 
     <error-code>500</error-code> 
     <location>/public/pages/error/HTTP500.jsf</location> 
    </error-page> 
    <error-page> 
     <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
     <location>/public/pages/login.jsf</location> 
    </error-page> 
    <error-page> 
     <exception-type>java.lang.Throwable</exception-type> 
     <location>/public/pages/error/global.jsp</location> 
    </error-page> 
</web-app> 

、少なくともこの問題の原因に私を指す任意の助けいただければ幸いしてください。

ありがとうございます!

ウィリアム

+0

@actionに問題がある場合は、それを表示する必要があります(言いたいことを言ってください)、HTML部分はほとんど関係がありません。 – Makhiel

+0

こんにちはマキエル!返信いただきありがとうございます !それは発射されていないので、アクションが何をしているかは関係ありません。たとえば、というタグが配置されていない(これはRF4がJavaScriptをロードしていない)場合など、RF4に関する問題があるため、xhtmlは意味があります。だからこそ私はxhtmlファイルを投稿した。また、私はweb.xmlとfaces-configを投稿しました。ありがとうございました ! – Bill

+0

ああ、ネストされたフォームを持っているように見えますが、それらを取り除きます。それが手動でメニューを作成し、それが動作するかどうかを確認するのに役立たない場合。 – Makhiel

答えて

0

解決済み!

1)変形のinit()ManagedBeanオン:

@PostConstruct 
    public void init(){ 
     menuPlanejamento = (UIDropDownMenu)FacesContext.getCurrentInstance().getApplication().createComponent(UIDropDownMenu.COMPONENT_TYPE); 
} 

2.)montarToolbar()メソッドにmenuItem.setMode(Mode.ajax)を追加しました。

3)は、XHTMLページ更新:

<div id="menu"> 
     <h:form id="menuForm"> 
      <rich:toolbar id="menuToolbar"> 
       <rich:dropDownMenu id="menuPlanejamento" binding="#{menuMB.menuPlanejamento}"/> 
      </rich:toolbar> 
     </h:form> 
    </div> 

それです!

関連する問題