SPRING 3.0.0.M3 ON GOOGLE APPENGINE WITH JPA (zt)
来源:互联网 发布:php数组函数 编辑:程序博客网 时间:2024/05/11 20:43
source: http://www.eisele.net/blog/2009/07/spring-300m3-on-google-appengine-with.html
I am working on a private project these days. It should give myfear.com and myfear.de a new meaning. Therefore I am trying out Google's Appengine.
Beeing forced to more or less full blown JEE5 in my dayly work, I wanted to try out something new. Having worked with older Spring versions some time ago, I feelt it was time to give this another shot. And so I ended up, trying Spring's newest milestone release on the GAE.
At the end of the day, I solved many problems on the road and everything worked fine. Here is a brief summary of what I had to change/find out:
1) GAE does not support full blown JEE. Therefore you have to be very sensible for using the right combination of technologies. If you try to use spring completely you will fail. The following list of jar files did the job for me:
antlr-3.0.1.jar
aopalliance-1.0.jar
asm-2.1.jar
asm-commons-2.1.jar
commons-beanutils-1.7.0.jar
commons-collections-3.1.jar
commons-lang.jar
commons-logging.jar
org.springframework.aop-3.0.0.M3.jar
org.springframework.asm-3.0.0.M3.jar
org.springframework.aspects-3.0.0.M3.jar
org.springframework.beans-3.0.0.M3.jar
org.springframework.context-3.0.0.M3.jar
org.springframework.core-3.0.0.M3.jar
org.springframework.expression-3.0.0.M3.jar
org.springframework.jdbc-3.0.0.M3.jar
org.springframework.orm-3.0.0.M3.jar
org.springframework.transaction-3.0.0.M3.jar
org.springframework.web-3.0.0.M3.jar
org.springframework.web.servlet-3.0.0.M3.jar
2) Setting up the persistance.xml is straight forward but remember to rename the persistance-unit in jdoconfig.xml. Both should have different names!
<persistence-unit name="transactions-optional">
<provider>org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider</provider>
<properties>
<property name="datanucleus.NontransactionalRead" value="true" />
<property name="datanucleus.NontransactionalWrite" value="true" />
<property name="datanucleus.ConnectionURL" value="appengine" />
</properties>
</persistence-unit>
3) Defining the entity manager in dispatcher-servlet.xml
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"
lazy-init="true">
<property name="persistenceUnitName" value="transactions-optional" />
</bean>
<bean name="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
Don't forget to add the following two, if you want to use JPA @Annotations in your Entities and Spring @Annotations in your DAOs and Services.
<tx:annotation-driven />
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
4) Injecting the EntityManager in your @Repository Daos:
5) If you try to use the injected entityManager without any transaction, then you would most likely get an NucleusUserException: Object Manager has been closed. You can prevent this, using @Service and @Transactional in your service layer.
6)Nearly the same could happen, if you do not call queryResult.size() on your query.getResultList(). The error was reported several times. There seems to exist only this "workaround".
7) Using EL Expressions in your JSP forces you to use a little addon to the jsp page definition:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false" %>
8) If you would like to use the <fmt:formatDate jstl tags, you have to enable session management in your appengine-web.xml. <sessions-enabled>true</sessions-enabled>
9) I came across several problems using a JRE with eclipse and GAE local server. You should always use a JDK!
All for now ... more to come :)
At the end of the day, I solved many problems on the road and everything worked fine. Here is a brief summary of what I had to change/find out:
1) GAE does not support full blown JEE. Therefore you have to be very sensible for using the right combination of technologies. If you try to use spring completely you will fail. The following list of jar files did the job for me:
antlr-3.0.1.jar
aopalliance-1.0.jar
asm-2.1.jar
asm-commons-2.1.jar
commons-beanutils-1.7.0.jar
commons-collections-3.1.jar
commons-lang.jar
commons-logging.jar
org.springframework.aop-3.0.0.M3.jar
org.springframework.asm-3.0.0.M3.jar
org.springframework.aspects-3.0.0.M3.jar
org.springframework.beans-3.0.0.M3.jar
org.springframework.context-3.0.0.M3.jar
org.springframework.core-3.0.0.M3.jar
org.springframework.expression-3.0.0.M3.jar
org.springframework.jdbc-3.0.0.M3.jar
org.springframework.orm-3.0.0.M3.jar
org.springframework.transaction-3.0.0.M3.jar
org.springframework.web-3.0.0.M3.jar
org.springframework.web.servlet-3.0.0.M3.jar
2) Setting up the persistance.xml is straight forward but remember to rename the persistance-unit in jdoconfig.xml. Both should have different names!
<persistence-unit name="transactions-optional">
<provider>org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider</provider>
<properties>
<property name="datanucleus.NontransactionalRead" value="true" />
<property name="datanucleus.NontransactionalWrite" value="true" />
<property name="datanucleus.ConnectionURL" value="appengine" />
</properties>
</persistence-unit>
3) Defining the entity manager in dispatcher-servlet.xml
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"
lazy-init="true">
<property name="persistenceUnitName" value="transactions-optional" />
</bean>
<bean name="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
Don't forget to add the following two, if you want to use JPA @Annotations in your Entities and Spring @Annotations in your DAOs and Services.
<tx:annotation-driven />
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
4) Injecting the EntityManager in your @Repository Daos:
private EntityManager entityManager;
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
5) If you try to use the injected entityManager without any transaction, then you would most likely get an NucleusUserException: Object Manager has been closed. You can prevent this, using @Service and @Transactional in your service layer.
6)Nearly the same could happen, if you do not call queryResult.size() on your query.getResultList(). The error was reported several times. There seems to exist only this "workaround".
7) Using EL Expressions in your JSP forces you to use a little addon to the jsp page definition:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false" %>
8) If you would like to use the <fmt:formatDate jstl tags, you have to enable session management in your appengine-web.xml. <sessions-enabled>true</sessions-enabled>
9) I came across several problems using a JRE with eclipse and GAE local server. You should always use a JDK!
All for now ... more to come :)
- SPRING 3.0.0.M3 ON GOOGLE APPENGINE WITH JPA (zt)
- 使用JPA+Struts2+Spring 在 google Appengine开发应用
- 使用JPA+Struts2+Spring 在 google Appengine开发应用
- cache control on appengine
- google appengine中的计数器
- Google AppEngine收费方案
- Google AppEngine 简单学习
- Using Django with Appengine
- samhoo on appengine vol.1
- Google AppEngine的简单学习
- Testing JPA with JUnit, Spring and Maven
- Spring boot JPA column with incorrect underscore
- appengine
- google appengine的数据存储API
- 在GAE(google appengine)中应用sitemesh
- Google Appengine开发碰到DatastoreNeedIndexException了
- Google Appengine 使用JSTL的问题
- Google AppEngine 和 NetBeans ... 和 Mojarra / JSF
- 比较函数、方法、过程
- oper tools 0.9 更新
- 网络上收集的Visual Studio 2008的一些小技巧
- 我好像丢失了周目标、计划
- ASP.NET的五大数据控件浅谈
- SPRING 3.0.0.M3 ON GOOGLE APPENGINE WITH JPA (zt)
- phoenix(BIOS) NVRM 的数据结构 bios(逆向工程)
- 软件工厂
- 十二星座
- JIVE2.1.1 安装
- 手机流媒体服务器架设指南
- JMS
- mysql 的乱码解决方法
- 知识 =?智慧