How to set a resource property
Solution 1
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();
Solution 2
As many developers are not fond of using Node API
. You can also use ValueMap and ModifiableValueMap APIs to read and update property respectively.
Read Value through ValueMap
ValueMap valueMap = resource.getValueMap();
valueMap.get("yourProperty", String.class);
Write/Modify property through ModifiableValueMap
ModifiableValueMap modifiableValueMap = resource.adaptTo(ModifiableValueMap.class);
modifiableValueMap.put("NewProperty", "Your Value"); //write
modifiableValueMap.put("OldProperty", "Updated Value"); // Modify
After writing property to a node, save these values by committing the 'resourceResolver'
You'll need system/service user for admin resourceResolver.
Go through this documentation for more info about service user.
Solution 3
It is not working in publish. But if user logged-In as admin
it will work.
ModifiableValueMap map = resource.adaptTo(ModifiableValueMap.class);
map.put("property", "value");
resource.getResourceResolver().commit();
Tomek Rękawek
I do things with computers. Right now it’s developing the open-source data repository Jackrabbit Oak within the Apache Software Foundation for Adobe. I love Unices. Sometimes I talk. I’m also a TV show addict and a family man.
Updated on June 23, 2022Comments
-
Tomek Rękawek about 2 years
I have a Sling
Resource
object. What is the best way to set or update its property? -
Jezwin Varghese over 4 yearsHow to specify the type of value? map.put("property", "value") sets the type as String. How to customize the type while using put() method!