seamSpace是Seam自带的一个演示Seam的安全模块的一个demo,里面用到了好多安全相关的操作,由于项目框架选择的原因,想把Seam和Geronimo、OpenJpa集成起来。下面就来看看集成他们的具体步骤。
1.JBoss到Geronimo的移植。
①JNDI的变更:使用JBoss服务器时,有很多默认的配置,但Geronimo和JBoss的默认的JNDI配置是不一样的,工程中的EJB BEAN、数据源以及Seam本身的一些组件,都需要显式定义它们的JNDI。
②去除JBoss的一些专用配置,并添加Geronimo的一些专用配置
③数据源定义配置移到persistent.xml文件中
2.Hibernate到OpenJpa
①修改persistent.xml中的persistent provider为OpenJpa
②在component.xml中添加org.jboss.seam.persistence.persistenceProvider的定义,默认是Hibernate,需要新建一个OpenJpaPersistenceProvider,如下
public class OpenJpaPersistenceProvider extends PersistenceProvider {
Log log = Logging.getLog(OpenJpaPersistenceProvider.class);
@Override
public void setFlushModeManual(EntityManager entityManager) {
// see also https://jira.jboss.org/jira/browse/JBSEAM-3030
log.warn("setFlushModeManual is not supported by OpenJPA");
}
}
3.seamSpace的移植
①修改seam使用的JNDI
<core:init debug="true" jndi-pattern="java:comp/env/#{ejbName}Local"/>
②规范化seam安全框架里的JPQL语句,以及seamSpace里的JPQL语句
③修改所有的使用:member作为命名参数的地方,把member改为其他字符,member是Openjpa的一个关键字。
④对通过entityManager查询List结果需进行操作的,需把list拷贝一个出来再做操作,OpenJpa不让对他查询出的结果进行类似remove、sort的操作,不过这样可能导致list下的某些对象不能加载
public List<String> listRoles()
{
return new
java.util.LinkedList( lookupEntityManager().createQuery(
"select r." + roleNameProperty.getName() + " from " + roleClass.getName() + " r").getResultList());
}
⑤ drl里相关的实体对象的加载方式修改为fetch = FetchType.EAGER
4.总结
总体上移植的还比较顺利,可能SEAM与Hibernate耦合的比较深,Seam需要它的一些jar包,另外就是OpenJpa现在还很不成熟,好多地方会莫名的出点错,版本间的差别也比较大。这个还需大家多多测测。