2016-04-07 4 views
1

Я сделал крючок из DocumentAndMedia. В portal.properties я написал com.liferay.portlet.documentlibrary.action.EditFileEntryAction = com.mycompany.acciones.Test, поэтому, когда я вижу представление ввода файла, я могу получить файл. Я хочу передать FileEntry в файл org.apache.chemistry.opencmis.client.runtime.DocumentImpl из файлаEntry.getModel(), чтобы получить дополнительные свойства, но исключение - это бросок.Liferay DocumentAndMedia hook with CMIS

Test Action Class

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) 

ответ

0

Если класс не может быть typecasted к другому классу, что он законно должен (даже самому себе), вы, безусловно, имеете компрометирующий класс или его суперкласс дважды в пути к классам. Проверьте свой путь к классам для дубликатов, разрешите его. Это может быть библиотека, которая находится в глобальном пути пути tomcat (tomcat/lib, или для Liferay также tomcat/lib/ext) или вашего веб-приложения (там в его WEB-INF/lib или WEB-INF/classes). . Или сочетание всех из них (как это несколько реализаций класса с тем же именем

избавиться от лишних те, рестарт, попробуйте еще раз

+0

спасибо, что ответили. Меня устраивает! Мне пришлось переместить apache chemistry libs (webapps/root/web-inf/lib) в tomcat/lib/ext и удалить их из myhook/web-inf/lib –

0

пакет тест;.

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

Это сработало для меня, но литой является DLFileEntry, а не DocumentImpl.

Зачем вам нужно org.apache.chemistry.opencmis.client.runtime.DocumentImpl и откуда вы знаете, что getModel() возвращается с этим типом объект?

+0

спасибо за ваш ответ. Я использую DocumentImpl, потому что я использую реализацию cmis на моем liferay. Мне нужны дополнительные атрибуты из этого объекта, которые DLFileEntry не имеет. Метод fileEntry.getModel() возвращает объект, но CmisFileEntry.getModel() возвращает cmis-документ –

Смежные вопросы