Search code examples
aemjcrsling

How to set a resource property


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


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