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