Expand my Community achievements bar.

Can we pass dynamic values to register a Sling Servlet?

Avatar

Level 2

Hi,

I would like to know if there is a possibility to somehow pass dynamic values to the properties sling.servlet.resourceTypes, sling.servlet.selectors, sling.servlet.extensions while registering a servlet.
Is there a way to use custom OSGi configuration nodes in this case?

A sample use case :

I have a servlet registered using resourceType= /something/xyz, selectors = [json, tab, img, pdf], extension = html. In case, i would like to add more selectors to the same servlet in future based on my extending requirement, how can i do it without a code change?

Thanks in advance!

Regards,

Bhavya S

6 Replies

Avatar

Employee Advisor

You can register your servlet to a more generic resource type and then use OptingServlet interface to accept requests which meets your dynamic qualification criteria.

For more details see this documentation - OptingServlet (Apache Sling 7 API)  - Your logic can be defined in accepts method.

Example - acs-aem-samples/SampleAllMethodsServlet.java at master · Adobe-Consulting-Services/acs-aem-samples ·...

Avatar

Employee Advisor

If you don't use the @SlingServlet annotation, but rather the standard way using SCR/OSGI properties, these special properties are available via OSGI webconsole (unless you configure them with privateProperties=true).  So you should be able to do that by default :-)

Regards,

Jörg

Avatar

Level 2

Thank you Jörg!

Could you please post a code snippet or an example.
It would be really helpful to understand better

Avatar

Employee Advisor

From the top of my head (haven't found a good example in the net that fast):

@Component
@Service
@Properties{(
   @Property(name="sling.servlet.selectors" value={"pdf","txt"})
   @Property(name="sling.servlet.resourceTypes" value="my/super/resource/type")
)}

Something along that line should work.

Avatar

Level 2

I think we need to set metatype=true also to change these properties from /system/console/configMgr UI.

@Component(metatype=true)

@Service

@Properties{(

   @Property(name="sling.servlet.selectors" value={"pdf","txt"})

   @Property(name="sling.servlet.resourceTypes" value="my/super/resource/type")

)}

Avatar

Employee Advisor

Yepp, forgot the metatype property. Although technically it's not really necessary, it just makes the webconsole displaying the configuration as editable.

regards,
Jörg