bloggers bloggers

Marco Napolitano
Messaggi: 79
Stelle: 0
Data: 17/02/22
Jader Jed Francia
Messaggi: 63
Stelle: 0
Data: 18/02/21
Paolo Gambetti
Messaggi: 2
Stelle: 0
Data: 11/11/19
Katia Pazzi
Messaggi: 1
Stelle: 0
Data: 27/06/19
Ezio Lombardi
Messaggi: 11
Stelle: 0
Data: 10/04/18
Chiara Mambretti
Messaggi: 25
Stelle: 0
Data: 27/02/17
Serena Traversi
Messaggi: 3
Stelle: 0
Data: 21/07/16
Francesco Falanga
Messaggi: 8
Stelle: 0
Data: 14/06/16
Antonio Musarra
Messaggi: 2
Stelle: 0
Data: 18/11/13
Simone Celli Marchi
Messaggi: 6
Stelle: 0
Data: 09/07/13
Indietro

Collegarsi a datasource esterni con Liferay 7.2+

Qualche anno fa avevo affrontato lo stesso tema relativamente alla neonata versione 7.0; per chi se lo fosse perso vi ripropongo il link: https://blog.d-vel.com/home/-/blogs/collegarsi-a-datasource-esterni-con-liferay-dxp.

Con la versione 7.1 ci fu un piccolissimo cambiamento (che potete trovare nei commenti del vecchio articolo) ma con l'avvento della versione 7.2 (e successive) tutto è cambiato! Di nuovo...

Vediamo quindi come fare per configurare adeguatamente la connessione ad un database esterno con Liferay 7.2+ (metto il + perché sono ottimista e spero di non dover scrivere un altro articolo tra qualche anno).

Resta però un punto fermo per tutte le versioni di Liferay 7+: tutte le entità definite all'interno del medesimo service.xml si collegano al medesimo datasource pertanto, per ogni datasource esterno a cui collegarsi, andrà definito uno specifico plugin di tipo Service Builder. Ma in fondo questa cosa rende il codice molto più modulare e manutenibile.

La prima modifica da fare è quella di specificare per tutte le entità del service.xml l'attributo data-source andando ad inserire un qualsiasi valore fittizio, ad esempio:

<entity data-source="extDataSource" name="Foo">
    [...]
</entity>

Ovviamente, se necessario, andate a specificare anche gli attributi table e column (che mi aspetto sappiate cosa sono ed a cosa servono).

Cosa scrivete nell'attributo data-source non ha molta importanza perché non viene usato da nessuna parte, serve solamente per comunicare a Liferay (ed al Service Builder) che non bisogna usare la connessione di default del portale.

Dopodiché andiamo a definire nel portal-ext.properties i parametri di connessione al database esterno:

jdbc.ext.driverClassName=<DRIVER_CLASS_NAME>
jdbc.ext.url=<CONNECTION_URL>
jdbc.ext.username=<USERNAME>
jdbc.ext.password=<PASSWORD>
jdbc.ext.connectionTestQuery=<CONNECTION_TEST_QUERY> (se serve)

La cosa importante da ricordare è quella di utilizzare un prefisso univoco per ciascuna connessione esterna (nel caso ne aveste più di una); nel nostro caso il prefisso che abbiamo utilizzato è jdbc.ext.

Bene, fino a questo punto le modifiche da fare sono esattamente uguali a quanto si faceva nelle versioni precedenti di Liferay. Quello che è cambiato arriva adesso!

Infatti a partire dalla versione 7.2 è necessario implementare un'apposita classe di tipo DataSourceProvider per comunicare a Liferay quale connessione esterna utilizzare; questa classe andrà implementata indipendentemente dal fatto che il vostro service.xml abbia impostato ds o spring come meccanismo di injection.

Non vi sto ad annoiare con la teoria perché probabilmente avrete già perso un sacco di tempo a cercare su Google, quindi mi limito a mostrarvi il codice della classe da implementare:

package it.dvel.liferay.service.persistence.impl.constants;

import com.liferay.portal.kernel.dao.jdbc.DataSourceFactoryUtil;
import com.liferay.portal.kernel.dao.jdbc.DataSourceProvider;
import com.liferay.portal.kernel.util.PropsUtil;

import javax.sql.DataSource;

public class DataSourceProviderImpl implements DataSourceProvider {

    @Override
    public DataSource getDataSource() {

        try {
            return DataSourceFactoryUtil.initDataSource(
                PropsUtil.getProperties("jdbc.ext.", true));
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

Come vedete la classe non fa altro che restituire le property di connessione contraddistinte dal prefisso che avete scelto sopra (ossia jdbc.ext.); mi raccomando fate attenzione ad inserire anche il punto finale!

Questa classe va messa nel plugin -service in un package qualunque; di solito uso il  package .service.persistence.impl.constants perché esiste già e sono pigro. smiley

A questo punto manca l'ultimo passaggio!

Sempre nel plugin -service create un file di testo nella cartella src/main/resources/META-INF/services e chiamatelo esattamente com.liferay.portal.kernel.dao.jdbc.DataSourceProvider ossia come l'interfaccia che avete implementato nella classe vista sopra.

Il contenuto di questo file di testo sarà un'unica riga costituita dal nome completo di package della classe che avete implementato, ossia:

it.dvel.liferay.service.persistence.impl.constants.DataSourceProviderImpl

Ora salvate tutti i file, lanciate il task build-service del Service Builde ed una volta terminato deployate i plugin.

Se avete seguito tutte le istruzioni alla lettera, vedrete nei log di Tomcat il messaggio relativo alla connessione al database esterno.

Enjoy!

Successivo
Commenti
Nessun commento. Vuoi essere il primo.