Expand my Community achievements bar.

Don’t miss the AEM Skill Exchange in SF on Nov 14—hear from industry leaders, learn best practices, and enhance your AEM strategy with practical tips.
SOLVED

Calling Service in component

Avatar

Level 5

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;
}

1 Accepted Solution

Avatar

Correct answer by
Level 9

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.

%>

View solution in original post

16 Replies

Avatar

Level 9

A few follow-up questions:

  • What kind of error?.
  • I believe you have implementation class as well. Have you verified the annotations of implementation class?. A small code snippet could help us.

--

Jitendra

Avatar

Level 5

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

 

Avatar

Level 10

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/

Avatar

Level 10

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 :

http://help-forums.adobe.com/content/adobeforums/en/experience-manager-forum/adobe-experience-manage... 

Avatar

Level 10

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.

Avatar

Level 5

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

Avatar

Level 10

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. 

Avatar

Correct answer by
Level 9

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.

%>

Avatar

Level 10

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. 

Avatar

Level 5

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,

 

 

 

%>

Avatar

Level 10

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

Avatar

Level 9

Provide code of interface & your Implementation. Also mention component jsp where service method is being invoked.

---Jitendra

Avatar

Level 5
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); %>

Avatar

Level 5

please find attached ContentService.java class

Avatar

Level 9

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

Avatar

Level 5

thanks Jitendra, 

its working , thank you :)