How to invoke remote service from Headless APIHow to invoke remote service from Headless APIhttps://liferay.dev/c/message_boards/find_thread?p_l_id=119785333&threadId=1212077832024-03-29T15:55:45Z2024-03-29T15:55:45ZRE: How to invoke remote service from Headless APISteve Weisshttps://liferay.dev/c/message_boards/find_message?p_l_id=119785333&messageId=1212107222021-10-21T17:22:31Z2021-10-21T17:22:30Z<p>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.</p>Steve Weiss2021-10-21T17:22:30ZHow to invoke remote service from Headless APIAlex Pasquinihttps://liferay.dev/c/message_boards/find_message?p_l_id=119785333&messageId=1212077822021-10-20T13:36:21Z2021-10-20T07:58:21Z<p>Dear all,</p>
<p> </p>
<p>It's my first project in which I'm involved actively with Rest
Builder and Service Builder.</p>
<p>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</p>
<p>Everything works, excluding the use of remote service.</p>
<p>Referencing the LocalService from the resource implementation, the
request goes to the LocalService and retrieve correct data, without
any Authorization.</p>
<p>Referencing the RemoteService from resoutce implementation, the
request gets the following exception:</p>
<pre>
<code class="language-java">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)</code></pre>
<p>The response I get from Liferay Api Explorer is the following:</p>
<p>
<img alt="" src="/documents/14/0/LiferayApiExplorer+%281%29.png/d49c5f54-407a-5c31-99cb-253f963063c2?t=1634715880184&imagePreview=1" />
<br /> </p>
<p>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.</p>
<p>For a more comprehensive explaination of the problem, I'm gonna share
the main snippet codes:</p>
<p>ResourceImpl:</p>
<pre>
<code class="language-java">@Component(
properties = "OSGI-INF/liferay/rest/v1_0/pf02-regions.properties",
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;
}</code></pre>
<p>RemoteServiceImpl</p>
<pre>
<code class="language-java">@Component(
property = {
"json.web.service.context.name=pfu",
"json.web.service.context.path=CG_pf02Regions"
},
service = AopService.class
)
public class CG_pf02RegionsServiceImpl extends CG_pf02RegionsServiceBaseImpl {
/*
* NOTE FOR DEVELOPERS:
*
* Never reference this class directly. Always use <code>be.sb.pf02.regions.service.CG_pf02RegionsServiceUtil</code> to access the cg_pf02 regions remote service.
*/
@Reference(policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY, target = "(model.class.name=be.sb.pf02.regions.model.CG_pf02Regions)")
private volatile ModelResourcePermission<CG_pf02Regions> _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;
}
}</code></pre>
<p>LocalServiceImpl</p>
<pre>
<code class="language-java">@Component(
property = "model.class.name=be.sb.pf02.regions.model.CG_pf02Regions",
service = AopService.class
)
public class CG_pf02RegionsLocalServiceImpl
extends CG_pf02RegionsLocalServiceBaseImpl {
/*
* NOTE FOR DEVELOPERS:
*
* Never reference this class directly. Use <code>be.sb.pf02.regions.service.CG_pf02RegionsLocalService</code> via injection or a <code>org.osgi.util.tracker.ServiceTracker</code> or use <code>be.sb.pf02.regions.service.CG_pf02RegionsLocalServiceUtil</code>.
*/
public CG_pf02Regions getCG_pf02RegionsByPf02ExtId(final long pf02ExtId) {
return cg_pf02RegionsPersistence.fetchByPf02ExtId(pf02ExtId);
}
}</code></pre>
<p>Please, can you help me?</p>
<p>Thank you.</p>
<p>Best wishes,</p>
<p> </p>
<p>Alex</p>