2016-04-07 10 views
1

Ich habe einen Haken von DocumentAndMedia. In portal.properties habe ich com.liferay.portlet.documentlibrary.action.EditFileEntryAction = com.mycompany.acciones.Test geschrieben, also kann ich den Dateieintrag bekommen, wenn ich die Dateiansicht sehe. Ich möchte FileEntry in das Dokument org.apache.chemistry.opencmis.client.runtime.DocumentImpl aus dem FileEntry.getModel() umwandeln, um einige zusätzliche Eigenschaften zu erhalten, aber eine Ausnahme ist throw.Liferay DocumentAndMedia Haken mit CMIS

Test Action Klasse

package com.mycompany.acciones; 

import javax.portlet.*; 
import org.apache.chemistry.opencmis.client.runtime.*; 
import com.liferay.portal.kernel.repository.model.*; 
import com.liferay.portal.kernel.struts.*; 
import com.liferay.portal.kernel.util.*; 

public class Test extends BaseStrutsPortletAction{ 

    public void processAction(StrutsPortletAction originalStrutsPortletAction, PortletConfig portletConfig, ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { 

     originalStrutsPortletAction.processAction(originalStrutsPortletAction, portletConfig, actionRequest, actionResponse); 
    } 

    @Override 
    public String render(StrutsPortletAction originalStrutsPortletAction,PortletConfig portletConfig,RenderRequest renderRequest, RenderResponse renderResponse) throws Exception { 

     String ret = originalStrutsPortletAction.render(null, portletConfig, renderRequest, renderResponse); 
     renderRequest.setAttribute(WebKeys.PORTLET_DECORATE, Boolean.TRUE); 

     FileEntry fileEntry = (FileEntry)renderRequest.getAttribute("DOCUMENT_LIBRARY_FILE_ENTRY"); 

     // Exception is throws here 
     DocumentImpl doc = (DocumentImpl)fileEntry.getModel();  

     String propertyName = doc.getProperties().get(0).getDisplayName(); 
     String propertyvalue = doc.getProperties().get(0).getValue(); 

     String propertyName2 = doc.getProperties().get(1).getDisplayName(); 
     String propertyvalue2 = doc.getProperties().get(1).getValue(); 

     return ret; 
    } 
} 

Stacktrace

17:33:52,796 ERROR [http-bio-8080-exec-398][render_portlet_jsp:154] java.lang.ClassCastException: org.apache.chemistry.opencmis.client.runtime.DocumentImpl cannot be cast to org.apache.chemistry.opencmis.client.runtime.DocumentImpl 
    at com.mycompany.acciones.Test.render(Test.java:31) 
    at com.liferay.portal.kernel.bean.ClassLoaderBeanHandler.invoke(ClassLoaderBeanHandler.java:67) 
    at com.liferay.portal.struts.PortletActionAdapter.render(PortletActionAdapter.java:74) 
    at com.liferay.portal.struts.PortletAction.execute(PortletAction.java:111) 
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) 
    at com.liferay.portal.struts.PortletRequestProcessor.processActionPerform(PortletRequestProcessor.java:441) 
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236) 
    at com.liferay.portal.struts.PortletRequestProcessor.process(PortletRequestProcessor.java:224) 
    at com.liferay.portlet.StrutsPortlet.include(StrutsPortlet.java:274) 
    at com.liferay.portlet.StrutsPortlet.doView(StrutsPortlet.java:153) 
    at com.liferay.portal.kernel.portlet.LiferayPortlet.doDispatch(LiferayPortlet.java:218) 
    at javax.portlet.GenericPortlet.render(GenericPortlet.java:233) 
    at com.liferay.portlet.FilterChainImpl.doFilter(FilterChainImpl.java:100) 
    at com.liferay.portal.kernel.portlet.PortletFilterUtil.doFilter(PortletFilterUtil.java:64) 
    at com.liferay.portlet.InvokerPortletImpl.invoke(InvokerPortletImpl.java:548) 
    at com.liferay.portlet.InvokerPortletImpl.invokeRender(InvokerPortletImpl.java:607) 
    at com.liferay.portlet.InvokerPortletImpl.render(InvokerPortletImpl.java:359) 
    at org.apache.jsp.html.portal.render_005fportlet_jsp._jspService(render_005fportlet_jsp.java:1207) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 

Antwort

0

Wenn eine Klasse kann nicht auf eine andere Klasse typecasted werden, sollte es legitim (auch sich selbst), die Sie auf jeden Fall die belastenden Klasse haben oder ihre Superklasse zweimal auf dem Klassenpfad. Überprüfen Sie Ihren Klassenpfad auf Duplikate, beheben Sie ihn. Es könnte sich um eine Bibliothek handeln, die sich im globalen Klassenpfad von Tomcat befindet (tomcat/lib oder für Liferay auch tomcat/lib/ext) oder Ihre Webapplikation (dort in WEB-INF/lib oder WEB-INF/classes). . Oder eine Kombination aus allen von ihnen (wie es mehrere Implementierungen einer Klasse mit dem gleichen Namen ist

Sie sich von den Überflüssigen befreit, neu starten, versuchen Sie es erneut

+0

Vielen Dank für Ihre Antwort. Für mich geht das! Ich musste die Apache-Chemie-Bibliotheken (webapps/root/web-inf/lib) nach tomcat/lib/ext verschieben und sie aus myhook/web-inf/lib –

0

Paket Test;.

import javax.portlet.ActionRequest; 
import javax.portlet.ActionResponse; 
import javax.portlet.PortletConfig; 
import javax.portlet.RenderRequest; 
import javax.portlet.RenderResponse; 

import com.liferay.portal.kernel.repository.model.FileEntry; 
import com.liferay.portal.kernel.struts.BaseStrutsPortletAction; 
import com.liferay.portal.kernel.struts.StrutsPortletAction; 
import com.liferay.portal.kernel.util.WebKeys; 
import com.liferay.portlet.documentlibrary.model.DLFileEntry; 

public class EditFileEntryAction extends BaseStrutsPortletAction { 

    public void processAction(StrutsPortletAction originalStrutsPortletAction, PortletConfig portletConfig, ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { 

      originalStrutsPortletAction.processAction(originalStrutsPortletAction, portletConfig, actionRequest, actionResponse); 
     } 

     @Override 
     public String render(StrutsPortletAction originalStrutsPortletAction,PortletConfig portletConfig,RenderRequest renderRequest, RenderResponse renderResponse) throws Exception { 

      String ret = originalStrutsPortletAction.render(null, portletConfig, renderRequest, renderResponse); 
      renderRequest.setAttribute(WebKeys.PORTLET_DECORATE, Boolean.TRUE); 

      FileEntry fileEntry = (FileEntry)renderRequest.getAttribute("DOCUMENT_LIBRARY_FILE_ENTRY"); 

      // Exception is throws here 
      DLFileEntry doc = (DLFileEntry)fileEntry.getModel();  


      return ret; 
     } 
} 

Dies funktioniert für mich, aber die Besetzung ist DLFileEntry, nicht DocumentImpl.

Warum brauchen Sie org.apache.chemistry.opencmis.client.runtime.DocumentImpl und woher wissen Sie, dass getModel() mit dieser Art von zurückgibt Objekt?

+0

löschen, danke für deine Antwort. Ich benutze DocumentImpl, weil ich die cmis-Implementierung auf meinem liveray verwende. Ich brauche einige zusätzliche Attribute von diesem Objekt, die DLFileEntry nicht hat. Die Methode fileEntry.getModel() gibt ein Objekt zurück, aber das CmisFileEntry.getModel() gibt ein cmis-Dokument zurück –