Search code examples
javamagnolia

Custom action implementation Magnolia CMS


I try to implement a custom action in action-bar for the pages app in Magnolia similar to Magnolia 6.0 custom action implementation.

My implementation is:

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");
    }
}

The configuration of the action for the pages app is using the class ch.zzz.module.versioning.ZzzVersioning and I listed the action under items in actionbar for the pages app.

configuration app modules>pages>apps>pages>subApps>browser>actions>MyActions -class=ch.zzz.module.versioning.ZzzVersioning

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

I get an error message when I click on the MyAction in the action-bar: Could not instantiate action class for action: MyAction.

This is what I get in the logs:

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

... and then at the end of the stack:

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

Any suggestions how to get this to work?

SOLUTION Thanks to ©Ducay035 I was able to find the solution for the custom versioning class:

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);
    }
}

and MyAction class:

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
    }

Solution

  • You must have your classes public so that IOC system can find it out. However, if you use injection mechanism one can make the constructor anything but private.

    Cheers,

    Hope that helps