You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Alfresco 4.2.2中Share自定义Evaluator编写方法求助

Alfresco 4.2.2 Share: 自定义文档操作Evaluator实现仅作者可见的正确方案

看起来你在给Alfresco Share做自定义操作Evaluator时踩了几个典型的坑——混淆了Repository和Share端的类体系,导致类加载失败、配置不生效等问题。下面我会一步步帮你理清问题根源,并给出完整的可运行解决方案:

问题根源拆解

先帮你把遇到的三个问题的本质说清楚:

  1. 用了Repository端的基类:你继承的org.alfresco.web.ui.common.component.evaluator.BaseEvaluator是Alfresco核心Repository模块的类,Share作为独立Web应用,classpath里没有这个类,所以启动直接报NoClassDefFoundError。
  2. 错误的接口选择:org.alfresco.web.action.ActionEvaluator同样属于Repository端,Share端的Evaluator有自己独立的接口体系,不能混用。
  3. 跨应用类无法访问: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服务器,让配置生效。

验证方式

  1. 用用户A登录Share,创建一个文档并将其状态设为onApproval,查看文档详情页,确认firm-exclude-participant操作显示正常。
  2. 切换到用户B登录,查看同一个文档的详情页,确认该操作不显示。
  3. 再用用户A登录,把文档状态改成非onApproval,确认操作也会隐藏(因为两个Evaluator需要同时满足)。

内容的提问来源于stack exchange,提问作者user1134181

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:18:00