Alfresco 4.2.2中Share自定义Evaluator编写方法求助
看起来你在给Alfresco Share做自定义操作Evaluator时踩了几个典型的坑——混淆了Repository和Share端的类体系,导致类加载失败、配置不生效等问题。下面我会一步步帮你理清问题根源,并给出完整的可运行解决方案:
问题根源拆解
先帮你把遇到的三个问题的本质说清楚:
- 用了Repository端的基类:你继承的
org.alfresco.web.ui.common.component.evaluator.BaseEvaluator是Alfresco核心Repository模块的类,Share作为独立Web应用,classpath里没有这个类,所以启动直接报NoClassDefFoundError。 - 错误的接口选择:
org.alfresco.web.action.ActionEvaluator同样属于Repository端,Share端的Evaluator有自己独立的接口体系,不能混用。 - 跨应用类无法访问:Share和Repository是两个完全独立的Web应用,各自有自己的类加载器,你把Evaluator打包到Repository的lib下,Share的Spring上下文根本找不到这个类。
正确实现步骤
1. 选对Share端的Evaluator基类
在Alfresco 4.2.x的Share中,文档库(DocLib)的操作Evaluator应该继承Share端专属的org.alfresco.web.evaluator.BaseEvaluator(注意包名是org.alfresco.web.evaluator,和Repository端的基类包名完全不同)。这个基类会帮你处理获取当前节点、上下文的逻辑,你只需要重写核心的判断方法即可。
2. 编写正确的Evaluator代码
下面是修正后的代码,实现"仅当前用户是文档创建者时返回true"的逻辑:
package com.firm.alfresco.alf221.evaluators; import org.alfresco.web.evaluator.BaseEvaluator; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.springframework.extensions.surf.RequestContext; import org.springframework.extensions.surf.support.ThreadLocalRequestContext; import org.springframework.extensions.webscripts.connector.User; public class UsersCompareEvaluator extends BaseEvaluator { // 通过Spring注入Share端代理的Repository服务 private NodeService nodeService; public void setNodeService(NodeService nodeService) { this.nodeService = nodeService; } @Override public boolean evaluate(NodeRef nodeRef) { if (nodeRef == null) { return false; } // 获取当前登录用户 RequestContext requestContext = ThreadLocalRequestContext.getRequestContext(); User currentUser = requestContext.getUser(); if (currentUser == null) { return false; } String currentUserName = currentUser.getName(); // 获取文档的创建者(cm:creator是Alfresco内置属性) String creator = (String) nodeService.getProperty(nodeRef, org.alfresco.model.ContentModel.PROP_CREATOR); // 比较用户名,返回判断结果 return currentUserName.equals(creator); } }
3. 配置Share端的Spring上下文
在你的alf221-action-share-slingshot-application-context.xml中,正确配置Evaluator的Bean,并注入所需的服务(Share可以通过Spring代理访问Repository的核心服务):
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'> <beans> <!-- 加载自定义消息文件 --> <bean id="com.firm.alf221-action-share.resources" class="org.springframework.extensions.surf.util.ResourceBundleBootstrapComponent"> <property name="resourceBundles"> <list> <value>alfresco.web-extension.messages.alf221-action-share</value> </list> </property> </bean> <!-- 你之前的文档状态判断Evaluator,保持不变 --> <bean id="evaluator.doclib.action.isDocumentOnApproval" parent="evaluator.doclib.metadata.value"> <property name="accessor" value="node.properties.idocs:documentStatus" /> <property name="comparator"> <bean class="org.alfresco.web.evaluator.StringEqualsComparator"> <property name="value" value="onApproval" /> </bean> </property> </bean> <!-- 自定义作者判断Evaluator,注入NodeService --> <bean id="evaluator.doclib.action.isCurrentUserAuthor" class="com.firm.alfresco.alf221.evaluators.UsersCompareEvaluator"> <property name="nodeService" ref="nodeService" /> </bean> </beans>
4. 配置Share的文档库操作
你的share-config-custom.xml配置已经正确引用了两个Evaluator(两个Evaluator都满足时才会显示操作),保持原样即可:
<alfresco-config> <config evaluator="string-compare" condition="DocLibActions"> <actions> <action id="firm-exclude-participant" type="javascript" label="actions.firm.exclude-participant" icon="document-change-type"> <param name="function">onActionTkbFormDialog</param> <permissions> <permission allow="true">Write</permission> </permissions> <param name="itemKind">action</param> <param name="itemId">exclude-participant</param> <param name="mode">create</param> <param name="successMessage">message.exclude-participant.success</param> <param name="failureMessage">message.exclude-participant.failure</param> <!-- 两个条件都满足才显示操作 --> <evaluator>evaluator.doclib.action.isDocumentOnApproval</evaluator> <evaluator>evaluator.doclib.action.isCurrentUserAuthor</evaluator> </action> </actions> <actionGroups> <actionGroup id="document-details"> <action index="500" id="firm-exclude-participant" /> </actionGroup> </actionGroups> </config> </alfresco-config>
5. 打包与部署注意事项
- 将你的自定义代码打包成JAR(比如
alf221-action-share.jar),放到Share应用的/opt/tomcat7/webapps/share/WEB-INF/lib目录下。 - 将Spring配置文件
alf221-action-share-slingshot-application-context.xml放到/opt/tomcat7/webapps/share/WEB-INF/classes/alfresco/web-extension/目录。 - 将
share-config-custom.xml放到/opt/tomcat7/webapps/share/WEB-INF/classes/alfresco/web-extension/目录(如果已有该文件,合并内容即可)。 - 重启Tomcat服务器,让配置生效。
验证方式
- 用用户A登录Share,创建一个文档并将其状态设为
onApproval,查看文档详情页,确认firm-exclude-participant操作显示正常。 - 切换到用户B登录,查看同一个文档的详情页,确认该操作不显示。
- 再用用户A登录,把文档状态改成非
onApproval,确认操作也会隐藏(因为两个Evaluator需要同时满足)。
内容的提问来源于stack exchange,提问作者user1134181
相关产品推荐
相关产品推荐

