Expand my Community achievements bar.

Radically easy to access on brand approved content for distribution and omnichannel performant delivery. AEM Assets Content Hub and Dynamic Media with OpenAPI capabilities is now GA.

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