Alfresco Share 5.2中如何将自定义链接设为文档名称?
问题描述
我正在使用Alfresco Share 5.2,尝试将自定义链接设置为文档名称的一部分。具体来说,我有一个用于创建新Excel文件并保存到「我的文件」目录指定位置的按钮,该Excel文件中存储了用于打开搜索结果页的链接。
我想将该链接设置为Alfresco中的文档名称(例如,将原本的「Search_Results.xslx」替换为类似「Search_results_link」的名称,点击文档名称即可打开对应页面),但设置时出现了异常。
异常信息
org.springframework.extensions.webscripts.WebScriptException: 02210015 Wrapped Exception (with status template): org.apache.poi.xssf.usermodel.XSSFHyperlink cannot be cast to java.io.Serializable at org.springframework.extensions.webscripts.AbstractWebScript.createStatusException(AbstractWebScript.java:1138) at org.springframework.extensions.webscripts.DeclarativeWebScript.execute(DeclarativeWebScript.java:171) at org.alfresco.repo.web.scripts.RepositoryContainer$3.execute(RepositoryContainer.java:519) at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:464) at org.alfresco.repo.web.scripts.RepositoryContainer.transactionedExecute(RepositoryContainer.java:587) at org.alfresco.repo.web.scripts.RepositoryContainer$4.doWork(RepositoryContainer.java:664) at org.alfresco.repo.security.authentication.AuthenticationUtil.runAs(AuthenticationUtil.java:555) at org.alfresco.repo.web.scripts.RepositoryContainer.transactionedExecuteAs(RepositoryContainer.java:668) at org.alfresco.repo.web.scripts.RepositoryContainer.executeScriptInternal(RepositoryContainer.java:428) at org.alfresco.repo.web.scripts.RepositoryContainer.executeScript(RepositoryContainer.java:308) at org.springframework.extensions.webscripts.AbstractRuntime.executeScript(AbstractRuntime.java:399) at org.springframework.extensions.webscripts.AbstractRuntime.executeScript(AbstractRuntime.java:210) at org.springframework.extensions.webscripts.servlet.WebScriptServlet.service(WebScriptServlet.java:132) at javax.servlet.http.HttpServlet.service(HttpServlet.java:770) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.alfresco.web.app.servlet.GlobalLocalizationFilter.doFilter(GlobalLocalizationFilter.java:68) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
相关代码片段
XSSFWorkbook document = new XSSFWorkbook(); XSSFSheet sheet = document.createSheet(nameOfFile); XSSFRow row = sheet.createRow(0); XSSFRow rowSecond = sheet.createRow(1); XSSFRow rowThird = sheet.createRow(2); XSSFCell cell = row.createCell(0); XSSFCell cellWithValue = rowSecond.createCell(0); XSSFCell cellWithLink = rowThird.createCell(0); cell.setCellValue("Link to fetch search results:"); cellWithValue.setCellValue(urlLink); XSSFHyperlink link = document.getCreationHelper().createHyperlink(Hyperlink.LINK_URL); XSSFCellStyle style = document.createCellStyle(); XSSFFont font = document.createFont(); font.setUnderline(HSSFFont.U_SINGLE); font.setColor(IndexedColors.BLUE.index); style.setFont(font); cellWithLink.setCellValue("Click here"); link.setAddress(urlLink); cellWithLink.setHyperlink(link); cellWithLink.setCellStyle(style); link.setLabel("ResultSearch"); Map<QName, Serializable> props = new HashMap<QName, Serializable>(); props.put(ContentModel.PROP_NAME, (Serializable) link);
问题原因与解决方案
原因分析
异常的核心是:Alfresco的节点属性(包括文档名称PROP_NAME)要求值必须实现java.io.Serializable接口,但XSSFHyperlink对象并不满足这个要求,强制类型转换导致报错。同时,Alfresco的文档名称本质是字符串,无法直接存储可点击的链接对象。
可行解决思路
自定义文档名称的渲染逻辑
- 保持文档名称为字符串(例如
Search_Results_Link.xlsx),将链接URL存储到文档的自定义属性中(需先在Alfresco数据字典中定义该属性)。 - 扩展Share的文档列表组件,在渲染文档名称时,读取自定义属性中的URL,将名称渲染为可点击的
<a>标签。
- 保持文档名称为字符串(例如
修正属性赋值逻辑
先避免异常,将文档名称设为合法的字符串,再存储链接到其他属性:// 修正后的属性设置代码 Map<QName, Serializable> props = new HashMap<QName, Serializable>(); // 使用字符串作为文档名称 props.put(ContentModel.PROP_NAME, "Search_Results_Link.xlsx"); // 假设已定义自定义属性cm:searchLink,存储链接URL props.put(QName.createQName("http://yourcompany.com/model/content/1.0", "searchLink"), urlLink);利用文档描述或默认属性存储链接
如果不想新增自定义属性,可以将链接URL存储到文档的cm:description属性中,再通过定制Share界面将文档名称关联到该链接。
内容的提问来源于stack exchange,提问作者Mike1988B
相关产品推荐
相关产品推荐

