自定义操作实施 Magnolia CMS

Posted

技术标签:

【中文标题】自定义操作实施 Magnolia CMS【英文标题】:Custom action implementation Magnolia CMS 【发布时间】:2019-11-21 15:21:49 【问题描述】:

我尝试在 Magnolia 中的页面应用程序的操作栏中实现自定义操作,类似于 Magnolia 6.0 custom action implementation。

我的实现是:

package ch.zzz.module.versioning;


import info.magnolia.ui.api.action.Action;
import info.magnolia.ui.api.action.ActionExecutionException;
import info.magnolia.ui.api.action.ConfiguredActionDefinition;

public class ZzzVersioning extends ConfiguredActionDefinition 

    public ZzzVersioning() 
        this.setImplementationClass(MyAction.class);
    


class MyAction implements Action 



    @Override
    public void execute() throws ActionExecutionException 
        System.out.println("Hello! Executed MyAction");
    

页面应用程序的操作配置使用 ch.zzz.module.versioning.ZzzVersioning 类,我在页面应用程序的操作栏中的项目下列出了该操作。

配置应用 模块>页面>应用程序>页面>子应用程序>浏览器>操作>MyActions -class=ch.zzz.module.versioning.ZzzVersioning

modules>pages>apps>pages>subApps>browser>actionbar>sections>pageActions>importExportActions>items-MyAction

单击操作栏中的 MyAction 时收到错误消息:Could not instantiate action class for action: MyAction.

这是我在日志中得到的:

2019-11-22 08:37:26,498 ERROR fo.magnolia.ui.contentapp.browser.BrowserPresenter: An error occurred while executing action [MyAction]
info.magnolia.ui.api.action.ActionExecutionException: Could not instantiate action class for action: MyAction

...然后在栈尾:

Caused by: info.magnolia.objectfactory.MgnlInstantiationException: No suitable constructor found for class [class ch.zzz.module.versioning.MyAction]
        at info.magnolia.objectfactory.ObjectManufacturer.newInstance(ObjectManufacturer.java:124) ~[magnolia-core-5.6.10.jar:?]
        at info.magnolia.objectfactory.guice.GuiceComponentProvider.newInstanceWithParameterResolvers(GuiceComponentProvider.java:132) ~[magnolia-core-5.6.10.jar:?]
        at info.magnolia.ui.framework.ioc.UiContextBoundComponentProvider.lambda$newInstanceWithParameterResolvers$4(UiContextBoundComponentProvider.java:113) ~[magnolia-ui-framework-5.6.10.jar:?]
        at info.magnolia.ui.framework.ioc.UiContextBoundComponentProvider.provideInCurrentScope(UiContextBoundComponentProvider.java:125) ~[magnolia-ui-framework-5.6.10.jar:?]
        at info.magnolia.ui.framework.ioc.UiContextBoundComponentProvider.newInstanceWithParameterResolvers(UiContextBoundComponentProvider.java:113) ~[magnolia-ui-framework-5.6.10.jar:?]
        at info.magnolia.ui.framework.ioc.UiContextBoundComponentProvider.newInstance(UiContextBoundComponentProvider.java:108) ~[magnolia-ui-framework-5.6.10.jar:?]
        at info.magnolia.ui.api.action.AbstractActionExecutor.createAction(AbstractActionExecutor.java:90) ~[magnolia-ui-api-5.6.10.jar:?]
        ... 129 more

有什么建议可以让它工作吗?

解决方案 感谢 ©Ducay035,我能够找到自定义版本控制类的解决方案:

package ch.zzz.module.versioning;

import info.magnolia.ui.api.action.CommandActionDefinition;

/**
 * Definition interface for the MyAction page action.
 */

public class UzhVersioning extends CommandActionDefinition 

    public UzhVersioning() 
        this.setImplementationClass(MyAction.class);
    

和 MyAction 类:

public class MyAction extends AbstractMultiItemAction<Versioning>  

    public MyAction(Versioning definition, JcrItemAdapter item, UiContext uiContext) 
        super(definition, item, uiContext);
        // TODO Auto-generated constructor stub
    




    @Override
    public void execute() 
    ////your action code here
    

【问题讨论】:

【参考方案1】:

您必须公开您的课程,以便 IOC 系统能够发现它。但是,如果您使用注入机制,则可以将构造函数设为私有。

干杯,

希望有帮助

【讨论】:

谢谢@Ducaz035。当我宣布 MyAction 为公开时,它起作用了。我很抱歉,但我不明白你的第二句话However, if you injection mechanisms one can make the constructor anything but private你能详细说明一下吗?我是 Magnolia 开发的新手。 @AnaSustic 如果您不自己创建对象实例而是依靠 IOC 来执行此操作,则可以将您的 c-tor 包设为私有或受保护。他们不必公开。但是类本身必须是公开的,以便随时可以访问。

以上是关于自定义操作实施 Magnolia CMS的主要内容,如果未能解决你的问题,请参考以下文章

在 Magnolia CMS 中注册自定义 VirtualUriMapper

如何在 magnolia CMS 中配置自定义 servlet

使用 Magnolia CMS 创建自定义类型的内容?

在 Magnolia CMS 中添加自定义图标

Magnolia CMS 中自定义内容类型的链接

使用 Blossom 在 Magnolia CMS 对话框中创建自定义字段