What's new in Slice 4.3

Slice Persistence

Slice persistence is a module that allows you to save Slice models back into Sling repository.

Features
  • Saves simple field types as JCR properties (StringintCalendar, etc.)
  • Supports nested models - will be persisted as subresources
  • Allows for customizing the property name with @JcrProperty
  • Supports collections and arrays of properties
  • Supports collections and arrays of nested models with Slice @Children

Following code snippet shows how to use Slice Persistence.

Consider following model:

@SliceResource
public class SampleModel {
 
    @JcrProperty
    private int pageLimit;
 
    @JcrProperty
    private PaginationType type; // PaginationType is an enum
 
    @JcrProperty
    private String[] tags;
 
    @JcrProperty
    @Children(SubModel.class)
    private List<SubModel> subModels;
 
    private String notAJcrProperty; // won't be serialized
 
    //...
}

Model can be persisted as follows:

@Inject
private ModelPersister modelPersister;
 
//...
 
SampleModel model = resource.adaptTo(SampleModel.class); // read model from repository
model.setPageLimit(123);
modelPersister.persist(model, resource);
resource.getResourceResolver().commit();

Read more about Slice Persistence

Extending mapper made easy

Extending the out-of-the-box mapper is now much easier. Thanks to Guice multibindings you can easily register your own Field Processor which can map a field in a custom way. Below code snippet demonstrate how you can register your own field processor ({{MyCustomFieldProcessor}}) with use of multibinding:

public class CustomProcessorModule implements Module { 
   @Override
   protected void configure() {
      Multibinder<FieldProcessor> multibinder = Multibinder.newSetBinder(binder(), FieldProcessor.class);
      multibinder.addBinding().to(MyCustomFieldProcessor.class);
   }
  
}

Read more about extending mapper.

@PreMapping @PostMapping annotations

Now, having a model annotated with @SliceResource you can annotate method with @PreMapping or @PostMapping annotation. Such method will be called before or after mapping is done.

Example usage:

@SliceResource
public class MyComponentModel {

  @JcrProperty
  private String property;

  @Inject
  private ModelProvider modelProvider;

  @PreMapping
  public void preMapping() {
    // modelProvider is already injected; property is not mapped yet
  }

  @PostMapping
  public void postMapping() {
    // modelProvider and property are already set
  }
}

Improvement to @Children annotation

Now using @Children you can annotate not only java.lang.List, but also java.lang.Setjava.lang.SortedSet or java.lang.Collection.

@SliceResource
public class MyComponentModel {
 
  @Chldren(ChildModel.class)
  @JcrProperty
  private Set<ChildModel> childModels;
 
  ...
}

Bug fixing

Slice 4.3.0 brings also fixes for some minor bugs. You can find full list of them in release notes.