Message Boards

How to invoke remote service from Headless API

Alex Pasquini, modified 2 Years ago.

How to invoke remote service from Headless API

Junior Member Posts: 38 Join Date: 3/3/20 Recent Posts

Dear all,

 

It's my first project in which I'm involved actively with Rest Builder and Service Builder.

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

Everything works, excluding the use of remote service.

Referencing the LocalService from the resource implementation, the request goes to the LocalService and retrieve correct data, without any Authorization.

Referencing the RemoteService from resoutce implementation, the request gets the following exception:

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)

The response I get from Liferay Api Explorer is the following:


 

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.

For a more comprehensive explaination of the problem, I'm gonna share the main snippet codes:

ResourceImpl:

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

RemoteServiceImpl

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

LocalServiceImpl

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

Please, can you help me?

Thank you.

Best wishes,

 

Alex

thumbnail
Steve Weiss, modified 2 Years ago.

RE: How to invoke remote service from Headless API

Regular Member Posts: 107 Join Date: 9/20/11 Recent Posts

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.