Hi,
I am trying to call Service from my component and my service return json data, but when I am trying to call the service from Component , I am getting error.Please let me know how can I call the json data in my component jsp.
Please find attached my interface and implementation class.I am trying to call :
<%
com.petco.www.core.service.servlets.IContentService servicedata = sling.getService(com.petco.www.core.service.servlets.IContentService.class);
%>
<%=servicedata.getContent(String path)%>
CODE:
package com.abc.www.core.service.servlets;
import java.io.IOException;
import javax.jcr.RepositoryException;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;
import com.petco.www.core.service.exceptions.ContentServiceExceptions;
/*
* This is an interface class to retrieve content from the AEM Services. This interface will be invoked by different channel
* to get content using AEM services
*
*/
public interface IContentService {
/**
* This method will be invoked to get the content from AEM services.
*
* @param pageType
* @param path
* @return String
*/
public JSONObject getContent(String path)
throws ContentServiceExceptions,RepositoryException,IOException,JSONException;
}
Solved! Go to Solution.
Views
Replies
Total Likes
iNTERFACE HAS METHOD WITH STRING.
<%
com.abc.www.core.service.servlets.IContentService servicedata = sling.getService(com.abc.www.core.service.servlets.IContentService.class);
JSONObject finalJsonObjects = servicedata.getContent(); // ARGUMENT IS MISSING HERE. YOUR SHOULD PASS SOMETHING HERE.
%>
Views
Replies
Total Likes
A few follow-up questions:
--
Jitendra
Views
Replies
Total Likes
Hi Jitendra,
Please find attached Implementation class, and I am fetching the jcr node properties in json format , I am using service url for hitting the page,like:" http://localhost:4502/api/contentservice?pagetype=mspot&path=/content/pagename" and I am getting the json data correctly.
Now I need to call this code from component and display the json data in html format on browser.For this , I have created a component and I am trying to call the data in component like dis:
<%
com.abc.www.core.service.servlets.IContentService servicedata = sling.getService(com.abc.www.core.service.servlets.IContentService.class);
JSONObject finalJsonObjects = servicedata.getContent();
%>
I am not able to call the json object here.Please let me know the correct way to call the json data here.
This is my Implementation class: ContentService.java
Views
Replies
Total Likes
Why dont you go for servlet approach instead of OSGI service
Same way you can hit your servlet with parameter and get the JSON reponse
we do have alot of articles implemented this approach
Here's one: http://adobeaemclub.com/news-component-in-aem-using-guardian-news-api/
Views
Replies
Total Likes
Make sure :
1. your service is registered in OSGI console
2. bundle is active
3. are you seeing any error like "only type can be imported resolves to a package" in error.log
Is this your thread :
Views
Replies
Total Likes
You are calling it the correct way - sling.getService().
If that is not found (and bunlde is active)- you may have a package conflict.
If you have a lot of services in the same package - i find AEM sometimes has issues. Try placing your service in a new package for testing purposes - ie - foo.mypackage.
Let us know what happens.
Views
Replies
Total Likes
Hi Praveen,
1. service is registered in OSGI console
2. bundle is active
3. I am getting error :
"Only a type can be imported" and
"The method getContent(String) in the type IContentService is not applicable for the arguments ().."
: please check the way to call the jsonobject , am I doing correct or not:
<%
com.abc.www.core.service.servlets.IContentService servicedata = sling.getService(com.abc.www.core.service.servlets.IContentService.class);
JSONObject finalJsonObjects = servicedata.getContent();
%>
:- thread is not mine but this my friend thread , and this thread is also for the same problem
Views
Replies
Total Likes
As i stated - try to place service in new package and try again. Sometimes package conflicts occur.
However - your code is correct in terms of calling a service. I think its a package issue. I have seen that before.
Views
Replies
Total Likes
iNTERFACE HAS METHOD WITH STRING.
<%
com.abc.www.core.service.servlets.IContentService servicedata = sling.getService(com.abc.www.core.service.servlets.IContentService.class);
JSONObject finalJsonObjects = servicedata.getContent(); // ARGUMENT IS MISSING HERE. YOUR SHOULD PASS SOMETHING HERE.
%>
Views
Replies
Total Likes
Here is a community article that may help what is going on:
http://www.wemblog.com/2013/05/how-to-perform-system-clean-up-in-adobe.html
I suspect that your project has issues as described in the article.
To see if this is an issue- try installing your project on a fresh instance of AEM.
Views
Replies
Total Likes
Hi,
I have created new new package in new AEM instance , I have tested ,
upto calling service nothing is wrong
com.abc.www.core.service.servlets.IContentService servicedata = sling.getService(com.abc.www.core.service.servlets.IContentService.class);
(I am getting error when I am adding " JSONObject finalJsonObjects = servicedata.getContent(); "
:I have tested with passing parameter also but getting the error:"
"Only a type can be imported" and
"The method getContent(String) in the type IContentService is not applicable for the arguments ().."
:Return type in my service class is JSONObject and problem is only with my way to call the jsonobject. with this line: "JSONObject finalJsonObjects = servicedata.getContent();"
Please let me know how can I call JSONObject in my component jsp.
Regards,
%>
Views
Replies
Total Likes
1. Make sure you pass parameter as the method in interface accepts the parameter.
2. Have jar file in your maven pom which helps you to use JSONObject
3. import json that class in jsp
Views
Replies
Total Likes
Provide code of interface & your Implementation. Also mention component jsp where service method is being invoked.
---Jitendra
Views
Replies
Total Likes
IContentService.java : interface ---------------------------------- package com.abc.www.core.service.servlets; import java.io.IOException; import javax.jcr.RepositoryException; import org.apache.sling.commons.json.JSONException; import org.apache.sling.commons.json.JSONObject; import com.abc.www.core.service.exceptions.ContentServiceExceptions; public interface IContentService { public JSONObject getContent(String path) throws ContentServiceExceptions,RepositoryException,IOException,JSONException; }
component jsp ----------------- <%@include file="/libs/foundation/global.jsp"%> <%@ page import="org.apache.sling.commons.json.io.*,org.w3c.dom.*" %> <%@taglib prefix="cq" uri="http://www.day.com/taglibs/cq/1.0" %> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@page import="com.abc.www.core.service.servlets.IContentService,org.apache.sling.commons.json.JSONException,org.apache.sling.commons.json.JSONObject"%> <%@ page import="org.apache.sling.commons.json.io.*,com.adobe.cq.*" %> <% com.abc.www.core.service.servlets.IContentService servicedata = sling.getService(com.abc.www.core.service.servlets.IContentService.class); JSONObject jsobject= servicedata.getContent(path); %>
Views
Replies
Total Likes
please find attached ContentService.java class
Views
Replies
Total Likes
Hey Varun,
You don't have annotations at the getContent() method. That's the reason, service is not able to identify this method. Just just @Override above this method and try.
@Override public JSONObject getContent(String path) throws ContentServiceExceptions, RepositoryException, IOException, JSONException { methodName = "getContent()"; // if block will be executed if path object is null or empty if(ContentServiceUtil.isEmpty(path)){ throw new ContentServiceExceptions("["+className+"."+methodName+"] "+ContentServiceConstants.EMPTY_PATH_TYPE_ERROR_MSG); } jsonContent = getStaticContent(path); return jsonContent; }
-----------------------------------------------------------------------------------------------
--------Jitendra
Views
Replies
Total Likes
thanks Jitendra,
its working , thank you :)
Views
Replies
Total Likes
Views
Likes
Replies