2013-07-04 1 views
0

Websphere Portal Server 8.0에서 JSR 286 포틀릿을 실행하고 있습니다. 거기에 파일 업로드를하고 처리 결과를 보여줍니다. 처음에는이 파일을 처리 할 책임이있는 관리 빈이 Request Scope (@RequestScoped)를 가지고있다. 커맨드 버튼을 클릭하여 파일을 업로드하면 MB 단위의 메소드가 올바르게 처리되고 JSP 페이지에 표시되어야하는 결과 모음 (아래의 MB의 dadosCarga 속성)이 채워집니다. 그러나, 페이지가 rederized 때 내 관리 Bean 클래스 (ClassNotFoundException) 찾을 수 없습니다 및 결과가 표시되지 않는 설명 stacktrace 있어요. ViewScoped를 사용하여 동일한 결과를 얻었습니다. 범위를 요청에서 세션 (@SessionScoped)으로 변경했을 때 결과가 표시됩니다.IBM 포털 8.0의 요청 범위 문제

일부 대답에 대한 답변이 googled 인 경우 포틀릿에서 작업과 렌더링 요청의 차이점에 대해 설명하는 this page을 발견했습니다. JSF Portlet bridge을 사용하는 것이 좋습니다. 그러나이 페이지는 더 이상 활성화되지 않습니다. Portlet bridge for Apache Myfaces (MyFaces를 통해 IBM 포털이 실행 됨)이 있습니다. 그러나, 나는 그것을 사용하는 방법을 볼 수 없었다. 단지 WEB-INF/lib에 양쪽 항아리 (API 및 구현)를 넣었습니까? 시도했지만 응용 프로그램에서 페이지를로드 할 때 예외가 발생했습니다. 그래서 나는 그들을 제거합니다.

아래에는 내 포틀릿 구성, Managed Bean 및 JSP 페이지가 나와 있습니다. 이 문제를 어떻게 처리 할 수있는 대안이 있습니까? 또는 correx MyFaces Bridge를 사용하는 방법에 대한 설명이 될 수도 있습니다 (홈 페이지에서 찾을 수 없음).

감사합니다,

라파엘 아폰소

포틀릿 구성 :

@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... 

} 

J : 콩 선택 게재

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

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> 

답변

0

당신은 약 맞아 렌더링 및 작업 요청, JSF (또는 CDI) 요청 및 ViewScoped가 제대로 작동하지 않습니다. 그러나 솔루션은 JBoss Portlet Bridge을 사용하여 새로운 범위 인 PortletLifecycleScoped 및 PortletRedisplayScoped를 포함 할 수 있습니다. 첫 번째는 RequestScope와 똑같이 동작하며 docs에서 자세한 정보를 찾을 수 있습니다. 그러나 GateIn을 제외한 다른 포털에서이 범위를 사용할 수 있는지 여부는 확실하지 않습니다.

0

요청 범위를 사용하는 경우 데이터를 포틀릿 작업에서 포틀릿 렌더링 단계로 전송해야합니다. 데이터는 일반적으로 포틀릿을 통해 요청 범위 Bean에 대해 전달됩니다. 렌더링 매개 변수는 String입니다. 데이터를 거기에 저장하려면 객체를 직렬화 할 수 있어야합니다.

이외에도 PM79460 및 Portal 자체를 최신 FixPack으로 피하기 위해 WebSphere Portal 아래의 WebSphere Application Server를 버전 8.0.0.6으로 업그레이드 할 수 있습니다.

희망이 도움이됩니다.

BTW : JSR286 및 JEE6은 CDI가 포틀릿 프로그래밍 모델과 상호 작용하는 방법을 지정하지 않습니다. 이를 위해서는 JSR362을보고 싶을 것입니다.

1

포틀릿에 다음을 추가하십시오.

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

를 다운로드하고 다음 포틀릿 V2.0 스펙의 섹션을 확인하시기 바랍니다 자세한 내용은 : javax.portlet.actionScopedRequestAttributes

0

IBM을 PLT.10.4.4 런타임 옵션을 작동하면 XML 및 참조 자체 포틀릿 브리지를 사용합니다. 이 외에도 교량을 사용하지 않는 것이 좋습니다.