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

Alfresco 7.3服务端JavaScript仓库动作执行失败求助

Alfresco 7.3仓库端JavaScript动作执行空指针异常问题排查

问题场景

尝试为Alfresco 7.3添加新的仓库端JavaScript动作,配置在alfresco/extension/custom-actions-context.xml中,动作可在规则配置界面正常显示,但通过规则或Share按钮执行时触发空指针异常,无任何执行结果。该配置在Alfresco 5.x中可正常工作。

配置文件内容

<?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="embed-metadata-action" parent="script">
    <property name="scriptLocation">
        <bean class="org.alfresco.repo.jscript.ClasspathScriptLocation">
            <constructor-arg>
                <value>alfresco/extension/scripts/repo-embed-metadata.js</value>
            </constructor-arg>
        </bean>
    </property>
  </bean>
</beans>

执行错误日志

2025-01-28 14:42:36,982  ERROR [extensions.webscripts.AbstractRuntime] [http-nio2-8080-exec-2] Exception from executeScript: 00280012 Wrapped Exception (with status template): Cannot invoke "org.alfresco.service.cmr.action.ParameterDefinition.getParameterConstraintName()" because "parameterDef" is null
Jan 28 14:42:36 alfresco alfresco7.3.2[333454]: org.springframework.extensions.webscripts.WebScriptException: 00280012 Wrapped Exception (with status template): Cannot invoke "org.alfresco.service.cmr.action.ParameterDefinition.getParameterConstraintName()" because "parameterDef" is null
       at org.springframework.extensions.webscripts.AbstractWebScript.createStatusException(AbstractWebScript.java:1139)
       at org.springframework.extensions.webscripts.DeclarativeWebScript.execute(DeclarativeWebScript.java:171)
       at org.alfresco.repo.web.scripts.RepositoryContainer.lambda$transactionedExecute$2(RepositoryContainer.java:561)
       at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:452)
       at org.alfresco.repo.web.scripts.RepositoryContainer.transactionedExecute(RepositoryContainer.java:544)
       at org.alfresco.repo.web.scripts.RepositoryContainer.transactionedExecuteAs(RepositoryContainer.java:685)
       at org.alfresco.repo.web.scripts.RepositoryContainer.transactionedExecuteAs(RepositoryContainer.java:721)
       at org.alfresco.repo.web.scripts.RepositoryContainer.executeScriptInternal(RepositoryContainer.java:413)
       at org.alfresco.repo.web.scripts.RepositoryContainer.executeScript(RepositoryContainer.java:309)
       at org.springframework.extensions.webscripts.AbstractRuntime.executeScript(AbstractRuntime.java:423)
       at org.springframework.extensions.webscripts.AbstractRuntime.executeScript(AbstractRuntime.java:210)
       at org.springframework.extensions.webscripts.servlet.WebScriptServlet.service(WebScriptServlet.java:131)
       at org.alfresco.repo.web.scripts.AlfrescoWebScriptServlet.service(AlfrescoWebScriptServlet.java:43)
       at javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:199)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
       at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
       at org.alfresco.module.aosmodule.service.ContextRootFilter.doFilter(ContextRootFilter.java:93)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
       at org.springframework.extensions.webscripts.servlet.SecurityHeadersFilter.doFilter(SecurityHeadersFilter.java:177)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
       at org.alfresco.web.app.servlet.GlobalLocalizationFilter.doFilter(GlobalLocalizationFilter.java:68)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
       at org.alfresco.web.app.servlet.ClearSecurityContextFilter.doFilter(ClearSecurityContextFilter.java:53)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
       at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168)
       at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
       at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481)
       at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)
       at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
       at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
       at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346)
       at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:388)
       at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
       at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:936)
       at org.apache.tomcat.util.net.Nio2Endpoint$SocketProcessor.doRun(Nio2Endpoint.java:1734)
       at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
       at org.apache.tomcat.util.net.AbstractEndpoint.processSocket(AbstractEndpoint.java:1333)
       at org.apache.tomcat.util.net.Nio2Endpoint.setSocketOptions(Nio2Endpoint.java:341)
       at org.apache.tomcat.util.net.Nio2Endpoint$Nio2Acceptor.completed(Nio2Endpoint.java:481)
       at org.apache.tomcat.util.net.Nio2Endpoint$Nio2Acceptor.completed(Nio2Endpoint.java:417)
       at java.base/sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:129)
       at java.base/sun.nio.ch.Invoker$2.run(Invoker.java:221)
       at java.base/sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:113)
       at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)
       at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
       at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
       at java.base/java.lang.Thread.run(Thread.java:840)
Jan 28 14:42:36 alfresco alfresco7.3.2[333454]: Caused by: java.lang.NullPointerException: Cannot invoke "org.alfresco.service.cmr.action.ParameterDefinition.getParameterConstraintName()" because "parameterDef" is null
       at org.alfresco.repo.action.executer.ScriptActionExecuter.isValidScriptRef(ScriptActionExecuter.java:239)
       at org.alfresco.repo.action.executer.ScriptActionExecuter.executeImpl(ScriptActionExecuter.java:132)
       at org.alfresco.repo.action.executer.ActionExecuterAbstractBase.execute(ActionExecuterAbstractBase.java:293)
       at org.alfresco.repo.action.ActionServiceImpl.directActionExecution(ActionServiceImpl.java:910)
       at org.alfresco.repo.action.ActionServiceImpl.executeActionImpl(ActionServiceImpl.java:811)
       at org.alfresco.repo.action.ActionServiceImpl.executeAction(ActionServiceImpl.java:593)
       at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
       at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
       at java.base/java.lang.reflect.Method.invoke(Method.java:569)
       at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
       at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
       at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
       at org.alfresco.repo.security.permissions.impl.AlwaysProceedMethodInterceptor.invoke(AlwaysProceedMethodInterceptor.java:41)
       at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
       at org.alfresco.repo.security.permissions.impl.ExceptionTranslatorMethodInterceptor.invoke(ExceptionTranslatorMethodInterceptor.java:53)
       at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
       at org.alfresco.repo.audit.AuditMethodInterceptor.proceedWithAudit(AuditMethodInterceptor.java:256)
       at org.alfresco.repo.audit.AuditMethodInterceptor.proceed(AuditMethodInterceptor.java:216)
       at org.alfresco.repo.audit.AuditMethodInterceptor.invoke(AuditMethodInterceptor.java:171)
       at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
       at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
       at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)
       at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
       at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
       at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:241)
       at jdk.proxy4/jdk.proxy4.$Proxy54.executeAction(Unknown Source)
       at org.alfresco.repo.web.scripts.rule.ActionQueuePost.executeImpl(ActionQueuePost.java:94)
       at org.springframework.extensions.webscripts.DeclarativeWebScript.execute(DeclarativeWebScript.java:64)
       ... 52 more

原因分析与解决方案

原因

Alfresco 7.x版本对ScriptActionExecuter的参数校验逻辑做了增强,原5.x中直接继承script父bean的方式会导致参数定义未正确初始化,执行时ScriptActionExecuter.isValidScriptRef方法尝试访问空的parameterDef对象,触发NPE。

解决方案

修改Spring配置,不再继承script父bean,直接定义ScriptActionExecuter类型的bean,并显式配置参数定义:

<?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="embed-metadata-action" class="org.alfresco.repo.action.executer.ScriptActionExecuter">
    <property name="scriptLocation">
        <bean class="org.alfresco.repo.jscript.ClasspathScriptLocation">
            <constructor-arg>
                <value>alfresco/extension/scripts/repo-embed-metadata.js</value>
            </constructor-arg>
        </bean>
    </property>
    <!-- 显式添加参数定义,避免空指针异常 -->
    <property name="parameterDefinitions">
        <list>
            <bean class="org.alfresco.service.cmr.action.ParameterDefinitionImpl">
                <constructor-arg value="script-ref"/>
                <constructor-arg value="org.alfresco.service.cmr.action.ParameterType.TEXT"/>
            </bean>
        </list>
    </property>
  </bean>
</beans>

该配置显式初始化了动作的参数定义,符合7.x版本的校验要求,可解决执行时的NPE问题。

此问题属于版本升级后的兼容性问题,并非官方标注的已知Bug,但社区中存在同类案例反馈。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:20:54