Page tree
Skip to end of metadata
Go to start of metadata

Your Rating: Results: 1 Star2 Star3 Star4 Star5 Star 140 rates

Blossom 3 and above

UiConfig has methods to create all of the standard fields and configure them using their respective builders. When you've created your own fields or want to use a field from a third-party module you can either write a static method and reuse it across your project or create a builder of your own.

Using a static utility class

public class MyFields {
    public static FieldDefinition myField(String name, String label, String width) {
        MyFieldDefinition fieldDefinition = new MyFieldDefinition();
        fieldDefinition.setName(name);
        fieldDefinition.setLabel(label);
        fieldDefinition.setWidth(width);
        return fieldDefinition;
    }
}

You'd then use it like this:

@TabFactory("Content")
public void contentTab(UiConfig cfg, DamConfig dam, TabBuilder tab) {
    tab.fields(
            cfg.fields.text("heading").label("Heading"),
            dam.fields.assetLink("photo").label("Photo"),
            cfg.fields.richText("body").label("Text body")
    ).definition().addField(MyFields.myField("name", "label", "width"));
}

Using a custom builder

To create and use a builder that follows the fluent builder style there's a number of steps you need to complete.

First you need to create a builder that inherits from AbstractFieldBuilder. It should have a constructor that takes the name to use for the field. Then add methods for all properties in your definition class. And finally override all methods in the parent class and change the return type from AbstractFieldBuilder to the type of your class.

public class MyFieldBuilder extends AbstractFieldBuilder {

    private final MyFieldDefinition definition = new MyFieldDefinition();

    public MyFieldBuilder(String name) {
        this.definition().setName(name);
    }

    @Override
    public MyFieldDefinition definition() {
        return definition;
    }

    public MyFieldBuilder width(String width) {
        definition().setWidth(width);
        return this;
    }

    // Overrides for methods in parent class changing return type to allow method chaining

    @Override
    public MyFieldBuilder label(String label) {
        return (MyFieldBuilder) super.label(label);
    }
    @Override
    public MyFieldBuilder i18nBasename(String i18nBasename) {
        return (MyFieldBuilder) super.i18nBasename(i18nBasename);
    }
    @Override
    public MyFieldBuilder i18n(boolean i18n) {
        return (MyFieldBuilder) super.i18n(i18n);
    }
    @Override
    public MyFieldBuilder i18n() {
        return (MyFieldBuilder) super.i18n();
    }
    @Override
    public MyFieldBuilder description(String description) {
        return (MyFieldBuilder) super.description(description);
    }
    @Override
    public MyFieldBuilder type(String type) {
        return (MyFieldBuilder) super.type(type);
    }
    @Override
    public MyFieldBuilder required(boolean required) {
        return (MyFieldBuilder) super.required(required);
    }
    @Override
    public MyFieldBuilder required() {
        return (MyFieldBuilder) super.required();
    }
    @Override
    public MyFieldBuilder requiredErrorMessage(String requiredErrorMessage) {
        return (MyFieldBuilder) super.requiredErrorMessage(requiredErrorMessage);
    }
    @Override
    public MyFieldBuilder readOnly(boolean readOnly) {
        return (MyFieldBuilder) super.readOnly(readOnly);
    }
    @Override
    public MyFieldBuilder readOnly() {
        return (MyFieldBuilder) super.readOnly();
    }
    @Override
    public MyFieldBuilder defaultValue(String defaultValue) {
        return (MyFieldBuilder) super.defaultValue(defaultValue);
    }
    @Override
    public MyFieldBuilder styleName(String styleName) {
        return (MyFieldBuilder) super.styleName(styleName);
    }
    @Override
    public MyFieldBuilder validator(ConfiguredFieldValidatorDefinition validatorDefinition) {
        return (MyFieldBuilder) super.validator(validatorDefinition);
    }
    @Override
    public MyFieldBuilder validator(GenericValidatorBuilder validatorBuilder) {
        return (MyFieldBuilder) super.validator(validatorBuilder);
    }
    @Override
    public MyFieldBuilder transformerClass(Class<? extends Transformer<?>> transformerClass) {
        return (MyFieldBuilder) super.transformerClass(transformerClass);
    }
}

Now create a class that can be used to create instances of the builder.

public class MyFieldConfig {

    public MyFieldBuilder myField(String name) {
        return new MyFieldBuilder(name);
    }
}

Then we need to customize DefaultDialogCreator to know how to create instances of MyFieldConfig.

public class MyDialogCreator extends DefaultDialogCreator {

    @Override
    protected ParameterResolver getStandardParameters(DialogFactoryMetaData metaData, DialogCreationContext context) {
        return new ParameterResolver(super.getStandardParameters(metaData, context)) {
            @Override
            public Object resolveParameter(Class<?> parameterType) {
                if (parameterType.equals(MyFieldConfig.class))
                    return new MyFieldConfig();
                return super.resolveParameter(parameterType);
            }
        };
    }
}

It then needs to be configured like this in blossom-servlet.xml:

<bean class="info.magnolia.module.blossom.template.TemplateExporter">
  <property name="dialogDescriptionBuilder">
    <bean class="info.magnolia.module.blossom.dialog.DialogDescriptionBuilder">
      <property name="dialogCreator">
        <bean class="info.magnolia.blossom.sample.module.MyDialogCreator"/>
      </property>
    </bean>
  </property>
</bean>


<bean class="info.magnolia.module.blossom.dialog.DialogExporter">
  <property name="dialogDescriptionBuilder">
    <bean class="info.magnolia.module.blossom.dialog.DialogDescriptionBuilder">
      <property name="dialogCreator">
        <bean class="info.magnolia.blossom.sample.module.MyDialogCreator"/>
      </property>
    </bean>
  </property>
</bean>

Then we can use our builder to create instances of our field:

@TabFactory("Content")
public void contentTab(UiConfig cfg, DamConfig dam, TabBuilder tab, MyFieldConfig myFieldConfig) {
    tab.fields(
            cfg.fields.text("heading").label("Heading"),
            dam.fields.assetLink("photo").label("Photo"),
            cfg.fields.richText("body").label("Text body"),
            myFieldConfig.myField("name").label("label").width("width")
    );
}

Blossom 2

The TabBuilder in Blossom has methods to add all the standard controls included in Magnolia CE. When you have a custom control of your own or a control delivered by a third-party module you can extend it and add methods for these controls.

Extending the class can be overkill, all the parameters you need to create controls are available in DialogCreationContext which will be passed to your method if you declare it as an argument. Consult the source of TabBuilder to see how it uses the DialogCreationContext when it creates controls.

This articles describes how to add support for new arguments to methods annotated with @TabFactory. The concept is identical for methods with @DialogBuilder, @TabValidator, and @DialogValidator. You simply override different methods of DefaultDialogCreator.

Let's say you've extended TabBuilder in this fashion:

public class ExtendedTabBuilder extends TabBuilder {

    public ExtendedTabBuilder(DialogCreationContext context, DialogTab tab) {
        super(context, tab);
    }

    public MyCustomControl addMyCustomControl(String name, String label, String description) {
        ...
    }
}

You can then use it in your paragraphs/components and dialog factories:

@TabFactory("Content")
public void contentTab(ExtendedTabBuilder tab) {
    ...
}

Blossom uses a DialogCreator which is responsible for creating dialogs by invoking methods on your paragraphs and dialog factories. It looks at your methods and based on their arguments it will find or create objects that match them. This mechanism can be customized by subclasses.

public class MyCustomDialogCreator extends DefaultDialogCreator {

    @Override
    protected ParameterResolver getTabFactoryParameters(DialogFactoryMetaData metaData, final DialogCreationContext context, final TabBuilder tabBuilder) {
        return new ParameterResolver(super.getTabFactoryParameters(metaData, context, tabBuilder)) {
            @Override
            public Object resolveParameter(Class<?> parameterType) {
                if (parameterType.equals(ExtendedTabBuilder.class))
                    return new ExtendedTabBuilder(context, tabBuilder.getTab());
                return super.resolveParameter(parameterType);
            }
        };
    }
}

To use the custom DialogCreator you need to configure it to be used by Blossom.

For templates, areas and components you need to configure a TemplateExporter. Add this in blossom-servlet.xml.

<bean class="info.magnolia.module.blossom.template.TemplateExporter">
  <property name="dialogDescriptionBuilder">
    <bean class="info.magnolia.module.blossom.dialog.DialogDescriptionBuilder">
      <property name="dialogCreator">
        <bean class="com.mycompany.package.MyCustomDialogCreator" />
      </property>
    </bean>
  </property>
</bean>

For dialog factories, @DialogFactory used on class, you need to configure a DialogExporter. Add this in blossom-servlet.xml.

<bean class="info.magnolia.module.blossom.dialog.DialogExporter">
  <property name="dialogDescriptionBuilder">
    <bean class="info.magnolia.module.blossom.dialog.DialogDescriptionBuilder">
      <property name="dialogCreator">
        <bean class="com.mycompany.package.MyCustomDialogCreator" />
      </property>
    </bean>
  </property>
</bean>

Blossom 1.2 and earlier

Take the same steps as with Blossom 2 but configuration differs.

To configure it for use replace this snippet:

<blossom:configuration />

With this:

<bean id="blossomConfiguration" class="info.magnolia.module.blossom.BlossomConfiguration">
    <property name="dialogCreator">
        <bean class="com.mycompany.package.MyCustomDialogCreator" />
    </property>
</bean>

2 Comments

  1. Here's a nice example of this used in practice on the user list.

  2. Hi followed the steps for blossom 3 (i am using 3.1.4) but it does not work. this is the error that I get :


    [INFO] [talledLocalContainer] 2017-07-04 14:57:35,261 ERROR ule.blossom.dialog.BlossomDialogDefinitionProvider: Failed to create dialog for class [class com.icullen.magnolia.templates.components.ServiceTeaserComponent]
    [INFO] [talledLocalContainer] java.lang.IllegalStateException: Unable to resolve parameter of type [class com.icullen.magnolia.ui.config.SelectFieldExtendedConfig]
    [INFO] [talledLocalContainer] at info.magnolia.module.blossom.support.ParameterResolver.resolveParameter(ParameterResolver.java:57)
    [INFO] [talledLocalContainer] at info.magnolia.module.blossom.dialog.DefaultDialogCreator$5.resolveParameter(DefaultDialogCreator.java:297)
    [INFO] [talledLocalContainer] at info.magnolia.module.blossom.support.ParameterResolver.resolveParameter(ParameterResolver.java:55)
    [INFO] [talledLocalContainer] at info.magnolia.module.blossom.dialog.DefaultDialogCreator$3.resolveParameter(DefaultDialogCreator.java:244)
    [INFO] [talledLocalContainer] at info.magnolia.module.blossom.support.MethodInvocationUtils.invoke(MethodInvocationUtils.java:65)
    [INFO] [talledLocalContainer] at info.magnolia.module.blossom.dialog.DefaultDialogCreator.invokeClassDialogFactory(DefaultDialogCreator.java:178)
    [INFO] [talledLocalContainer] at info.magnolia.module.blossom.dialog.DefaultDialogCreator.createDialog(DefaultDialogCreator.java:138)
    [INFO] [talledLocalContainer] at info.magnolia.module.blossom.dialog.BlossomDialogDefinitionProvider.get(BlossomDialogDefinitionProvider.java:133)
    [INFO] [talledLocalContainer] at info.magnolia.module.blossom.dialog.BlossomDialogDefinitionProvider.get(BlossomDialogDefinitionProvider.java:63)
    [INFO] [talledLocalContainer] at info.magnolia.config.registry.AbstractDefinitionProviderWrapper.get(AbstractDefinitionProviderWrapper.java:61)
    [INFO] [talledLocalContainer] at info.magnolia.ui.dialog.registry.DialogDefinitionRegistry$1.get(DialogDefinitionRegistry.java:88)
    [INFO] [talledLocalContainer] at info.magnolia.ui.dialog.registry.DialogDefinitionRegistry$1.get(DialogDefinitionRegistry.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.module.blossom.dialog.BlossomFormDialogPresenter.start(BlossomFormDialogPresenter.java:89)
    [INFO] [talledLocalContainer] at info.magnolia.pages.app.action.EditElementAction.execute(EditElementAction.java:121)
    [INFO] [talledLocalContainer] at info.magnolia.ui.api.action.AbstractActionExecutor.execute(AbstractActionExecutor.java:62)
    [INFO] [talledLocalContainer] at info.magnolia.pages.app.editor.PageEditorPresenter.onAction(PageEditorPresenter.java:175)
    [INFO] [talledLocalContainer] at info.magnolia.ui.vaadin.editor.PageEditor$1.editComponent(PageEditor.java:103)
    [INFO] [talledLocalContainer] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [INFO] [talledLocalContainer] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    [INFO] [talledLocalContainer] at sun.reflect.DelegatingMethodAccessorImpl.__invoke(DelegatingMethodAccessorImpl.java:43)
    [INFO] [talledLocalContainer] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java)
    [INFO] [talledLocalContainer] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java)
    [INFO] [talledLocalContainer] at java.lang.reflect.Method.invoke(Method.java:497)
    [INFO] [talledLocalContainer] at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:158)
    [INFO] [talledLocalContainer] at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:118)
    [INFO] [talledLocalContainer] at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:437)
    [INFO] [talledLocalContainer] at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:408)
    [INFO] [talledLocalContainer] at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:273)
    [INFO] [talledLocalContainer] at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90)
    [INFO] [talledLocalContainer] at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
    [INFO] [talledLocalContainer] at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1414)
    [INFO] [talledLocalContainer] at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:365)
    [INFO] [talledLocalContainer] at info.magnolia.ui.admincentral.AdmincentralVaadinServlet.service(AdmincentralVaadinServlet.java:131)
    [INFO] [talledLocalContainer] at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.ServletDispatchingFilter.doFilter(ServletDispatchingFilter.java:148)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.CompositeFilter.doFilter(CompositeFilter.java:65)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.VirtualUriFilter.doFilter(VirtualUriFilter.java:69)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.module.cache.executor.Bypass.processCacheRequest(Bypass.java:58)
    [INFO] [talledLocalContainer] at info.magnolia.module.cache.executor.CompositeExecutor.processCacheRequest(CompositeExecutor.java:67)
    [INFO] [talledLocalContainer] at info.magnolia.module.cache.filter.CacheFilter.doFilter(CacheFilter.java:220)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.i18n.I18nContentSupportFilter.doFilter(I18nContentSupportFilter.java:74)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.RangeSupportFilter.doFilter(RangeSupportFilter.java:77)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.security.BaseSecurityFilter.doFilter(BaseSecurityFilter.java:57)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
    [INFO] [talledLocalContainer] at info.magnolia.cms.security.SecurityCallbackFilter.doFilter(SecurityCallbackFilter.java:84)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.security.LogoutFilter.doFilter(LogoutFilter.java:94)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at com.icullen.security.JwtLogoutFilter.doFilter(JwtLogoutFilter.java:40)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.module.site.filters.SiteMergeFilter.doFilter(SiteMergeFilter.java:119)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MultiChannelFilter.doFilter(MultiChannelFilter.java:83)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.module.cache.filter.GZipFilter.doFilter(GZipFilter.java:73)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
    [INFO] [talledLocalContainer] at info.magnolia.cms.security.auth.login.LoginFilter.doFilter(LoginFilter.java:127)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.ContentTypeFilter.doFilter(ContentTypeFilter.java:155)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.ContextFilter.doFilter(ContextFilter.java:128)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.CompositeFilter.doFilter(CompositeFilter.java:65)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.SafeDestroyMgnlFilterWrapper.doFilter(SafeDestroyMgnlFilterWrapper.java:107)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterDispatcher.doDispatch(MgnlFilterDispatcher.java:67)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:108)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:94)
    [INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    [INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    [INFO] [talledLocalContainer] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    [INFO] [talledLocalContainer] at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:164)
    [INFO] [talledLocalContainer] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java)
    [INFO] [talledLocalContainer] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    [INFO] [talledLocalContainer] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    [INFO] [talledLocalContainer] at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
    [INFO] [talledLocalContainer] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    [INFO] [talledLocalContainer] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394)
    [INFO] [talledLocalContainer] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
    [INFO] [talledLocalContainer] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    [INFO] [talledLocalContainer] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
    [INFO] [talledLocalContainer] at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
    [INFO] [talledLocalContainer] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    [INFO] [talledLocalContainer] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    [INFO] [talledLocalContainer] at java.lang.Thread.run(Thread.java:745)
    [INFO] [talledLocalContainer] 2017-07-04 14:57:35,262 ERROR info.magnolia.pages.app.editor.PageEditorPresenter: An error occurred while executing action [editComponent]
    [INFO] [talledLocalContainer] info.magnolia.ui.api.action.ActionExecutionException: Action execution failed for action: editComponent
    [INFO] [talledLocalContainer] at info.magnolia.ui.api.action.AbstractActionExecutor.execute(AbstractActionExecutor.java:64)
    [INFO] [talledLocalContainer] at info.magnolia.pages.app.editor.PageEditorPresenter.onAction(PageEditorPresenter.java:175)
    [INFO] [talledLocalContainer] at info.magnolia.ui.vaadin.editor.PageEditor$1.editComponent(PageEditor.java:103)
    [INFO] [talledLocalContainer] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [INFO] [talledLocalContainer] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    [INFO] [talledLocalContainer] at sun.reflect.DelegatingMethodAccessorImpl.__invoke(DelegatingMethodAccessorImpl.java:43)
    [INFO] [talledLocalContainer] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java)
    [INFO] [talledLocalContainer] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java)
    [INFO] [talledLocalContainer] at java.lang.reflect.Method.invoke(Method.java:497)
    [INFO] [talledLocalContainer] at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:158)
    [INFO] [talledLocalContainer] at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:118)
    [INFO] [talledLocalContainer] at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:437)
    [INFO] [talledLocalContainer] at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:408)
    [INFO] [talledLocalContainer] at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:273)
    [INFO] [talledLocalContainer] at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90)
    [INFO] [talledLocalContainer] at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
    [INFO] [talledLocalContainer] at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1414)
    [INFO] [talledLocalContainer] at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:365)
    [INFO] [talledLocalContainer] at info.magnolia.ui.admincentral.AdmincentralVaadinServlet.service(AdmincentralVaadinServlet.java:131)
    [INFO] [talledLocalContainer] at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.ServletDispatchingFilter.doFilter(ServletDispatchingFilter.java:148)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.CompositeFilter.doFilter(CompositeFilter.java:65)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.VirtualUriFilter.doFilter(VirtualUriFilter.java:69)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.module.cache.executor.Bypass.processCacheRequest(Bypass.java:58)
    [INFO] [talledLocalContainer] at info.magnolia.module.cache.executor.CompositeExecutor.processCacheRequest(CompositeExecutor.java:67)
    [INFO] [talledLocalContainer] at info.magnolia.module.cache.filter.CacheFilter.doFilter(CacheFilter.java:220)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.i18n.I18nContentSupportFilter.doFilter(I18nContentSupportFilter.java:74)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.RangeSupportFilter.doFilter(RangeSupportFilter.java:77)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.security.BaseSecurityFilter.doFilter(BaseSecurityFilter.java:57)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
    [INFO] [talledLocalContainer] at info.magnolia.cms.security.SecurityCallbackFilter.doFilter(SecurityCallbackFilter.java:84)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.security.LogoutFilter.doFilter(LogoutFilter.java:94)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at com.icullen.security.JwtLogoutFilter.doFilter(JwtLogoutFilter.java:40)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.module.site.filters.SiteMergeFilter.doFilter(SiteMergeFilter.java:119)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MultiChannelFilter.doFilter(MultiChannelFilter.java:83)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.module.cache.filter.GZipFilter.doFilter(GZipFilter.java:73)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
    [INFO] [talledLocalContainer] at info.magnolia.cms.security.auth.login.LoginFilter.doFilter(LoginFilter.java:127)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.ContentTypeFilter.doFilter(ContentTypeFilter.java:155)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.ContextFilter.doFilter(ContextFilter.java:128)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.CompositeFilter.doFilter(CompositeFilter.java:65)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.SafeDestroyMgnlFilterWrapper.doFilter(SafeDestroyMgnlFilterWrapper.java:107)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlFilterDispatcher.doDispatch(MgnlFilterDispatcher.java:67)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:108)
    [INFO] [talledLocalContainer] at info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:94)
    [INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    [INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    [INFO] [talledLocalContainer] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    [INFO] [talledLocalContainer] at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:164)
    [INFO] [talledLocalContainer] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java)
    [INFO] [talledLocalContainer] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    [INFO] [talledLocalContainer] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    [INFO] [talledLocalContainer] at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
    [INFO] [talledLocalContainer] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    [INFO] [talledLocalContainer] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394)
    [INFO] [talledLocalContainer] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
    [INFO] [talledLocalContainer] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    [INFO] [talledLocalContainer] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
    [INFO] [talledLocalContainer] at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
    [INFO] [talledLocalContainer] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    [INFO] [talledLocalContainer] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    [INFO] [talledLocalContainer] at java.lang.Thread.run(Thread.java:745)
    [INFO] [talledLocalContainer] Caused by: info.magnolia.config.registry.Registry$InvalidDefinitionException: blossom-template-dialog:com.icullen.magnolia.templates.components.ServiceTeaserComponent
    [INFO] [talledLocalContainer] at info.magnolia.module.blossom.dialog.BlossomDialogDefinitionProvider.get(BlossomDialogDefinitionProvider.java:140)
    [INFO] [talledLocalContainer] at info.magnolia.module.blossom.dialog.BlossomDialogDefinitionProvider.get(BlossomDialogDefinitionProvider.java:63)
    [INFO] [talledLocalContainer] at info.magnolia.config.registry.AbstractDefinitionProviderWrapper.get(AbstractDefinitionProviderWrapper.java:61)
    [INFO] [talledLocalContainer] at info.magnolia.ui.dialog.registry.DialogDefinitionRegistry$1.get(DialogDefinitionRegistry.java:88)
    [INFO] [talledLocalContainer] at info.magnolia.ui.dialog.registry.DialogDefinitionRegistry$1.get(DialogDefinitionRegistry.java:85)
    [INFO] [talledLocalContainer] at info.magnolia.module.blossom.dialog.BlossomFormDialogPresenter.start(BlossomFormDialogPresenter.java:89)
    [INFO] [talledLocalContainer] at info.magnolia.pages.app.action.EditElementAction.execute(EditElementAction.java:121)
    [INFO] [talledLocalContainer] at info.magnolia.ui.api.action.AbstractActionExecutor.execute(AbstractActionExecutor.java:62)
    [INFO] [talledLocalContainer] ... 98 more

    Here is the code snippet for my method in the ServiceTeaserComponent

    @TabFactory("Filters")
    public void filterTab(UiConfig cfg, TabBuilder tab,SelectFieldExtendedConfig extSelectConfig) {

     //code

    }

    Can anyone help me please ??