Creato da pastuweb.com
Share My Page
My Social Accounts
Account FaceBook Account LinkedIn Account Twitter Account Google Plus Account Git Hub
In questo esempio vi mostrerò come creare un Web Service usando SOAP/WSDL all'interno di un plugin/portlet Liferay.

Prima di tutto anticipo che:

  • il mio progetto si chiama "AppuntiVariMyLibrary-portlet";
  • la mia <entity> nel service.xml si chiama "MyLibrary".

Quindi vedrete spesso questi nomi all'interno dell'esempio.

Obiettivo: Esporre verso l'esterno due metodi:

  • public MyLibrary addBook_Fake(MyLibrary newBook);
  • public List<MyLibrary> getAllBooks();

Steps:

1. ho modificato la <entity name="MyLibrary" > aggiungendogli oltre che local-service="true" anche remote-service="true".

2. ho lanciato Liferay -> build-service

3. mi sono state generate le due classi sotto service.impl:

  • MyLibraryLocalServiceImpl.java
  • MyLibraryServiceImpl.java

4. ho implementato vari metodi locali all'interno di MyLibraryLocalServiceImpl.java:

  • public MyLibrary addBook(MyLibrary newBook);
  • public void deleteBook(long bookId);
  • public void deleteBook(MyLibrary book);
  • public List<MyLibrary> getAllBooks();

5. ho lanciato Liferay -> build-service

6. poi sono passato all'implementazione dei metodi che volevo esporre verso l'esterno. Quindi ho modificato il MyLibraryService.java

public MyLibrary addBook_Fake(MyLibrary newBook)

throws PortalException, SystemException{

newBook.setId_book(999);
return newBook;
//return MyLibraryLocalServiceUtil.addBook(newBook);
}
public List<MyLibrary> getAllBooks()
throws PortalException, SystemException {
return MyLibraryLocalServiceUtil.getAllBooks();
}
 

7. ho lanciato Liferay -> build-service

8. ho lanciato Liferay -> build-wsdd

9. mi è stato generato un nuovo file all'interno di WEB-INF: server-config.wsdd. Questo file definisce il'end-point da richiamare per ottenere il WSDL da usare nel Client utilizzatore del Web Service.

<service name="Plugin_AV_MyLibraryService" provider="java:RPC"

style="rpc" use="encoded">

...

<parameter name="allowedMethods" value="addBook_Fake getAllBooks" />

...

</service>

10. ho lanciato Liferay -> compile

11. ho lanciato Liferay -> war. Poi ho deployato la portelt AppuntiVariMyLibrary-portlet.war in localhost.

Adesso da browser possiamo visualizzare il WSDL che descrive il Web Service:

http://localhost:8080/AppuntiVariMyLibrary-portlet/api/axis

oppure

http://localhost:8080/AppuntiVariMyLibrary-portlet/api/axis/Plugin_AV_MyLibraryService?wsdl

Testiamo il Web Service su un Client

1. Apriamo un Eclipse classico per progetti Java J2EE

2. Creiamo un progetto vuoto.

3. Click con il destro sul progetto, New -> Others -> Web Service Client -> incolliamo l'URL del WSDL -> click su Finish

4. Nel nostro progetto vuoto vengono creati dei package

  • .model
  • .service.http

5. Adesso creaimo una classe di test per interagire con il Web Service:

public static void main(String[] args) throws RemoteException, ServiceException {
MyLibraryServiceSoapServiceLocator locator = 
          new MyLibraryServiceSoapServiceLocator();
 
MyLibraryServiceSoap service = locator.getPlugin_AV_MyLibraryService();
 
MyLibrarySoap soap = new MyLibrarySoap();
 
System.out.println("Creo Libro tramite DTO SOAP");
 
        soap.setAutori("Francesco2 Soap");
        soap.setDescrizione("descrizione2 Soap");
        soap.setLink_more_info("https://drive.google.com/keep/");
        soap.setNote("nessuna nota soap 2");
        soap.setStato("Letto");
        soap.setTitolo("Prova SOAP 2");
        
        System.out.println("Chiamo il metodo esposto dal Service di MyLibrary");
        MyLibrarySoap soapReturn = service.addBook_Fake(soap);
        System.out.println("Record aggiunto tramite SOAP MyLibrary - id_book: "+soapReturn.getId_book());
 
for (MyLibrarySoap item : service.getAllBooks()) {
        System.out.println(""+item.getTitolo());
}
}
 
Se provo ad eseguire il contenuto di questo Main, mi stampa a Console: 
  • Record aggiunto tramite SOAP MyLibrary - id_book: 999
  • Tutti i Titoli all'interno della tabella MyLibrary del mio database.
In Localhost funziona tutto ma su un vero dominio/host remoto bisogna settare un file di configurazione:

Bisogna modificare il portal-ext.properties oppure il portal-setup-wizard.properties e aggiungere:

  • axis.servlet.hosts.allowed=127.0.0.1,SERVER_IP,CLIENT_IP_1, CLIENT_IP_2
    axis.servlet.https.required=false
Dove SERVER_IP è l'IP del vostro server remoto. E' da inserire solo se qualche portlet del vostro server fa da client verso una portlet service che espone un servizio.
CLIENT_IP_1, CLIENT_IP_2, ecc sono IP di server esterni che usano il servizio che esponete.
 
Per servizio ovviamente intendo l'insieme dei metodi che esponete.
 
Di default, axis.servlet.hosts.allowed=127.0.0.1.
Se volete aprire il servizio ad altri server esterni dovete, in poche parole, aggiungere gli IP di questi server in questo file di configurazione.
 
 
Miglioramenti WebService:

Se volessi ottenere l' UserId Liferay di chi si autentica e quindi di chi richiama il metodo esposto?

System.out.println("remote userId = "+PrincipalThreadLocal.getUserId());

Average (1 Vote)
The average rating is 5.0 stars out of 5.