Solved
Dynamically populate dropdown from json
Hi Team,
Can someone help me solving below error? Below is my code to dynamically populate dropdown from a json file but it is not working. I have followed the tutorial given by @arunpatidar . I am getting below error in my code:
20.05.2025 17:21:58.487 *ERROR* [[0:0:0:0:0:0:0:1] [1747741918452] GET /mnt/override/apps/mysite/components/content/dynamicdropdown/_cq_dialog.html/content/mysite/us/en/demo-page/jcr:content/root/container/container/dynamicdropdown HTTP/1.1] org.apache.sling.servlets.get.impl.DefaultGetServlet No renderer for extension html, cannot render resource TypeOverwritingResourceWrapper, type=/bin/mysite/datasource, path=/mnt/override/apps/mysite/components/content/dynamicdropdown/cq:dialog/content/items/column/items/dropdown, resource=[FilteringResourceWrapper, type=granite/ui/components/coral/foundation/form/select, path=/mnt/override/apps/mysite/components/content/dynamicdropdown/cq:dialog/content/items/column/items/dropdown, resource=[FilteringResourceWrapper, type=granite/ui/components/coral/foundation/form/select, path=/mnt/override/apps/mysite/components/content/dynamicdropdown/cq:dialog/content/items/column/items/dropdown, resource=[MergedResource [path=/mnt/override/apps/mysite/components/content/dynamicdropdown/cq:dialog/content/items/column/items/dropdown, resources=[/apps/mysite/components/content/dynamicdropdown/cq:dialog/content/items/column/items/dropdown]]]]]
package com.mysite.core.servlets;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceMetadata;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceUtil;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.apache.sling.commons.json.JSONArray;
import org.apache.sling.commons.json.JSONObject;
import org.apache.sling.servlets.annotations.SlingServletResourceTypes;
import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.adobe.cq.commerce.common.ValueMapDecorator;
import com.adobe.granite.ui.components.ds.EmptyDataSource;
import com.adobe.granite.ui.components.ds.SimpleDataSource;
import com.adobe.granite.ui.components.ds.ValueMapResource;
import com.adobe.granite.ui.components.ds.DataSource;
import javax.jcr.Node;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.sling.api.servlets.HttpConstants;
@Component(service = Servlet.class
, property = {
"sling.servlet.resourceType =" + "/apps/mysite/components/dynamicdropdown",
"sling.servlet.methods=" + HttpConstants.METHOD_GET
}
)
public class DataSourceJson extends SlingSafeMethodsServlet {
Logger logger = LoggerFactory.getLogger(this.getClass());
protected final String OPTIONS_PROPERTY = "options";
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws ServletException, IOException {
// Your logic to handle GET requests
try {
ResourceResolver resourceResolver = request.getResourceResolver();
request.setAttribute(DataSource.class.getName(), EmptyDataSource.instance());
Resource datasource = request.getResource().getChild("datasource");
ValueMap valueMap = ResourceUtil.getValueMap(datasource);
String genericListPath = valueMap.get(OPTIONS_PROPERTY, String.class);
if (genericListPath !=null) {
Node cfNode = request.getResource().getResourceResolver().getResource(genericListPath+"/jcr:content").adaptTo(Node.class);
InputStream in = cfNode.getProperty("jcr:data").getBinary().getStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder out = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
out.append(line);
}
reader.close();
JSONArray jsonArray = new JSONArray(out.toString());
ValueMap vm = null;
List<Resource> optionResourceList = new ArrayList<Resource>();
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject json = jsonArray.getJSONObject(i);
String Text = "";
String Value = "";
vm = new ValueMapDecorator(new HashMap<String, Object>());
Text = json.getString("text");
Value = json.getString("value");
vm.put("value", Value);
vm.put("text", Text);
optionResourceList
.add(new ValueMapResource(resourceResolver, new ResourceMetadata(), "nt:unstructured", vm));
}
DataSource ds = new SimpleDataSource(optionResourceList.iterator());
request.setAttribute(com.adobe.granite.ui.components.ds.DataSource.class.getName(), ds);
} else {
logger.info("JSON file is not found ");
}
} catch (Exception e) {
logger.info("Error in Get Drop Down Values", e);
}
}
}

