Hi,
I have written a servlet which calls OSGI service. And OSGI service invokes API and returns JSON response to servlet and servlet prints response on the page. But when printing servlet response on the page, CQ related information is getting printed. I'm not sure why. Can anyone please help me with this?
Below is my servlet code.
@component(service=Servlet.class,
property={
Constants.SERVICE_DESCRIPTION + "=Servlet to call API Url",
"sling.servlet.methods=" + HttpConstants.METHOD_GET,
"sling.servlet.resourceTypes="+ "aem-code/components/structure/page",
"sling.servlet.extensions=" + "txt"
})
public class CallApiServlet extends SlingSafeMethodsServlet {
private static final long serialVersionUID = 1L;
private static final Logger log = LoggerFactory.getLogger(CallApiServlet.class);
@reference
private CallApiService apiCall;
@Override
protected void doGet(final SlingHttpServletRequest req,
final SlingHttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("application/json");
String result = apiCall.getApiData(req.getParameterMap());
log.info("called"+result); //Here the result is printing without CQ information
resp.getWriter().write(result);
}
}
my servlet response:
{"results":[{"name":{"title":"Ms","first":"Nalan","last":"Oraloğlu"},"login":{"uuid":"baffd062-6cc7-4dd5-b1fd-69d4cde0f845","username":"ticklishgorilla641","password":"zhan","salt":"VUD21uld","md5":"70b78925165996a5926af72b2cbe373d","sha1":"b50f720abecaa5cc9eed47724ddbf457cd501388","sha256":"d3cbfbb1990802e19467640376257db0f631755aaaf85afe9ce0b2925fa91970"},"nat":"TR"}],"info":{"seed":"05d85febdd32196c","results":1,"page":1,"version":"1.3"}}
<!--cq{"decorated":false,"type":"aem-code-challenge/components/structure/page","path":"/content/aem-code-challenge/en/jcr:content","selectors":"txt","servlet":"CallApiServlet","totalTime":114,"selfTime":114}-->
The above CQ information is getting printed which is not required.
Thank you!
Solved! Go to Solution.
Views
Replies
Total Likes
First of all, you won't get this on publish. This information is some timing information, which is written only in Author, when the WCMMode is set accordingly. And also only for HTML renderings.
As your output is JSON, you should register the servlet correctly and use the "json" extension. Then all should work fine.
I am seeing you are using .txt extension. how you are hitting a servlet?
Iam hitting my servlet with the below url like:
http://localhost:4502/content/aem/en.txt.html
Iam getting the same result even if I give any other extensions.
@maheswari25 can you check what is the logic behind CallApiService apiCall; ?
And also if you can debug if apiCall.getApiData(req.getParameterMap()); is giving the response or else the CQ information is coming from the servlet class.
I am expecting that CQ information is coming from the api response.
The servlet response is not containing the cq information. I checked in the logs and its not coming from servlet response..CQ data is coming only when printing response on the page.
I have written this sample servlet
package com.aem.demo.core.servlets; import java.io.IOException; import java.util.Map; import java.util.Map.Entry; import javax.servlet.Servlet; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; import org.apache.sling.api.servlets.HttpConstants; import org.apache.sling.api.servlets.SlingAllMethodsServlet; import org.osgi.framework.Constants; import org.osgi.service.component.annotations.Component; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Component(service = Servlet.class, property = { Constants.SERVICE_DESCRIPTION + "=Servlet to call API Url", "sling.servlet.methods=" + HttpConstants.METHOD_GET, "sling.servlet.resourceTypes=" + "weretail/components/structure/page", "sling.servlet.extensions=" + "txt" }) public class DemoResponseServlet extends SlingAllMethodsServlet { private final Logger logger = LoggerFactory.getLogger(DemoResponseServlet.class); protected void doGet(SlingHttpServletRequest slingHttpServletRequest, SlingHttpServletResponse slingHttpServletResponse) throws IOException { slingHttpServletResponse.setContentType("application/json"); Map<String, String[]> parameterMap = slingHttpServletRequest.getParameterMap(); for (String key : parameterMap.keySet()) { String[] strArr = (String[]) parameterMap.get(key); for (String val : strArr) { //slingHttpServletResponse.getWriter().write(val); } } } }
it's giving me CQ related information in servlet response using localhost:7070/content/we-retail/language-masters/en/men.txt.html as shown below -
txt is an extension here, why are you accessing as a selector?
Even if I give any other extension such as 'abc' or any text, CQ information is getting printed. But when I give xml as extension, CQ information is not getting printed. Is there a reason behind this?
If I access Url as http://localhost:4502/content/aem-code/en.html.xml , Iam not getting CQ information
I am getting Internal error while trying to access http://localhost:7070/content/we-retail/language-masters/en/men.txt.abc
Again same question in your code txt is an extension here, why are you accessing as a selector?
Could you please try to access http://localhost:4502/content/aem/en/jcr:content.txt and share the response.
Hi,
Are you using ACS Common and checking this in Author?
Can you try in publish?
First of all, you won't get this on publish. This information is some timing information, which is written only in Author, when the WCMMode is set accordingly. And also only for HTML renderings.
As your output is JSON, you should register the servlet correctly and use the "json" extension. Then all should work fine.