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 (
String
,int
,Calendar
, 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.Set
, java.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.