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
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());
}
}
- Record aggiunto tramite SOAP MyLibrary - id_book: 999
- Tutti i Titoli all'interno della tabella MyLibrary del mio database.
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());