« Voltar para Web Services

Creating Liferay 6 plugin web service

Today I tried to create a service in a plugin portlet of liferay. Since this is not very straight forward, it took me the whole day to get my simple service running. As a matter of fact, I decided to publish this on the web.

I used Liferay6.0.5 source and plugin sdk, along with eclipse 3.6, with WTP and Liferay IDE 1.0.1. The base platform was Java1.6.0_21 and MySQL5.1.46, both running on openSuse11.3. The deployment server was tomcat6.0.26.

Step 1: Setup liferay source project and tomcat

  1. Unzip the liferay source in your eclipse workspace. In eclipse, create a new project with the name liferay-portal-src-6.0.5. Eclipse will automatically detect the project type and configure it accordingly.

  2. Open the app.server.properties and edit the app.server.parent.dir to point to the folder containing the tomcat installation. Note that this is the parent folder of CATALINA_HOME. For me it was: app.server.parent.dir=/home/swoosh/installations

  3. Un-comment: app.server.type=tomcat

  4. Scroll down and change the app.server.tomcat.dir, so that it points to the CATALINA_HOME. For me it was: app.server.tomcat.dir=${app.server.parent.dir}/liferay-tomcat-6.0.26

  5. Save and close the app.server.properties

  6. Create a DB schema and user using any tool (I used MySQL Administrator)

  7. Open the portal.properties and comment out the HSQL (Hypersonic) DB settings.

  8. Un-comment the MySQL DB settings and change the host, schema name, username and password. For me the settings were:
    jdbc.default.driverClassName=com.mysql.jdbc.Driver
    jdbc.default.url=jdbc:mysql://localhost/lportal?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false
    jdbc.default.username=liferay
    jdbc.default.password=test

  9. Save and close the portal.properties file.

  10. Now open the ant view in eclipse and drag liferay-portal-src-6.0.5/portal-web/build.xml and liferay-portal-src-6.0.5/build.xml file to the ant view. Wait for some time as ant loads the set of build files.

  11. Run the build-themes task under portal-web (from liferay-portal-src-6.0.5/portal-web/build.xml). Make sure that you get Build Successful message everytime you fire an ant task. (There is a bug in liferay's builder due to which it doesn't create the themes when you compile the source. If you directly deploy the source, you wont be able to access the home page).

  12. Now run the compile task under portal (from liferay-portal-src-6.0.5/build.xml).

  13. Then run the deploy task under the same file. Watch the log to verify that ant is copying the files to the right folder. If not, then double check the settings specified in the app.server.properties file.

  14. Now you have tomcat bundled up with the liferay portal. To start it you need to set up the runtime in eclipse. Go to Window->Preferences->Server->Runtime Environments. Click Add. Select the srever type as Liferay v6.0 (Tomcat 6). Click next. Give a name to your runtime - Liferay v6 (Tomcat 6). Browse and select the tomcat folder that you specified in app.server.properties' app.server.tomcat.dir property. Select runtime as java 1.6 and click Finish.

  15. If you don't have a server project in your workspace, then create a new one. Right click on the server project and Create a new server. Select the server type as Liferay v6.0 (Tomcat 6) and runtime as Liferay v6 (Tomcat 6). Server's host name should be localhost. Click next and click Finish.

  16. Now the server should appear under your server view (Add the view from Window->Show View->Servers)

  17. Double click on the server and change the Timeouts to 300 seconds. This will give enough time to the server to create and populate the DB schema for the first time.

  18. Right click on the server and select start.

  19. The liferay server should start. For the first time, it will create all the tables and populate them with the seed data.

  20. Once you get the server started message, open the web browser and open the http://localhost:8080. You should get the liferay's default home page. Enter test@liferay.com as email address and test as password.

  21. If you are not able to see the liferay's page even though the source was compiled and deployed successfully, then please check your app.server.properties file.

Step 2: Setup plugin SDK.

  1. Download and unzip the plugins sdk.

  2. Open the liferay-plugins-sdk-6.0.5/build.properties file and change the server settings:
    app.server.type=tomcat app.server.dir=/home/swoosh/installations/liferay-tomcat-6.0.26 app.server.deploy.dir=${app.server.dir}/webapps app.server.lib.global.dir=${app.server.dir}/lib/ext app.server.portal.dir=${app.server.dir}/webapps/ROOT

  3. Go to Window->Preferences->Liferay->Installed SDKs.

  4. Click on Add. In the pop-up window browse to the unzipped sdk folder and click Ok.

Step 3: Create the service project

  1. Now create a new Liferay plug-in project. Enter the details as in the screenshot below:

  2. Click Next and select Dynamic Web module version 2.5 and Default configuration for Liferay v6.0 (Tomcat 6).

  3. Click Finish and Click Yes on the Switch Perspective dialog box.

  4. A new TestPlugin-Portlet Project will appear in the navigator.

  5. Now right click on the plugin project and select New->Liferay Service.

  6. Enter the detail as in the screenshot below:

  7. You can enter a different package and Namespace. In that case you will have to follow the next steps accordingly.

  8. Click Finish. The service.xml file will be created and will be opened in the service editor.

  9. The service.xml is similar to the service definition files in the ext environment of older liferay versions. Here we can define as many entities along with their functions.

  10. We will create an Employee entity with id (long) and name (String) attributes. The service definition looks like:

  11. Save the service.xml file.

  12. Drag the TestPlugin-portlet/build.xml to the Ant view.

  13. In the ant view, expand the TestPlugin-portlet and run the build-service task.

  14. If the build fails, please check if you have followed the point number 2 in Step 2. On successful build, the ant task creates the files related to Employee entity.

  15. Refresh your project (F5) to see the files.

  16. Right click on the project go to Properties->Java Build Path->Source tab. Add the TestPlugin-portlet/docroot/WEB-INF/service and TestPlugin-portlet/docroot/WEB-INF/src folders, and click Ok.

  17. Implement the service by editing com.liferay.test.service.impl.EmployeeLocalServiceImpl. Add the implementations for CRUD and finder methods. They look like the following listing:
    public Employee create(Employee model) throws SystemException{
      long id = CounterLocalServiceUtil.increment(Employee.class.getName());
      model.setId(id);
      Employee newModel = EmployeeUtil.create(model.getId());

      newModel.setName(model.getName());
      EmployeeUtil.update(newModel, true);
      return newModel;
    }

    public Employee update(Employee model) throws NoSuchEmployeeException, SystemException{
      Employee newModel = EmployeeUtil.findByPrimaryKey(model.getId());

      newModel.setName(model.getName());

      EmployeeUtil.update(newModel, true);

      return newModel;
    }

    public List<Employee>
    findByName(String name) throws SystemException{
      return EmployeeUtil.findByName(name);
    }

    public Employee remove(long id) throws NoSuchEmployeeException, SystemException{
      return EmployeeUtil.remove(id);
    }

  18. Run the TestPlugin-portlet/build-service task and make sure that build is successful.

  19. Similarly edit the com.liferay.test.service.impl.EmployeeServiceImpl Add the CRUD and finder methods as listed below:
    public Employee create(Employee model) throws SystemException{
      return EmployeeLocalServiceUtil.create(model);
    }

    public Employee update(Employee model) throws NoSuchEmployeeException, SystemException{
      return EmployeeLocalServiceUtil.update(model);
    }

    public List<Employee> findByName(String name) throws SystemException{
      return EmployeeLocalServiceUtil.findByName(name);
    }

    public Employee remove(long id) throws NoSuchEmployeeException, SystemException{
      return EmployeeLocalServiceUtil.remove(id);
    }

  20. Run the TestPlugin-portlet/build-service task again and make sure that build is successful.

  21. There is a bug in liferay's service builder due to which it doesn't generate the ServiceSoap class correctly. It is not able convert the parameters to their corresponding soap type. See http://issues.liferay.com/browse/LPS-12629 for details. To get around this issue open the EmployeeServiceSoap and change the generated create and update methods as:

     
    publicstatic com.liferay.test.model.EmployeeSoap create(
       com.liferay.test.model.EmployeeSoap model) throws RemoteException {
     try {
      com.liferay.test.model.Employee returnValue = EmployeeServiceUtil.create(com.liferay.test.model.impl.EmployeeModelImpl.toModel(model));
     
      return com.liferay.test.model.EmployeeSoap.toSoapModel(returnValue);
      }
      catch (Exception e) {
      _log.error(e, e);
     
      throw new RemoteException(e.getMessage());
      }
    }
     
    publicstatic com.liferay.test.model.EmployeeSoap update(
       com.liferay.test.model.EmployeeSoap model) throws RemoteException {
     try {
      com.liferay.test.model.Employee returnValue = EmployeeServiceUtil.update(com.liferay.test.model.impl.EmployeeModelImpl.toModel(model));
     
      return com.liferay.test.model.EmployeeSoap.toSoapModel(returnValue);
      }
      catch (Exception e) {
      _log.error(e, e);
     
      thrownew RemoteException(e.getMessage());
      }
    }

  22.  Now run the TestPlugin-Portlet/build-wsdd task to generate the webservices.

  23. Once this is complete, start the server if not already started.
  24. Then run TestPlugin-Portlet/compile and TestPlugin-Portlet/deploy.
  25. Check the logs for "1 portlet for TestPlugin-portlet is available for use" message.
  26. If that appears, open the http://localhost:8080 in your browser.
  27. Login as test@liferay.com and password test.
  28. Go to Add -> More->Samples. Add the TestPlugin to you page. Make sure that the default page for the plugin appears. This confirms that the plugin was deployed properly.
  29. Now open http://127.0.0.1:8080/TestPlugin-portlet/axis/Plugin_Test_EmployeeService?wsdl in your browser and confirm that the wsdl opens up.
  30. This completes the plugin service creation.

Step 4: Create Web service client

  1. Now we need to test our webservice. For that we need to have another tomcat runtime as our Liferay tomcat 6 runtime eclipse plugin doesn't support building webservices. Also we need to make sure that the tomcat runtime and liferay runtime run on different ports. I used the ports 9005, 9080 and 9009 for my tomcat runtime.

  2. In eclipse go to New->Webservice Client and enter the details as in the screenshot below:

  3. Click Next on this and next screen. Then click on "Start server" to start the tomcat runtime. Then click Finish.

  4. Select all the methods and click Finish

  5. Eclipse will then deploy the client and open up a screen to test your webservice.

  6. Click on the methods to test them.

  7. We will test create method first. We will provide the primaryKey=0, name=Liferay and id=0 and click invoke.

  8. In the results section we can see that the employee entity has been created with the id=1.

  9. Now invoke findByName and provide name=Liferay. The result will show the reference of the entity object returned by the webservice.

That completes the tutorial. The complete plugin and the webservice client can be downloaded from the attachments of this post. Hope that was helpful. Do write your comments.


2 Anexos
108367 Visualizações
Média (12 Votos)
A média da avaliação é 4.583333333333333 estrelas de 5.
Comentários
Respostas do tópico Autor Data
Nice article. Thanks! Juan Fernández 14 de Setembro de 2010 01:28
Thanks for the feedback :) Kapil Dev Verma 14 de Setembro de 2010 02:24
Some picture of this article can't display,I... XinYang Zhang 14 de Setembro de 2010 02:29
I have updated the article, hope you can see... Kapil Dev Verma 14 de Setembro de 2010 04:25
Please, I need your help:) Everything compiles,... Marius Marius 14 de Setembro de 2010 05:50
If everything goes fine, then you should get... Kapil Dev Verma 14 de Setembro de 2010 09:50
Hi Kapil Thanks for the excellent article. I... Liferay Developer 17 de Setembro de 2010 08:41
Hi.. Please provide me the zip of your plugin... Kapil Dev Verma 19 de Setembro de 2010 11:56
Kapil, what is the best way to send you the... Liferay Developer 23 de Setembro de 2010 12:23
You can mail me that at kapildverma@gmail.com Kapil Dev Verma 26 de Setembro de 2010 22:15
In this tutorial you advice to edit... Andrius Kurtinaitis 14 de Setembro de 2010 06:06
Thanks for the suggestion :) Kapil Dev Verma 14 de Setembro de 2010 09:48
Hi Kapil, Really very nice description to... sasi Kanth 16 de Setembro de 2010 23:12
Thanks Sasi for the feedback! Kapil Dev Verma 17 de Setembro de 2010 01:37
Very Nice Article. Thanks!! Harish Kumar 27 de Setembro de 2010 21:34
I need some help. Everything compiles, the wsdd... Andreea Tabacariu 27 de Outubro de 2010 02:53
Can you try running the samples attached with... Kapil Dev Verma 10 de Novembro de 2010 23:59
anybody know this error, help me.... DO Hung Thuan 14 de Novembro de 2010 23:55
Is there a way to expose REST based services... Seshendra Nalla 24 de Novembro de 2010 08:29
Hi there, at the end of your tutorial when I... Jack Bauer 25 de Novembro de 2010 11:55
Ok so I noticed what I was doing wrong, stupid... Jack Bauer 26 de Novembro de 2010 10:17
Result exception: java.rmi.RemoteException:... Sreeraj AV 26 de Dezembro de 2010 23:37
@Raju - The issue seems to somewhere in... Kapil Dev Verma 28 de Dezembro de 2010 21:22
Very nice article. Thanks!!! Dien NH 20 de Janeiro de 2011 18:38
When I was executing the build-service task ant... Luca Andreatta 25 de Janeiro de 2011 03:09
Hi Kapil, I have a requirement, where instead... Venkat Sankar Rao 7 de Fevereiro de 2011 14:27
Hi Venkat, From the stacktrace, we can see... Kapil Dev Verma 9 de Fevereiro de 2011 21:54
First thank you for a great guide, works great... Andrew Tillinghast 28 de Fevereiro de 2011 11:52
Hi Andrew, Thanks for your comments. I am not... Kapil Dev Verma 4 de Março de 2011 10:24
Nice article.Thank Kapil! Nguyen Trung Kien 11 de Março de 2011 07:23
Hi Kapil, I want add new method in existing... Nguyen Trung Kien 12 de Março de 2011 17:55
Hi Nguyen, You might have to create a new... Kapil Dev Verma 21 de Março de 2011 00:20
Nice article. Thank you Tom Mahy 22 de Agosto de 2011 05:31
Concerning Error:... Martin Wiegand 9 de Setembro de 2011 15:46
Sorry, it was a mistake. Removing axis.jar is... Martin Wiegand 12 de Setembro de 2011 05:38
Venkat S, dont forget to run a new tomcat... Tamás Barabás 28 de Novembro de 2011 03:53
Hi Kapli, Nice Article But i have an... Raghu teja 14 de Dezembro de 2011 21:58
I'm getting exception:... Shantanu Puranik 1 de Fevereiro de 2012 01:13
This worked perfect on 6.0.6 but on 6.1 i cant... Tom Mahy 17 de Fevereiro de 2012 06:03
You can find service under /api/axis on liferay... Sy Do 5 de Março de 2012 20:10
in step 3 -> 29 i cannot seem to get the WSDL... Patrick Momin 15 de Março de 2012 07:50
I found the Solution by comparing the entries... Patrick Momin 16 de Março de 2012 02:37
Hi, I'm experiencing a problem since few days.... Giuseppe Pantaleo 19 de Junho de 2012 02:17
I have same problem. Can you tell me solution? ... Petr Vasek 12 de Julho de 2012 02:53
For all , problem is in implement of... Petr Vasek 14 de Julho de 2012 02:36
Try this URL... Onkar Sutar 5 de Fevereiro de 2013 01:35
Thanks , Its was very helpful. Atif Hussain 7 de Janeiro de 2013 04:08
Nice..For Beginners..Its really nice... sheela mk 18 de Fevereiro de 2013 22:57
Nice Article kapil Thanks for sharing...:) jaid shaik 15 de Maio de 2013 02:29
Hi Kapil, I have take your sample portlet and... Abdulbasit Shaikh 7 de Junho de 2013 04:54
Hi Kapil, Thanks for such a nice doucment.I... Abdulbasit Shaikh 11 de Junho de 2013 01:55
I am using Liferay 6.1.1 I need some help.... Syed Mujeeb 21 de Março de 2014 13:18
In Liferay 6.1+ they have changed some URLs. ... Luca Andreatta 4 de Setembro de 2014 03:00
For documentation you can look here:... Luca Andreatta 4 de Setembro de 2014 03:01

Nice article. Thanks!
Postado em 14/09/10 01:28.
Thanks for the feedback emoticon
Postado em 14/09/10 02:24 em resposta a Juan Fernández.
Some picture of this article can't display,I can't see them.Could you fix it
Postado em 14/09/10 02:29.
I have updated the article, hope you can see the images now. Please do a ctrl+F5.
Postado em 14/09/10 04:25 em resposta a XinYang Zhang.
Please, I need your helpemoticon
Everything compiles, deploys etc. but I am stuck at this point: http://127.0.0.1:8080/TestPlugin-portlet/axis/Plugin_Test_EmployeeService?wsd I get axis error because "Could not generate WSDL"
of cource and there: http://127.0.0.1:8080/tunnel-web/axis I don't see my plugin.
Postado em 14/09/10 05:50 em resposta a Kapil Dev Verma.
In this tutorial you advice to edit portal.properties file. This is oficially not recommended. This file does not even exist in a zipped bundle. Wouldn't it be better to change this filename to portal-ext.properties?
Postado em 14/09/10 06:06.
Thanks for the suggestion emoticon
Postado em 14/09/10 09:48 em resposta a Andrius Kurtinaitis.
If everything goes fine, then you should get docroot/WEB-INF/server-config.wsdd file generated. Verify if it is getting generated. Also, it would be helpful if you attach your plugin project.
Postado em 14/09/10 09:50 em resposta a Marius Marius.
Hi Kapil,

Really very nice description to generate service and web serivces in a portlet.

Thank you.
Postado em 16/09/10 23:12.
Thanks Sasi for the feedback!
Postado em 17/09/10 01:37 em resposta a sasi Kanth.
Hi Kapil

Thanks for the excellent article.
I am having the same problem as Marius. There is an error when I try to generate the wsdl and I checked for the server-config.wsdd and was not able to find it.
Postado em 17/09/10 08:41 em resposta a Kapil Dev Verma.
Hi.. Please provide me the zip of your plugin project. Thanks!
Postado em 19/09/10 11:56 em resposta a Liferay Developer.
Kapil,
what is the best way to send you the zip?
Thanks..
Postado em 23/09/10 12:23 em resposta a Kapil Dev Verma.
You can mail me that at kapildverma@gmail.com
Postado em 26/09/10 22:15 em resposta a Liferay Developer.
Very Nice Article. Thanks!!
Postado em 27/09/10 21:34.
I need some help. Everything compiles, the wsdd is created, the deploy works with no error, the portlet page loads but when I try to see the wsdl: http://127.0.0.1:8080/TestPlugin-portlet/axis/Plugin_Test_EmployeeService?wsd I am redirected to the portal home page and my service does not appear in http://127.0.0.1:8080/tunnel-web/axis
Postado em 27/10/10 02:53.
Can you try running the samples attached with the post? If you still face the problem, please feel free to mail me your plugin.
Postado em 10/11/10 23:59 em resposta a Andreea Tabacariu.
anybody know this error, help me.
http://www.liferay.com/community/forums/-/message_boards/message/6414062
Postado em 14/11/10 23:55.
Is there a way to expose REST based services instead of SOAP using Liferay Service builder?
Postado em 24/11/10 08:29.
Hi there, at the end of your tutorial when I try to test by adding a Webservice Client I get the following error:

"The Apache Axis Web service runtime in Tomcat v6.0 Server does not support the client project TestPlugin-portlet."

I set it up exactly as you have it laid out in the picture as well so hopefully someone knows how to solve this problem because I find nothing when googling.
Postado em 25/11/10 11:55.
Ok so I noticed what I was doing wrong, stupid mistake trying to setup the WebService Client to point to the TestPlugin instead of the WebServiceProject attached.

I'll just list some problems and solutions I had here for anyone else that runs into the same stuff I did. You need to import that WebServiceProject attached and do the WebServices Client on that.

After installing another version of Tomcat on your system you have to go into the tomcat/conf/server.xml to modify the ports like Kapil mentioned.

I also had to copy all the jars inside the WEB-INF/lib folder of WebServiceProject into the alternate Tomcat/lib folder.
Postado em 26/11/10 10:17 em resposta a Clayton Jarczewski.
Result
exception: java.rmi.RemoteException: com.liferay.portal.kernel.dao.orm.ORMException: org.hibernate.exception.SQLGrammarException: could not load an entity: [com.liferay.test.model.impl.EmployeeImpl#2]


how can i solve this issue?
Postado em 26/12/10 23:37.
@Raju - The issue seems to somewhere in database. Are you sure that the tables are created as required? See portlet-hbm.xml and portlet-orm.xml in /TestPlugin-portlet/docroot/WEB-INF/classes/META-INF/. Use sql files in /TestPlugin-portlet/docroot/WEB-INF/sql/ to create the tables.
Postado em 28/12/10 21:22 em resposta a Raju OO7.
Very nice article. Thanks!!!
Postado em 20/01/11 18:38.
When I was executing the build-service task ant was waiting in the java-compile ant task. I setted fork to "no" and all goes ok. Is there any controindication?
Postado em 25/01/11 03:09.
Hi Kapil,

I have a requirement, where instead of accessing db i want a webservice which does action on cache, so i tried to follow the same steps except one change,
(ie)
<entity name="Employee" local-service="true" remote-service="true"></entity>

I was able to deploy, but i get the below classcastexception, can u please help,

"AXIS error
Sorry, something seems to have gone wrong... here are the details:

Fault - ; nested exception is:
org.apache.axis.ConfigurationException: java.lang.ClassCastException: org.apache.axis.handlers.http.URLMapper cannot be cast to org.apache.axis.Handler
java.lang.ClassCastException: org.apache.axis.handlers.http.URLMapper cannot be cast to org.apache.axis.Handler
at org.apache.axis.deployment.wsdd.WSDDDeployableItem.makeNewInstance(WSDDDeployabl­eItem.java:302)
at org.apache.axis.deployment.wsdd.WSDDDeployableItem.getNewInstance(WSDDDeployable­Item.java:274)
at org.apache.axis.deployment.wsdd.WSDDDeployableItem.getInstance(WSDDDeployableIte­m.java:260)
at org.apache.axis.deployment.wsdd.WSDDDeployment.getHandler(WSDDDeployment.java:39­4)
at org.apache.axis.deployment.wsdd.WSDDDeployableItem.getNewInstance(WSDDDeployable­Item.java:276)
at org.apache.axis.deployment.wsdd.WSDDDeployableItem.getInstance(WSDDDeployableIte­m.java:260)
at org.apache.axis.deployment.wsdd.WSDDChain.makeNewInstance(WSDDChain.java:125)
at­ org.apache.axis.deployment.wsdd.WSDDDeployableItem.getNewInstance(WSDDDeployable­Item.java:274)...."
Postado em 07/02/11 14:27 em resposta a Luca Andreatta.
Hi Venkat,

From the stacktrace, we can see that the makeNewInstance method in WSDDDeployableItem.java is expecting org.apache.axis.Handler, however, org.apache.axis.handlers.http.URLMapper is being passed.

It seems to be some configuration problem or it can even be version miss match. This has nothing to do with accessing DB or calling action on cache. The error is purely on axis side.

Please send me your project zip at kapildverma@gmail.com so that i can debug it.

Regards,
Kapil
Postado em 09/02/11 21:54 em resposta a Venkat S.
First thank you for a great guide, works great for 6.0.5

Now I have a Axis security question:

Is there any way to make /TestPlugin-Portlet/axis available to external IPs and still leave /tunnel-web/axis local IP only?

I know I can set axis.servlet.hosts.allowed= and leave the value blank to open the axis service to the world, but that opens the liferay wsdd as well, I just want to expose my custom SOAP services.

It looks to me that I could change the <init-param> values in my web.xml but would be over written every time I deploy.
<init-param>
<param-name>portal_property_prefix</param-name>
<param-value>axis.servlet.</param-value>
</init-param>


-Andrew
Postado em 28/02/11 11:52 em resposta a Kapil Dev Verma.
Hi Andrew,

Thanks for your comments. I am not an expert with axis. However, you can have a look at apache webserver's mod_proxy to achieve this....

http://httpd.apache.org/docs/trunk/mod/mod_proxy.html

Regards,
Kapil
Postado em 04/03/11 10:24 em resposta a Andrew Tillinghast.
Nice article.Thank Kapil!
Postado em 11/03/11 07:23.
Hi Kapil,
I want add new method in existing Liferay webservice as add new addGroupEXT to GroupServiceSOAP. What should I do?
I'm using Liferay CE 6.05.
Thanks.
Postado em 12/03/11 17:55.
Hi Nguyen,

You might have to create a new webservice for your extended class. The problem is that the webservice definition for GroupServiceSoap is embedded in liferay code and it can't be modified (without changing liferay code). So you will have to create a new webservice, with your custom addGroupEXT() method, which internally uses the liferay APIs to accomplish the tasks.

You can create your new class something like GroupEXTServiceImpl, import com.liferay.portal.service.GroupServiceUtil and write a method addGroupEXT() in it. From that method, you can call the GroupServiceUtil.addGroup().

Then you can expose your new class as webservice.

You can also try this by changing the plugin project attached with this post. It will be a lot easier if you are using Liferay's Eclipse plugin.

--
Kapil
Postado em 21/03/11 00:20 em resposta a Nguyen Trung Kien.
Nice article. Thank you
Postado em 22/08/11 05:31.
Concerning Error: "org.apache.axis.handlers.http.URLMapper cannot be cast to org.apache.axis.Handler"

There are some classloading issues. axis.jar is deployed in ROOT.war and in your Plugin WAR.

Solution: Remove the axis.jar in your Plugin WAR (WEB-INF/lib). It works fine for me.
Postado em 09/09/11 15:46 em resposta a Tom Mahy.
Sorry, it was a mistake. Removing axis.jar is not jet the solution. One ERROR has been gone, but NoClassDefError occurs on other location.

Does anybody have a solution for the Problem?
Postado em 12/09/11 05:38 em resposta a Martin Schwietzke.
Venkat S,

dont forget to run a new tomcat server, so you have the liferay's tomcat boundled, and a clear tomcat for the client
Postado em 28/11/11 03:53.
Hi Kapli,

Nice Article

But i have an issue with this ,when i am trying to bulid client (as per you article URL)as below its working fine ,methods are invoking and getting results

http://127.0.0.1:8080/TestPlugin-portlet/axis/Plugin_Test_EmployeeService?wsdl

Bu­t when i am trying to bulit webservice client as below URL ,

http://127.0.0.1:8080/TestPlugin-portlet/secure/axis/Plugin_Test_EmployeeService­?wsdl

methods are invoked but when iam trying to get results shows as
RE:404 unauthroized

Is Anything wrong in the URL???
Postado em 14/12/11 21:58 em resposta a Tamás Barabás.
I'm getting exception: java.rmi.RemoteException: BeanLocator has not been set
Postado em 01/02/12 01:13 em resposta a Raghu teja.
This worked perfect on 6.0.6 but on 6.1 i cant find the service under /tunnel-web/axis
Has anything changed ?
Postado em 17/02/12 06:03 em resposta a Shantanu Puranik.
You can find service under /api/axis on liferay 6.1
Postado em 05/03/12 20:10 em resposta a Tom Mahy.
in step 3 -> 29 i cannot seem to get the WSDL to show i get following error:

HTTP Status 404 - /TestPlugin-portlet/axis/Plugin_Test_EmployeeService

type Status report

message /TestPlugin-portlet/axis/Plugin_Test_EmployeeService

description The requested resource (/TestPlugin-portlet/axis/Plugin_Test_EmployeeService) is not available.
Apache Tomcat/7.0.23
Postado em 15/03/12 07:50.
I found the Solution by comparing the entries in the corresponding web.xml files:

in liferay 6.1 the url to call is "/TestPlugin-portlet/api/axis" instead of "/TestPlugin-portlet/axis"

I hope this saved some people's time.
Postado em 16/03/12 02:37 em resposta a Patrick Momin.
Hi, I'm experiencing a problem since few days.
My development environment is the following: I'm using Liferay6.1.0 CE GA1 source and plugin sdk, along with Eclipse Indigo Service Release 2, with WTP and Liferay IDE 1.5.2. The base platform is Java1.6.0_32 and the deployment server is Tomcat 7.0.23 (the one bundled with Liferay).
While executing the step 3 -22 (running TestPlugin-Portlet/build-wsdd) I'm getting the following error:
build-wsdd:
Loading jar:file:/D:/liferay-portal-6.1.0-ce-ga1/tomcat-7.0.23/webapps/ROOT/WEB-INF/lib/­portal-impl.jar!/system.properties
19-giu-2012 9.05.48 com.liferay.portal.kernel.log.Jdk14LogImpl info
INFO: Global lib directory /D:/liferay-portal-6.1.0-ce-ga1/tomcat-7.0.23/lib/ext/
19-giu-2012 9.05.48 com.liferay.portal.kernel.log.Jdk14LogImpl info
INFO: Portal lib directory /D:/liferay-portal-6.1.0-ce-ga1/tomcat-7.0.23/webapps/ROOT/WEB-INF/lib/
09:05:48,470 INFO [EasyConf:122] Refreshed the configuration of all components
09:05:48,770 INFO [ConfigurationLoader:56] Properties for jar:file:/D:/liferay-portal-6.1.0-ce-ga1/tomcat-7.0.23/webapps/ROOT/WEB-INF/lib/­portal-impl.jar!/portal loaded from [jar:file:/D:/liferay-portal-6.1.0-ce-ga1/tomcat-7.0.23/webapps/ROOT/WEB-INF/lib­/portal-impl.jar!/com/liferay/portal/tools/dependencies/portal-tools.properties,­ file:/D:/liferay-portal-6.1.0-ce-ga1/tomcat-7.0.23/webapps/ROOT/WEB-INF/classes/­portal-ext.properties, jar:file:/D:/liferay-portal-6.1.0-ce-ga1/tomcat-7.0.23/webapps/ROOT/WEB-INF/lib/­portal-impl.jar!/portal.properties]
Loading jar:file:/D:/liferay-portal-6.1.0-ce-ga1/tomcat-7.0.23/webapps/ROOT/WEB-INF/lib/­portal-impl.jar!/portal.properties
Loading file:/D:/liferay-portal-6.1.0-ce-ga1/tomcat-7.0.23/webapps/ROOT/WEB-INF/classes/­portal-ext.properties
Loading jar:file:/D:/liferay-portal-6.1.0-ce-ga1/tomcat-7.0.23/webapps/ROOT/WEB-INF/lib/­portal-impl.jar!/com/liferay/portal/tools/dependencies/portal-tools.properties
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/liferay-portal-6.1.0-ce-ga1/tomcat-7.0.23/webapps/ROOT/WEB-INF/lib­/util-java.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/liferay-plugins-sdk-6.1.0-ce-ga1/portlets/TestPlugin-portlet/docro­ot/WEB-INF/lib/util-java.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
Java2WSDL com.liferay.test.service.http.EmployeeServiceSoap
09:05:52,085 WARN [Types:1704] The class com.liferay.test.model.Employee does not contain a default constructor, which is a requirement for a bean class. The class cannot be converted into an xml schema type. An xml schema anyType will be used to define this class in the wsdl file.
WSDL2Java D:\liferay-plugins-sdk-6.1.0-ce-ga1\portlets\TestPlugin-portlet\2012061909055154­0\service.wsdl
Running Wsdl2javaAntTask with parameters:
verbose:false
debug:false
quiet:false
server-side:true
skeletonDeploy:false
helperGen:false
factory:null
nsIncludes:[]
nsExcludes:[]
factoryProps:[]
testCase:false
noImports:false
NStoPkg:{}
outputemoticon:\liferay-plugins-sdk-6.1.0-ce-ga1\portlets\TestPlugin-portlet\2012061909­0551540
protocolHandlerPkgs:
deployScope:
URLemoticon:\liferay-plugins-sdk-6.1.0-ce-ga1\portlets\TestPlugin-portlet\2012061909055­1540\service.wsdl
all:false
typeMappingVersion:1.2
timeout:45000
failOnNetworkErrors:false
printStackTraceOnFailure:true
namespaceMappingFile:null
username:null
:passwordnull
:noWrappedfalse
:allowInvalidURLfalse
:implementationClassNamenull
:classpathnull
http.proxyHost=null
http.proxyPort=null
http.proxyUser=null
http.proxyPassword=null
socks.proxyHost=null
socks.proxyPort=null
java.io.IOException: Type {http://model.test.liferay.com}Employee is referenced but not defined.
at org.apache.axis.wsdl.symbolTable.SymbolTable.checkForUndefined(SymbolTable.java:­665)
at org.apache.axis.wsdl.symbolTable.SymbolTable.add(SymbolTable.java:545)
at org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java:518)
at org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java:495)
at org.apache.axis.wsdl.gen.Parser$WSDLRunnable.run(Parser.java:361)
at java.lang.Thread.run(Thread.java:619)
Exception in thread "main" WSDL processing error for D:\liferay-plugins-sdk-6.1.0-ce-ga1\portlets\TestPlugin-portlet\2012061909055154­0\service.wsdl :
Type {http://model.test.liferay.com}Employee is referenced but not defined.
at org.apache.axis.tools.ant.wsdl.Wsdl2javaAntTask.execute(Wsdl2javaAntTask.java:30­4)
at com.liferay.util.ant.Java2WsddTask.generateWsdd(Java2WsddTask.java:108)
at com.liferay.portal.tools.WSDDBuilder._createServiceWSDD(WSDDBuilder.java:130)
at com.liferay.portal.tools.WSDDBuilder.build(WSDDBuilder.java:93)
at com.liferay.portal.tools.WSDDBuilder.main(WSDDBuilder.java:49)
Caused by: java.io.IOException: Type {http://model.test.liferay.com}Employee is referenced but not defined.
at org.apache.axis.wsdl.symbolTable.SymbolTable.checkForUndefined(SymbolTable.java:­665)
at org.apache.axis.wsdl.symbolTable.SymbolTable.add(SymbolTable.java:545)
at org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java:518)
at org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java:495)
at org.apache.axis.wsdl.gen.Parser$WSDLRunnable.run(Parser.java:361)
at java.lang.Thread.run(Thread.java:619)
Java Result: 1


Have you any suggestions to solve the problem?
Postado em 19/06/12 02:17 em resposta a Patrick Momin.
I have same problem. Can you tell me solution?

Thak you
Postado em 12/07/12 02:53 em resposta a Giuseppe Pantaleo.
For all , problem is in implement of XXXLocalServicesImp class. IN version liferay 6.1 dont necesarry correct methods in XXXServiceSoap.

->
http://www.liferay.com/community/forums/-/message_boards/message/14855175
Postado em 14/07/12 02:36 em resposta a Petr Vašek.
Thanks , Its was very helpful.
Postado em 07/01/13 04:08.
Try this URL
http://127.0.0.1:8080/TestPlugin-portlet/api/axis/Plugin_Test_EmployeeService­?wsdl
Postado em 05/02/13 01:35 em resposta a Patrick Momin.
Nice..For Beginners..Its really nice article..Thanks for your Good work emoticon
Postado em 18/02/13 22:57.
Nice Article kapil Thanks for sharing...emoticon
Postado em 15/05/13 02:29.
Hi Kapil,

I have take your sample portlet and deploy it.But I am getting an error like this,

AXIS error

Could not generate WSDL!

There is no SOAP service at this location

I am accessing this url : http://127.0.0.1:8080/TestPlugin-portlet/api/axis/Plugin_Test_EmployeeService?ws­dl

Any help would be appreciated.Thankx in advance.

Thanks And Regards,
Abdulbasit F Shaikh
Postado em 07/06/13 04:54.
Hi Kapil,

Thanks for such a nice doucment.I finally did this succesfully.

For Others,

If you are using Liferay 6.1.0 GA1(I don't know about others),then you need to follow the step number 21.The main culprit is the finder method.So first try to remove finder method and try this example.Make sure that you will not add any code of finder method in XXXLocalServiceImpl and XXXServiceimpl.And one more thing is that, if you are hitting an url and not getting output, then first try this http://127.0.0.1:8080/TestPlugin-portlet/api/axis, you will get the list of methods and one "wsdl" link, click on that, you will get your wsdl.cheers emoticon.

And for webservice client,first you need to create one dynamic web project.Then follow the steps of creating webservice client.Make sure that in step number 2,your newly created project(Dynamic web project) should be selected in client project.For E.G. in this case WebService project is selected.Make sure you tomcat is your normal tomcat not your liferay tomcat.And make sure that you dragged scroll to the top.You will find scroll on extreme left of window.

Thanks And Regards,
Abdulbasit F Shaikh.
Postado em 11/06/13 01:55.
I am using Liferay 6.1.1
I need some help. Everything compiles, the wsdd is created, the deploy works with no error, the portlet page loads but when I try to see the wsdl:
http://127.0.0.1:8080/TestPlugin-portlet/axis/Plugin_Test_EmployeeService?wsd I am gettting error HTTP Status 404 - /TestPlugin-portlet/axis/Plugin_Test_EmployeeService,
and also I can not see service
http://127.0.0.1:8080/tunnel-web/axis
Postado em 21/03/14 13:18.
In Liferay 6.1+ they have changed some URLs.

You have to type this URL:
http://127.0.0.1:8080/TestPlugin-portlet/api/axis/Plugin_Test_EmployeeServic­e?wsd
Postado em 04/09/14 03:00 em resposta a Syed Mujeeb.
For documentation you can look here:
http://www.liferay.com/it/community/wiki/-/wiki/1071674/Liferay+Web+Service­s+Listing
Postado em 04/09/14 03:01 em resposta a Luca Andreatta.