How to set a resource property

aem, jcr, sling

Solution

It depends on the Sling version:

Sling >= 2.3.0 (since CQ 5.6)

Adapt your resource to `ModifiableValueMap`, use its `put` method and commit the resource resolver:

ModifiableValueMap map = resource.adaptTo(ModifiableValueMap.class);
map.put("property", "value");
resource.getResourceResolver().commit();

Sling < 2.3.0 (CQ 5.5 and earlier)

Adapt your resource to `PersistableValueMap`, use its `put` and `save` methods:

PersistableValueMap map = resource.adaptTo(PersistableValueMap.class);
map.put("property", "value");
map.save();

JCR API

You may also adapt the resource to `Node` and use the JCR API to change property. However, it's a good idea to stick to one abstraction layer and in this case we somehow break the `Resource` abstraction provided by Sling.

Node node = resource.adaptTo(Node.class);
node.setProperty("property", "value");
node.getSession().save();

Problem

I have a Sling `Resource` object. What is the best way to set or update its property?

Original source