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 REST 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

@JSONWebService(mode = JSONWebServiceMode.MANUAL)

 

public class MyLibraryServiceImpl extends MyLibraryServiceBaseImpl {
 
@JSONWebService(mode = JSONWebServiceMode.IGNORE)

public MyLibrary addBook_Fake(MyLibrary newBook)

throws PortalException, SystemException{

newBook.setId_book(999);
return newBook;
//return MyLibraryLocalServiceUtil.addBook(newBook);
}
 
@JSONWebService(value = "get-mybooks-rest", method = "GET")
public List<MyLibrary> getAllBooks()
throws PortalException, SystemException {
return MyLibraryLocalServiceUtil.getAllBooks();
}
 
}
Tramite REST espongo SOLO il secondo metodo: getAllBooks() in GET.
 
7. ho aggiunto gli end-point nel web.xml
 
     <servlet>
        <servlet-name>JSON Web Service Servlet</servlet-name>
        <servlet-class>com.liferay.portal.kernel.servlet.PortalClassLoaderServlet</servlet-class>
        <init-param>
            <param-name>servlet-class</param-name>
            <param-value>com.liferay.portal.jsonwebservice.JSONWebServiceServlet</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>JSON Web Service Servlet</servlet-name>
        <url-pattern>/api/jsonws/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>JSON Web Service Servlet</servlet-name>
        <url-pattern>/api/secure/jsonws/*</url-pattern>
    </servlet-mapping>
 

8. ho lanciato Liferay -> build-service

9. ho lanciato Liferay -> compile

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

Adesso da browser possiamo visualizzare i metodi esposti e esempi su come chiamarli:

http://localhost:8080/AppuntiVariMyLibrary-portlet/api/secure/jsonws

bisogna autenticarsi con un utente registrato sul portale Liferay del WebService. Es: test

Testiamo il Web Service su un Client

1. Apriamo un Eclipse classico per progetti Java J2EE

2. Creiamo un progetto vuoto.

3. Includiamo i JAR per la creazione di un REST Client:

  • java-json.jar
  • jersey-client-1.8.jar
  • jersey-common-2.1.jar
  • jersey-core-1.8.jar

4. Scriviamo il metodo Main per testare il Web Service:

public static void main(String[] args) {
 
        System.out.println("Chiamo il metodo esposto dal Service di MyLibrary");
        
        try {
            Client client = Client.create();
            
            client.addFilter(new HTTPBasicAuthFilter("test@liferay.com", "test1"));
            String baseURL = "http://localhost:8080/AppuntiVariMyLibrary-portlet/api/secure/jsonws";
              // l'url è formato dal nome della <entity> e il nome del metodo esposto
            String url="/mylibrary/get-mybooks-rest";
            
            WebResource webResource = client.resource(baseURL + url);
            ClientResponse clientResponse = webResource.accept("application/json").get(ClientResponse.class);
 
            if (clientResponse.getStatus() != 200) {
            System.out.println("Failed...... HTTP Error Code :" + clientResponse.getStatus());
            }
 
            String output = clientResponse.getEntity(String.class);
 
            System.out.println("Output for Server :");
            System.out.println(""+output);
            
            
            System.out.println("\nLeggo il JSON:");
            JSONArray elencoJson = new JSONArray(output);     
            
            for (int i=0; i<elencoJson.length(); i++) {
 
    JSONObject item = elencoJson.getJSONObject(i);
   
    String autori = item.getString("autori");
    String descrizione = item.getString("descrizione");
    int id_book = item.getInt("id_book");
    String link_more_info = item.getString("link_more_info");
    String note = item.getString("note");
    String stato = item.getString("stato");
    String titolo = item.getString("titolo");
   
    System.out.println("titolo: "+titolo+" stato:"+stato);
    }
 
        } catch (Exception e) {
        System.out.println(e.getMessage());
        }
 
}
 
Se provo ad eseguire il contenuto di questo Main, mi stampa a Console: 
  • Tutti i Titoli all'interno della tabella MyLibrary del mio database.
File di configurazione da settare:

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

  • json.web.service.enabled=true

se si volesse evitare l'autenticazione (NO p_auth) e quindi lasciare aperto il WebService a chiunque bisogna aggiungere anche questa proprietà:

  • auth.token.check.enabled=false

 

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());

 

Miglioramenti Client

Se volessi passare dei parametri ad un metodo che ne dà la possibilità?

MultivaluedMap formData = new MultivaluedMapImpl();

formData = new MultivaluedMapImpl();
formData.add("par1", "value1");
formData.add("par2", "value2");
....
ClientResponse clientResponse = webResource.accept("application/json").post(ClientResponse.class, formData);
Average (1 Vote)
The average rating is 5.0 stars out of 5.