Liferay DocumentAndMedia 挂钩与 CMIS
Liferay DocumentAndMedia hook with CMIS
我从 DocumentAndMedia 制作了一个钩子。在 portal.properties 中我写了 com.liferay.portlet.documentlibrary.action.EditFileEntryAction=com.mycompany.acciones.Test 所以当我看到文件条目视图时我可以得到文件条目。我想从 fileEntry.getModel() 将 FileEntry 转换为 org.apache.chemistry.opencmis.client.runtime.DocumentImpl 文档以获得一些额外的属性,但抛出异常。
测试操作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;
}
}
堆栈跟踪
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)
如果一个 class 不能被类型转换为另一个 class 它合法地应该(甚至对它自己)你肯定有罪证 class 或其超级 class 在 class 路径上两次。检查您的 class 路径是否重复,解决它。它可能是 tomcat 的全局 class 路径(tomcat/lib
,或者对于 Liferay 也是 tomcat/lib/ext
)或您的网络应用程序(在其 WEB-INF/lib
或 WEB-INF/classes
)。或者它们的组合(因为它是 class 同名的多个实现。
去掉多余的,重启,再试。
打包测试;
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() returns 具有这种类型的对象?
我从 DocumentAndMedia 制作了一个钩子。在 portal.properties 中我写了 com.liferay.portlet.documentlibrary.action.EditFileEntryAction=com.mycompany.acciones.Test 所以当我看到文件条目视图时我可以得到文件条目。我想从 fileEntry.getModel() 将 FileEntry 转换为 org.apache.chemistry.opencmis.client.runtime.DocumentImpl 文档以获得一些额外的属性,但抛出异常。
测试操作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;
}
}
堆栈跟踪
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)
如果一个 class 不能被类型转换为另一个 class 它合法地应该(甚至对它自己)你肯定有罪证 class 或其超级 class 在 class 路径上两次。检查您的 class 路径是否重复,解决它。它可能是 tomcat 的全局 class 路径(tomcat/lib
,或者对于 Liferay 也是 tomcat/lib/ext
)或您的网络应用程序(在其 WEB-INF/lib
或 WEB-INF/classes
)。或者它们的组合(因为它是 class 同名的多个实现。
去掉多余的,重启,再试。
打包测试;
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() returns 具有这种类型的对象?