Foren

Remoting Liferay from Java application

Dawid Czaplicki, geändert vor 12 Jahren.

Remoting Liferay from Java application

New Member Beiträge: 4 Beitrittsdatum: 21.03.12 Neueste Beiträge
Hi!

I'm trying to remotely obtain document metadata from the document library. I'm on my search for a few days now, but haven't come up with an elegant solution yet. I'm using Liferay 6.1 GA and the application I'm working on is in Java.

I have so far tried using SOAP services, yet with no success. The DLFileEntrySoap class does not provide equivalent for DLFileEntry.getFieldsMap(). I tried to build a service offering a similar method, but a map in a map in a map looks pretty bad. An attempt to put the data in a serializable wrapper class failed: when building services I get a "method refers to the missing type" error.

I also wanted to try out other options, like Spring Invoker, but no luck finding any examples (or, at least some basic information like which Spring or Liferay jar archives to use). I have some general idea, but no specifics.

Is there anyone having some experience and willing to share it?
Dawid Czaplicki, geändert vor 12 Jahren.

RE: Remoting Liferay from Java application

New Member Beiträge: 4 Beitrittsdatum: 21.03.12 Neueste Beiträge
OK, after some reading I've managed to move forward a bit, but I'm stuck again.

For now I'm trying to get a test call to UserService using spring. Following bradcrumbs from
http://www.liferay.com/community/forums/-/message_boards/message/5504664
http://www.liferay.com/community/forums/-/message_boards/view_message/11813726
http://www.liferay.com/community/forums/-/message_boards/view_message/106916

I have some very basic example code:

		HttpInvokerProxyFactoryBean factory = new HttpInvokerProxyFactoryBean();
		factory.setServiceUrl("http://localhost:8888/api/secure/spring/com_liferay_portal_service_spring_UserService-http");
		factory.setServiceInterface(UserService.class);
		
		factory.setHttpInvokerRequestExecutor(new SimpleHttpInvokerRequestExecutor() {
			@Override
			protected void prepareConnection(HttpURLConnection con,
					int contentLength) throws IOException {

				super.prepareConnection(con, contentLength);
				con.setRequestProperty(
						"Authorization",
						"Basic "
								+ new String(Base64.encodeBase64("test:test"
										.getBytes())));
			}
		});
		
		factory.afterPropertiesSet();
		UserService userService = (UserService) factory.getObject();		
		System.out.println(userService.getUserById(10195L).getScreenName());


I have also imported portal-client.jar, portal-server.jar, portal-impl.jar so I don't get the ClassDeffNotFound exception any more. What I do get is:

SEVERE: Unable to initialize PropsUtil
java.lang.NullPointerException
	at com.liferay.portal.kernel.util.ClassUtil.getParentPath(ClassUtil.java:134)
	at com.liferay.portal.kernel.servlet.WebDirDetector.getLibDir(WebDirDetector.java:25)
	at com.liferay.portal.util.PropsUtil.<init>(PropsUtil.java:130)
	at com.liferay.portal.util.PropsUtil.<clinit>(PropsUtil.java:323)
	at com.liferay.portal.model.impl.UserModelImpl.<clinit>(UserModelImpl.java:109)
	at java.io.ObjectStreamClass.hasStaticInitializer(Native Method)
	at java.io.ObjectStreamClass.computeDefaultSUID(ObjectStreamClass.java:1696)
	at java.io.ObjectStreamClass.access$100(ObjectStreamClass.java:52)
	at java.io.ObjectStreamClass$1.run(ObjectStreamClass.java:205)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.io.ObjectStreamClass.getSerialVersionUID(ObjectStreamClass.java:202)
	at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:558)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
	at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
	at org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor.doReadRemoteInvocationResult(AbstractHttpInvokerRequestExecutor.java:290)
	at org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor.readRemoteInvocationResult(AbstractHttpInvokerRequestExecutor.java:241)
	at org.springframework.remoting.httpinvoker.SimpleHttpInvokerRequestExecutor.doExecuteRequest(SimpleHttpInvokerRequestExecutor.java:95)
	at org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor.executeRequest(AbstractHttpInvokerRequestExecutor.java:136)
	at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.executeRequest(HttpInvokerClientInterceptor.java:192)
	at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.executeRequest(HttpInvokerClientInterceptor.java:174)
	at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.invoke(HttpInvokerClientInterceptor.java:142)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
	at $Proxy4.getUserById(Unknown Source)
	at com.comarch.learning.LiferayIntegration.doSomething(LiferayIntegration.java:216)
	at com.comarch.learning.LiferayIntegration.getDocumentFields(LiferayIntegration.java:106)
	at com.comarch.learning.LiferayIntegration.newDir(LiferayIntegration.java:72)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.ofbiz.service.engine.StandardJavaEngine.serviceInvoker(StandardJavaEngine.java:100)
	at org.ofbiz.service.engine.StandardJavaEngine.runSync(StandardJavaEngine.java:57)
	at org.ofbiz.service.ModelServiceReader$GenericInvokerImpl.runSync(ModelServiceReader.java:761)
	at _$gen.file_58$.C_58$.lci.ofbiz_95$git.ofbiz.hot_45$deploy.learning.servicedef.services_46$xml_35$LiferayNewDir.runSync(file:/C:/lci/ofbiz_git/ofbiz/hot-deploy/learning/servicedef/services.xml#LiferayNewDir:12)
	at org.ofbiz.service.ServiceDispatcher.runSync(ServiceDispatcher.java:399)
	at org.ofbiz.service.ServiceDispatcher.runSync(ServiceDispatcher.java:226)
	at org.ofbiz.service.GenericDispatcher.runSync(GenericDispatcher.java:163)
	at org.ofbiz.webapp.event.ServiceEventHandler.invoke(ServiceEventHandler.java:336)
	at org.ofbiz.webapp.control.RequestHandler.runEvent(RequestHandler.java:642)
	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:388)
	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:224)
	at org.ofbiz.webapp.control.ControlServlet.doPost(ControlServlet.java:87)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.ofbiz.webapp.control.ContextFilter.doFilter(ContextFilter.java:339)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:554)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:662)
org.springframework.remoting.RemoteAccessException: Could not access HTTP invoker remote service at [http://localhost:8888/api/secure/spring/com_liferay_portal_service_spring_UserService-http]; nested exception is java.lang.ExceptionInInitializerError
	at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.convertHttpInvokerAccessException(HttpInvokerClientInterceptor.java:212)
	at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.invoke(HttpInvokerClientInterceptor.java:145)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
	at $Proxy4.getUserById(Unknown Source)
	at com.comarch.learning.LiferayIntegration.doSomething(LiferayIntegration.java:216)
	at com.comarch.learning.LiferayIntegration.getDocumentFields(LiferayIntegration.java:106)
	at com.comarch.learning.LiferayIntegration.newDir(LiferayIntegration.java:72)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.ofbiz.service.engine.StandardJavaEngine.serviceInvoker(StandardJavaEngine.java:100)
	at org.ofbiz.service.engine.StandardJavaEngine.runSync(StandardJavaEngine.java:57)
	at org.ofbiz.service.ModelServiceReader$GenericInvokerImpl.runSync(ModelServiceReader.java:761)
	at _$gen.file_58$.C_58$.lci.ofbiz_95$git.ofbiz.hot_45$deploy.learning.servicedef.services_46$xml_35$LiferayNewDir.runSync(file:/C:/lci/ofbiz_git/ofbiz/hot-deploy/learning/servicedef/services.xml#LiferayNewDir:12)
	at org.ofbiz.service.ServiceDispatcher.runSync(ServiceDispatcher.java:399)
	at org.ofbiz.service.ServiceDispatcher.runSync(ServiceDispatcher.java:226)
	at org.ofbiz.service.GenericDispatcher.runSync(GenericDispatcher.java:163)
	at org.ofbiz.webapp.event.ServiceEventHandler.invoke(ServiceEventHandler.java:336)
	at org.ofbiz.webapp.control.RequestHandler.runEvent(RequestHandler.java:642)
	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:388)
	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:224)
	at org.ofbiz.webapp.control.ControlServlet.doPost(ControlServlet.java:87)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.ofbiz.webapp.control.ContextFilter.doFilter(ContextFilter.java:339)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:554)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.ExceptionInInitializerError
	at java.io.ObjectStreamClass.hasStaticInitializer(Native Method)
	at java.io.ObjectStreamClass.computeDefaultSUID(ObjectStreamClass.java:1696)
	at java.io.ObjectStreamClass.access$100(ObjectStreamClass.java:52)
	at java.io.ObjectStreamClass$1.run(ObjectStreamClass.java:205)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.io.ObjectStreamClass.getSerialVersionUID(ObjectStreamClass.java:202)
	at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:558)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
	at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
	at org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor.doReadRemoteInvocationResult(AbstractHttpInvokerRequestExecutor.java:290)
	at org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor.readRemoteInvocationResult(AbstractHttpInvokerRequestExecutor.java:241)
	at org.springframework.remoting.httpinvoker.SimpleHttpInvokerRequestExecutor.doExecuteRequest(SimpleHttpInvokerRequestExecutor.java:95)
	at org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor.executeRequest(AbstractHttpInvokerRequestExecutor.java:136)
	at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.executeRequest(HttpInvokerClientInterceptor.java:192)
	at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.executeRequest(HttpInvokerClientInterceptor.java:174)
	at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.invoke(HttpInvokerClientInterceptor.java:142)
	... 40 more
Caused by: java.lang.NullPointerException
	at com.liferay.portal.util.PropsUtil._get(PropsUtil.java:209)
	at com.liferay.portal.util.PropsUtil.get(PropsUtil.java:58)
	at com.liferay.portal.model.impl.UserModelImpl.<clinit>(UserModelImpl.java:109)
	... 67 more
</clinit></clinit></clinit></init>


Note I'm using Liferay 6.1.

Can somebody help?

And one extra question maybe: if I wanted to consume the DLFileEntryService, what the URL would be like?
Dawid Czaplicki, geändert vor 12 Jahren.

RE: Remoting Liferay from Java application [Resolved]

New Member Beiträge: 4 Beitrittsdatum: 21.03.12 Neueste Beiträge
It seems that there's a bug in Liferay 6.1 (probably after some refactoring). After some debugging I came across this code in class com.liferay.portal.kernel.servlet.WebDirDetector:

	public static String getLibDir(ClassLoader classLoader) {
		String libDir = ClassUtil.getParentPath(
			classLoader, "com.liferay.util.bean.PortletBeanLocatorUtil");

		if (libDir.endsWith("/WEB-INF/classes/")) {
			libDir = libDir.substring(0, libDir.length() - 8) + "lib/";
		}
		else {
			int pos = libDir.indexOf("/WEB-INF/lib/");

			if (pos != -1) {
				libDir = libDir.substring(0, pos) + "/WEB-INF/lib/";
			}
		}

		return libDir;
	}


According to the javadocs (http://docs.liferay.com/portal/6.1/javadocs/com/liferay/util/bean/PortletBeanLocatorUtil.html) class PortletBeanLocatorUtil is placed in package com.liferay.portal.kernel.bean, not com.liferay.util.bean. Once I corrected that (client-side) and importing some additional jars, the example code above works.
Maciej Witwicki, geändert vor 11 Jahren.

RE: Remoting Liferay from Java application [Resolved]

New Member Beiträge: 20 Beitrittsdatum: 05.07.12 Neueste Beiträge
Could you write some more information about dealing with that bug?
Did you create the missing package and class inside your project by yourself?

greetz