Aquest how-to va dirigit a tots aquells desenvolupadors que vulguin desplegar una aplicació Canigó 3.2 en un servidor d’aplicacions IBM Websphere 8.5.5
Canigó 3.2 incorpora JPA 2.1 i Hibernate 5.0 com a proveïdor. IBM Wesphere 8.5.5 només dóna suport a JPA 2.0 incloent com a proveïdor OpenJPA 2.4. Degut a aquesta incompatibilitat, s’han de realitzar certes modificacions a les aplicacions Canigó per a poder ser desplegades a WebSphere 8.5.5.
En aquest HowTo es parteix de l’aplicació plantilla de Canigó que genera el plugin d’Eclipse.
S’ha de realitzar l’exclusió al mòdul de Spring Boot de spring-boot-starter-tomcat:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
S’ha de realitzar l’exclusió de la llibreria xml-apis del mòdul spring-boot-starter-data-jpa:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
<exclusion>
<artifactId>xml-apis</artifactId>
<groupId>xml-apis</groupId>
</exclusion>
</exclusions>
</dependency>
Per aconseguir que la nostra aplicació resolgui com a proveïdor de JPA HibernatePersistenceProvider, i no OpenJPA, hem d’implementar la nostra pròpia classe PersistenceProviderResolver. Un cop implementada, hem de fer que la nostra aplicació l’utilitzi registrant-la abans de realitzar la inicialització del mòdul de persistència.
Per fer això hem creat el paquet “cat.gencat.provawebsphere.websphere” a l’aplicació i creat el fitxer HibernatePersistenceProviderResolver.java amb el següent codi:
package cat.gencat.provawebsphere.websphere;
import org.hibernate.jpa.HibernatePersistenceProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.persistence.spi.PersistenceProvider;
import javax.persistence.spi.PersistenceProviderResolver;
import javax.persistence.spi.PersistenceProviderResolverHolder;
import java.util.Collections;
import java.util.List;
public class HibernatePersistenceProviderResolver implements PersistenceProviderResolver {
/** Logger */
private static final Logger logger = LoggerFactory.getLogger(HibernatePersistenceProviderResolver.class);
private volatile PersistenceProvider persistenceProvider = new HibernatePersistenceProvider();
@Override
public List<PersistenceProvider> getPersistenceProviders() {
return Collections.singletonList(persistenceProvider);
}
@Override
public void clearCachedProviders() {
persistenceProvider = new HibernatePersistenceProvider();
}
public static void register() {
logger.debug("Registering HibernatePersistenceProviderResolver");
PersistenceProviderResolverHolder.setPersistenceProviderResolver(new HibernatePersistenceProviderResolver());
}
}
Per assegurar que registrem el nostre proveïdor de JPA a l’inici de l’aplicació, abans de la creació de qualsevol altre bean de Spring, creem la classe PreInitializer amb el següent codi:
package cat.gencat.provawebsphere.websphere;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.core.Ordered;
import org.springframework.core.PriorityOrdered;
public class PreInitializer implements BeanFactoryPostProcessor, PriorityOrdered {
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
@Override
public void postProcessBeanFactory(
ConfigurableListableBeanFactory beanFactory) throws BeansException {
HibernatePersistenceProviderResolver.register();
}
}
Al fitxer “Application.java” hem de crear el bean per la classe PreInitializer per a que es faci el registre:
@Bean
public PreInitializer preInitializer() {
return new PreInitializer();
}
Al fitxer de persistència hem de definir totes les entitats que tingui l’aplicació. En la plantilla que utilitza aquest HowTo només hi ha l’entitat Equipament:
<persistence-unit name="canigo" transaction-type="RESOURCE_LOCAL">
<class>cat.gencat.provawebsphere3.model.Equipament</class>
</persistence-unit>
Una vegada configurada la nostra aplicació a la consola web d’administració de WebSphere, abans d’iniciar-la, seleccionar la nostra aplicació, anar a “Cargador de clases” i seleccionar els següents valors:
Clases cargadas con el cargador local primero (padre último)
Cargador de clases único para la aplicación
Seguint aquestes instruccions l’aplicació plantilla de Canigó 3.2 haurà estat desplegada de forma satisfactòria a WebSphere 8.5.5.