IBM Portal 8.0中的请求范围问题

问题描述:

我有一个在Websphere Portal Server 8.0中运行的JSR 286 portlet。在那里,我做了一个文件上传,并在显示处理结果后。最初,我负责处理这个文件的托管bean有一个请求范围(@RequestScoped)。当我点击命令按钮上传文件时,MB中的方法会正确处理并填充必须在JSP页面中显示的结果集合(以下MB为dadosCarga属性)。然而,当我重新页面时,我得到了一个堆栈跟踪,说明我的Managed Bean类未找到(ClassNotFoundException),并且结果未显示。我使用ViewScoped获得了相同的结果。就在我将请求范围改为Session(@SessionScoped)时,结果显示出来了。IBM Portal 8.0中的请求范围问题

对于某些回答我找到googled后,我发现this page解释了Portlet中动作和呈现请求之间的区别。建议使用JSF Portlet bridge。但是,此页面不再有效。有一个Portlet bridge for Apache Myfaces(IBM门户运行MyFaces)。但是,我看不出如何使用它。它只是把两个罐子(API和实施)在WEB-INF/lib?我试过了,但是当我尝试在应用程序中加载页面时遇到了异常。所以我删除它们。

下面,我将显示我的Portlet配置,Managed Bean和JSP页面。有没有其他的选择,更好的想法如何处理这个?或者可能是关于如何使用correclty MyFaces Bridge的解释(我在主页中找不到任何内容)。

谢谢,

圣拉斐尔丰索

portlet配置

<portlet> 
    <portlet-name>CargaUsuarios</portlet-name> 
    <display-name>CargaUsuarios</display-name> 
    <portlet-class>com.ibm.faces20.portlet.FacesPortlet</portlet-class> 
    <init-param> 
     <name>com.ibm.faces.portlet.page.view</name> 
     <value>/pages/carga/cargaUsuarios.jsp</value> 
    </init-param> 
    <init-param> 
     <name>wps.markup</name> 
     <value>html</value> 
    </init-param> 
    <expiration-cache>0</expiration-cache> 
    <supports> 
     <mime-type>text/html</mime-type> 
     <portlet-mode>view</portlet-mode> 
    </supports> 
    <portlet-info> 
     <title>Carga de Usuarios</title> 
     <short-title>Carga deUsuarios</short-title> 
     <keywords>Carga Usuario</keywords> 
    </portlet-info> 
</portlet> 

Manged豆

@ManagedBean(name = "cargaUsuariosMB") 
@RequestScoped 
public class CargaUsuariosMB extends AbstractMB { 

    private String nomeArquivo; // FIle name 

    private Collection<CargaUsuarioInfoBean> dadosCarga; // processing result. 

    public String doUploadArquivo() { 
     this.dadosCarga = ... // process file and receives a collection 

     this.nomeArquivo = ... // get uploaded file name 

     return null; // Return to same origin page 
    } 

    // Getters... 

} 

Ĵ SP页面(cargaUsuarios.jsp)

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%> 
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%> 
<%@taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%> 
<%@taglib 
    uri="http://www.ibm.com/xmlns/prod/websphere/portal/v6.1/portlet-client-model" 
    prefix="portlet-client-model"%> 
<%@page language="java" contentType="text/html" 
    pageEncoding="ISO-8859-1" session="false"%> 

<portlet:defineObjects /> 
<portlet-client-model:init> 
    <portlet-client-model:require module="ibm.portal.xml.*" /> 
    <portlet-client-model:require module="ibm.portal.portlet.*" /> 
</portlet-client-model:init> 
<f:view> 
    <h2>Carga de Usuários</h2> 
    <h:form enctype="multipart/form-data"> 
     <p> 
      <label for="arquivoCarga"> <span>File:</span> </label> <input 
       type="file" name="arquivoCarga" id="FileCarga" /> 
     </p> 
     <br /> 
     <br /> 
     <h:commandButton value="Salvar File" 
        action="#{cargaUsuariosMB.doUploadArquivo}"></h:commandButton> 
    </h:form> 
    <h:panelGroup id="pnlProcessamento" 
     rendered="#{not empty cargaUsuariosMB.dadosCarga }"> 
     <h:outputText 
      value="Dados do File #{cargaUsuariosMB.nomeArquivo} processados com sucesso."></h:outputText> 
     <br /> 
     <h:dataTable id="tblDadosProcessamento" 
      columnClasses="numLinha,cpf,status" 
      value="#{cargaUsuariosMB.dadosCarga}" var="dadosCarga" 
      styleClass="dadosProcessamento" width="100%" border="1"> 
      <%-- Show processing results. --%> 
     </h:dataTable> 
    </h:panelGroup> 
    <h:messages styleClass="messages" id="msgsPesquisaCadastro" 
     errorClass="mensagensErro" errorStyle="color: red;"></h:messages> 
</f:view> 

你说得对有关渲染和动作请求,JSF(或CDI)请求和ViewScoped不能正常工作。但解决方案可以使用JBoss Portlet Bridge,其中包含全新的范围 - PortletLifecycleScoped和PortletRedisplayScoped。第一个将像RequestScope一样运行,您将在docs中找到更多信息。但是,我不确定能否在GateIn以外的其他门户网站中使用这些范围。

当您使用请求范围时,需要将数据从portlet操作传送到portlet呈现阶段。数据通常通过portlet呈现请求范围的bean,呈现参数是一个String。为了让你的数据保存在那里,你的对象需要是可序列化的。

除此之外,您可能希望将WebSphere Portal下的WebSphere Application Server升级到8.0.0.6版,以避免PM79460以及Portal本身升级到最新的FixPack。

希望这会有所帮助。

BTW:JSR286和JEE6没有指定CDI应如何与Portlet编程模型进行交互。你可能想看看JSR362

请尝试在portlet中添加以下内容。XML,看看它的工作原理:

<container-runtime-option> 
    <name>javax.portlet.actionScopedRequestAttributes</name> 
    <value>true</value> 
</container-runtime-option> 

欲了解更多信息,请下载并检查的Portlet V2.0规范以下部分: PLT.10.4.4运行选项 javax.portlet.actionScopedRequestAttributes

IBM使用它自己的portlet桥。除此之外,不建议使用任何桥接器。