<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <title>How to invoke remote service from Headless API</title>
  <link rel="self" href="https://uat.liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=121207783" />
  <subtitle>How to invoke remote service from Headless API</subtitle>
  <id>https://uat.liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=121207783</id>
  <updated>2026-08-02T06:52:34Z</updated>
  <dc:date>2026-08-02T06:52:34Z</dc:date>
  <entry>
    <title>RE: How to invoke remote service from Headless API</title>
    <link rel="alternate" href="https://uat.liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121210722" />
    <author>
      <name>Steve Weiss</name>
    </author>
    <id>https://uat.liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121210722</id>
    <updated>2021-10-21T17:22:31Z</updated>
    <published>2021-10-21T17:22:30Z</published>
    <summary type="html">&lt;p&gt;I was just having the same problem (I think) of getting a 404 error.
  Turns out the wsdd JAR was missing. Make sure you build it and deploy it.&lt;/p&gt;</summary>
    <dc:creator>Steve Weiss</dc:creator>
    <dc:date>2021-10-21T17:22:30Z</dc:date>
  </entry>
  <entry>
    <title>How to invoke remote service from Headless API</title>
    <link rel="alternate" href="https://uat.liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121207782" />
    <author>
      <name>Alex Pasquini</name>
    </author>
    <id>https://uat.liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121207782</id>
    <updated>2021-10-20T13:36:21Z</updated>
    <published>2021-10-20T07:58:21Z</published>
    <summary type="html">&lt;p&gt;Dear all,&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;It's my first project in which I'm involved actively with Rest
  Builder and Service Builder.&lt;/p&gt;
&lt;p&gt;I followed the well done tutorial realized by David H Nebinger
  available in this link: https://liferay.dev/en/blogs/-/blogs/creating-headless-apis-part-1&lt;/p&gt;
&lt;p&gt;Everything works, excluding the use of remote service.&lt;/p&gt;
&lt;p&gt;Referencing the LocalService from the resource implementation, the
  request goes to the LocalService and retrieve correct data, without
  any Authorization.&lt;/p&gt;
&lt;p&gt;Referencing the RemoteService from resoutce implementation, the
  request gets the following exception:&lt;/p&gt;
&lt;pre&gt;
&lt;code class="language-java"&gt;2021-10-20 07:36:05.699 ERROR [http-nio-8080-exec-2][WebApplicationExceptionMapper:38] javax.ws.rs.ClientErrorException: HTTP 404 Not Found
javax.ws.rs.ClientErrorException: HTTP 404 Not Found
	at org.apache.cxf.jaxrs.utils.SpecExceptions.toHttpException(SpecExceptions.java:117)
	at org.apache.cxf.jaxrs.utils.ExceptionUtils.toHttpException(ExceptionUtils.java:168)
	at org.apache.cxf.jaxrs.utils.JAXRSUtils.findTargetMethod(JAXRSUtils.java:514)
	at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:181)
	at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:78)
	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
	at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
	at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:267)
	at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)
	at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)
	at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)
	at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:216)
	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:301)
	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:225)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:276)
	at org.eclipse.equinox.http.servlet.internal.registration.EndpointRegistration.service(EndpointRegistration.java:153)
	at org.eclipse.equinox.http.servlet.internal.servlet.FilterChainImpl.doFilter(FilterChainImpl.java:50)
	at com.liferay.portal.security.auth.verifier.internal.tracker.AuthVerifierFilterTracker$RemoteAccessFilter.doFilter(AuthVerifierFilterTracker.java:165)
	at org.eclipse.equinox.http.servlet.internal.registration.FilterRegistration.doFilter(FilterRegistration.java:121)
	at org.eclipse.equinox.http.servlet.internal.servlet.FilterChainImpl.doFilter(FilterChainImpl.java:45)
	at com.liferay.portal.remote.cors.internal.servlet.filter.CORSServletFilter.processCORSRequest(CORSServletFilter.java:80)
	at com.liferay.portal.remote.cors.internal.servlet.filter.CORSServletFilter.processFilter(CORSServletFilter.java:99)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
	at org.eclipse.equinox.http.servlet.internal.registration.FilterRegistration.doFilter(FilterRegistration.java:121)
	at org.eclipse.equinox.http.servlet.internal.servlet.FilterChainImpl.doFilter(FilterChainImpl.java:45)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:147)
	at com.liferay.portal.servlet.filters.authverifier.AuthVerifierFilter.processFilter(AuthVerifierFilter.java:196)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
	at org.eclipse.equinox.http.servlet.internal.registration.FilterRegistration.doFilter(FilterRegistration.java:121)
	at org.eclipse.equinox.http.servlet.internal.servlet.FilterChainImpl.doFilter(FilterChainImpl.java:45)
	at org.eclipse.equinox.http.servlet.internal.servlet.ResponseStateHandler.processRequest(ResponseStateHandler.java:70)
	at org.eclipse.equinox.http.servlet.internal.context.DispatchTargets.doDispatch(DispatchTargets.java:120)
	at org.eclipse.equinox.http.servlet.internal.HttpServiceRuntimeImpl.doDispatch(HttpServiceRuntimeImpl.java:372)
	at org.eclipse.equinox.http.servlet.internal.servlet.ProxyServlet.service(ProxyServlet.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
	at com.liferay.portal.module.framework.ModuleFrameworkServletAdapter.service(ModuleFrameworkServletAdapter.java:52)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:124)
	at com.liferay.portal.servlet.filters.password.modified.PasswordModifiedFilter.processFilter(PasswordModifiedFilter.java:62)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:215)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
	at com.liferay.portal.servlet.filters.lockout.LockoutFilter.processFilter(LockoutFilter.java:58)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:215)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:147)
	at com.liferay.portal.sharepoint.SharepointFilter.processFilter(SharepointFilter.java:88)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:215)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:147)
	at com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter.processFilter(VirtualHostFilter.java:248)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:215)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:196)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:99)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:196)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:99)
	at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176)
	at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
	at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
	at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:389)
	at com.liferay.portal.servlet.filters.urlrewrite.UrlRewriteFilter.processFilter(UrlRewriteFilter.java:65)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:215)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:175)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:99)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:175)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:99)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:196)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:99)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:104)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:887)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1684)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.base/java.lang.Thread.run(Thread.java:834)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The response I get from Liferay Api Explorer is the following:&lt;/p&gt;
&lt;p&gt;
  &lt;img alt="" src="/documents/14/0/LiferayApiExplorer+%281%29.png/d49c5f54-407a-5c31-99cb-253f963063c2?t=1634715880184&amp;amp;imagePreview=1" /&gt;
  &lt;br /&gt;  &lt;/p&gt;
&lt;p&gt;I guess I'm missing something related to the authorization, since
  everything works with local service and the remote service is not
  working at all.&lt;/p&gt;
&lt;p&gt;For a more comprehensive explaination of the problem, I'm gonna share
  the main snippet codes:&lt;/p&gt;
&lt;p&gt;ResourceImpl:&lt;/p&gt;
&lt;pre&gt;
&lt;code class="language-java"&gt;@Component(
	properties = &amp;quot;OSGI-INF/liferay/rest/v1_0/pf02-regions.properties&amp;quot;,
	scope = ServiceScope.PROTOTYPE, service = Pf02RegionsResource.class
)
public class Pf02RegionsResourceImpl extends BasePf02RegionsResourceImpl {
	
	@Override
	public Pf02Regions getPf02Regions(@NotNull String pf02regionsId) throws Exception {

		CG_pf02Regions cg_pf02Regions = _persisted_CG_pf02RegionsService.getCG_pf02Regions(Long.parseLong(pf02regionsId));
		Pf02Regions pf02Regions = new Pf02Regions();
		pf02Regions.setPf02id(Integer.valueOf(pf02regionsId));
		return pf02Regions;

	}
	
	protected Pf02Regions _toPf02Regions(CG_pf02Regions cg_pf02Regions) throws Exception {
		Pf02Regions result = new Pf02Regions();
		result.setPf02createdAt(cg_pf02Regions.getPf02created_at().toString());
		result.setPf02extId((int) cg_pf02Regions.getPf02ExtId());
		result.setPf02id((int) cg_pf02Regions.getPf02id());
		result.setPf02region(cg_pf02Regions.getPf02region());
		result.setPf02uploadedAt(cg_pf02Regions.getPf02updated_at().toString());

		return result;
	}
	
	@Reference
	private CG_pf02RegionsService _persisted_CG_pf02RegionsService;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;RemoteServiceImpl&lt;/p&gt;
&lt;pre&gt;
&lt;code class="language-java"&gt;@Component(
	property = {
		&amp;quot;json.web.service.context.name=pfu&amp;quot;,
		&amp;quot;json.web.service.context.path=CG_pf02Regions&amp;quot;
	},
	service = AopService.class
)
public class CG_pf02RegionsServiceImpl extends CG_pf02RegionsServiceBaseImpl {

	/*
	 * NOTE FOR DEVELOPERS:
	 *
	 * Never reference this class directly. Always use &amp;lt;code&amp;gt;be.sb.pf02.regions.service.CG_pf02RegionsServiceUtil&amp;lt;/code&amp;gt; to access the cg_pf02 regions remote service.
	 */
	
	@Reference(policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY, target = &amp;quot;(model.class.name=be.sb.pf02.regions.model.CG_pf02Regions)&amp;quot;)
	private volatile ModelResourcePermission&amp;lt;CG_pf02Regions&amp;gt; _persistedCG_pf02RegionsModelResourcePermission;

	public CG_pf02Regions getCG_pf02RegionsByPf02ExtId(final long pf02ExtId) throws PortalException {
		CG_pf02Regions result = cg_pf02RegionsLocalService.getCG_pf02RegionsByPf02ExtId(pf02ExtId);

		_persistedCG_pf02RegionsModelResourcePermission.check(getPermissionChecker(), result, ActionKeys.VIEW);

		return result;
	}

	public CG_pf02Regions getCG_pf02Regions(final long pf02Id) throws PortalException {
		CG_pf02Regions result = cg_pf02RegionsLocalService.getCG_pf02Regions(pf02Id);

		_persistedCG_pf02RegionsModelResourcePermission.check(getPermissionChecker(), result, ActionKeys.VIEW);

		return result;
	}
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;LocalServiceImpl&lt;/p&gt;
&lt;pre&gt;
&lt;code class="language-java"&gt;@Component(
	property = &amp;quot;model.class.name=be.sb.pf02.regions.model.CG_pf02Regions&amp;quot;,
	service = AopService.class
)
public class CG_pf02RegionsLocalServiceImpl
	extends CG_pf02RegionsLocalServiceBaseImpl {

	/*
	 * NOTE FOR DEVELOPERS:
	 *
	 * Never reference this class directly. Use &amp;lt;code&amp;gt;be.sb.pf02.regions.service.CG_pf02RegionsLocalService&amp;lt;/code&amp;gt; via injection or a &amp;lt;code&amp;gt;org.osgi.util.tracker.ServiceTracker&amp;lt;/code&amp;gt; or use &amp;lt;code&amp;gt;be.sb.pf02.regions.service.CG_pf02RegionsLocalServiceUtil&amp;lt;/code&amp;gt;.
	 */
	public CG_pf02Regions getCG_pf02RegionsByPf02ExtId(final long pf02ExtId) {
		return cg_pf02RegionsPersistence.fetchByPf02ExtId(pf02ExtId);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Please, can you help me?&lt;/p&gt;
&lt;p&gt;Thank you.&lt;/p&gt;
&lt;p&gt;Best wishes,&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Alex&lt;/p&gt;</summary>
    <dc:creator>Alex Pasquini</dc:creator>
    <dc:date>2021-10-20T07:58:21Z</dc:date>
  </entry>
</feed>
