GAE requiert une configuration bien précise, voir spécifique, de l'application web destinée à être déployée sur ces serveurs. Je vais essayer de détailler ci-dessous les éléments que j'ai rencontré.
Descripteur de déploiement
En plus du fichier web.xml
commun à toutes les applis web, GAE demande la mise en place d'un nouveau fichier de description spécifique, appengine-web.xml
présenté dans ce chapitre de la documentation.
Validation des fichiers XML
Le serveur de test peut parfois poser des problèmes lors de la phase de validation Spring des fichiers XML. Pour la désactiver, il faut indiquer dans le fichier web.xml
une classe spécifique de configuration :
<context-param>
<param-name>contextClass</param-name>
<param-value>my.package.MyXmlWebApplicationContext</param-value>
</context-param>
Pour ce besoin, son contenu est assez simple :
import com.google.appengine.api.utils.SystemProperty;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.web.context.support.XmlWebApplicationContext;
public class MyXmlWebApplicationContext extends XmlWebApplicationContext {
@Override
protected void initBeanDefinitionReader(XmlBeanDefinitionReader beanDefinitionReader) {
super.initBeanDefinitionReader(beanDefinitionReader);
if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Development) {
beanDefinitionReader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_NONE);
}
}
}
persistence.xml
Afin de lier notre application au datastore de Google, voici un exemple basique de fichier de persistence :
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="transactions-optional">
<provider>org.datanucleus.api.jpa.PersistenceProviderImpl</provider>
<properties>
<property name="datanucleus.NontransactionalRead" value="true"/>
<property name="datanucleus.NontransactionalWrite" value="true"/>
<property name="datanucleus.ConnectionURL" value="appengine"/>
</properties>
</persistence-unit>
</persistence>
Déclaration du bean "entityManagerFactory" via Spring
Afin de rendre effective la connexion au datastore, il est nécessaire d'ajouter au fichier application-context.xml
de Spring :
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="entityManagerFactory" class="com.my.MyEntityManagerFactory"/>
</beans>
Voici le contenu de la classe indiquée :
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceException;
import org.springframework.orm.jpa.LocalEntityManagerFactoryBean;
public class MyEntityManagerFactory extends LocalEntityManagerFactoryBean {
@Override
protected EntityManagerFactory createNativeEntityManagerFactory() throws PersistenceException {
return EMF.get();
}
}
La classe EMF
est tirée des préconisations Google (https://developers.google.com/appengine/docs/java/datastore/jpa/overview?hl=fr) :
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public final class EMF {
private static final EntityManagerFactory emfInstance =
Persistence.createEntityManagerFactory("transactions-optional");
private static EntityManager entityManager = emfInstance.createEntityManager();
private EMF() {}
public static EntityManagerFactory get() {
return emfInstance;
}
public static EntityManager getEntityManager() {
return entityManager;
}
}
Avec ces éléments, vous devriez pourvoir démarrer votre application rapidement.
0 commentaires:
Enregistrer un commentaire