首页 > 代码库 > JBoss Seam 2.3.1新功能

JBoss Seam 2.3.1新功能

jboss seam reference 2.3(第4章)

 

 

jboss seam reference 2.3 Final   

24.09.2012

 

 

第四章 从2.2迁移到2.3

 

在你开始Seam 2.3以前,有一些事情你应该注意。这个过程应该不是太痛苦——如果被卡住了,只是回来参考在Seam分发版中的更新Seam例子即可。

 

这个迁移指南假设你正在使用Seam2.2,如果你正从Seam 1.2 或 2.0迁移,请看jboss-seam-x.y.z.Final/seam2migration.txt 以及jboss-seam-x.y.z.Final/seam21migration.txt。

 

4.1  XML架构(Schemas)迁移 

 

4.1.1 Seam架构迁移

 

使用Seam 2.2 XSDs的验证文件的XML架构应该被升级为引用2.3 XSDs,注意版本更改。当前的命名空间模式是 www.jboss.org/schema/seam/*,而schemaLocation URL 被改成了 www.jboss.org/schema/seam/*_-2.3.xsd, *处是Seam模块。

 

下面是2.2版本的一个组件声明例子的片断:

 

例子4.1 在Seam components.xml的迁移之前

 

<?xml version="1.0" encoding="UTF-8"?>

   <components xmlns="http://jboss.com/products/seam/components"

            xmlns:core="http://jboss.com/products/seam/core"

            xmlns:persistence="http://jboss.com/products/seam/persistence"

            xmlns:security="http://jboss.com/products/seam/security"

            xmlns:theme="http://jboss.com/products/seam/theme"

            xmlns:cache="http://jboss.com/products/seam/cache"

            xmlns:web="http://jboss.com/products/seam/web"

            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

            xsi:schemaLocation=

                    "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.2.xsd

                 http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.2.xsd

                 http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.2.xsd

                 http://jboss.com/products/seam/theme http://jboss.com/products/seam/theme-2.2.xsd

                 http://jboss.com/products/seam/cache http://jboss.com/products/seam/cache-2.2.xsd

                 http://jboss.com/products/seam/web http://jboss.com/products/seam/web-2.2.xsd

                 http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.2.xsd">

 

最终,2.3版的components.xml迁移声明:

 

例子4.2 被迁移的components.xml

 

<?xml version="1.0" encoding="UTF-8"?>

      <components xmlns="http://jboss.org/schema/seam/components"

                  xmlns:core="http://jboss.org/schema/seam/core"

                  xmlns:persistence="http://jboss.org/schema/seam/persistence"

                  xmlns:security="http://jboss.org/schema/seam/security"

                  xmlns:theme="http://jboss.org/schema/seam/theme"

                  xmlns:cache="http://jboss.org/schema/seam/cache"

                  xmlns:web="http://jboss.org/schema/seam/web"

                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

                  xsi:schemaLocation=

                          "http://jboss.org/schema/seam/core http://jboss.org/schema/seam/core-2.3.xsd

                       http://jboss.org/schema/seam/persistence http://jboss.org/schema/seam/persistence-2.3.xsd

                       http://jboss.org/schema/seam/security http://jboss.org/schema/seam/security-2.3.xsd

                       http://jboss.org/schema/seam/theme http://jboss.org/schema/seam/theme-2.3.xsd

                       http://jboss.org/schema/seam/cache http://jboss.org/schema/seam/cache-2.3.xsd

                       http://jboss.org/schema/seam/web http://jboss.org/schema/seam/web-2.3.xsd

                       http://jboss.org/schema/seam/components http://jboss.org/schema/seam/components-2.3.xsd">

 

接下来剩下的迁移步骤是pages.xml文件,以及仅需要架构被升级的的其他文件。

 

例子4.3 在Seam pages.xml的迁移之前

 

<?xml version="1.0" encoding="UTF-8"?>

<pages xmlns="http://jboss.com/products/seam/pages"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.2.xsd">

       ...

</pages>

 

例子4.3 在Seam pages.xml的迁移之后

 

<?xml version="1.0" encoding="UTF-8"?>

<pages xmlns="http://jboss.org/schema/seam/pages"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://jboss.org/schema/seam/pages http://jboss.org/schema/seam/pages-2.3.xsd">

       ...

</pages>

 

4.1.2.  Java EE 6架构变化

 

Seam2.3升级还包括Java EE 6升级,所以你需要升级下面的描述符:

 

l 为使用JPA 2的persistence.xml 

l为使用Servlet 3.0和网页应用程序的web.xml

l为使用企业Java 6应用程序的application.xml

lfaces-config.xml,如果你需要为JSF2指定某些高级配置(这个描述符文件并不是强制的,你不必使用/包括它在你的应用程序中)

 

用正确的版本改变了头部的例子如下所示:

 

例子4.5  persistence.xml 

 

<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_2_0.xsd" 

       version="2.0">

 

例子4.6  application.xml 

 

<application xmlns="http://java.sun.com/xml/ns/javaee" 

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd"

       version="6">

 

例子4.7  web.xml 

 

<web-app xmlns="http://java.sun.com/xml/ns/javaee"

            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

            version="3.0">

 

例子4.7  faces-config.xml 

 

<?xml version="1.0" encoding="UTF-8"?>

   <faces-config version="2.1"

                 xmlns="http://java.sun.com/xml/ns/javaee"

                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

                 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd">

 

 

4.2.  Java EE 6升级

 

Seam 2.3能够集成在Java EE (从5到6)中的主要升级。你可以使用JPA 2持久化、EJB 3.1和Bean Validation。几乎所有EE 6技术升级需要改变XML架构声明。请看章节 4.1.2, “Java EE 6架构变化”。

 

4.2.1. 使用Bean Validation标准,而不是Hibernate Validator

 

Bean Validation是包含在Java EE 6中作为新技术的一个标准。Seam已经为验证使用了一个参考实现Hibernate Validator。

 

你需要把使用org.hibernate.validator.*的Hibernate validator注释迁移为javax.validation.constraint.* 对等物。例如Seam例子使用了许多下面的注释,而你可以使用这个列表作为一个帮助器(使用 Bean Validation):

 

org.hibernate.validator.Length 改为 javax.validation.constraint.Size,

org.hibernate.validator.NotNull 改为 javax.validation.constraint.NotNull,

org.hibernate.validator.Pattern 改为 javax.validation.constraint.Pattern.

 

4.2.2.  JSF 1到JSF 2 Facelets模板的迁移

 

配置文件faces-config.xml并不需要是在你的应用程序中,所以对于简单地使用JSF2,你只需迁移web.xml。如果你无论如何想使用它,改变XML架构声明,如在例子  4.8,“faces-config.xml”中所述一样。

 

所有你的应用程序的JSF模板应该只使用facelets技术,因为JSP是过时了。

 

在facelet模板中,要求分别转换 <head>/<body>标签为<h:head>/<h:body>。

 

根据你使用的JSF组件,如Richfaces或Icefaces,在升级JSF 1.x 到JSF 2.x时,必定有某些差异。你可能需要升级整个库。有关这些变化,请参考任何组件框架的文档。本迁移并不包含这些迁移的步骤。

 

4.2.3. 迁移到JPA 2.0

 

使用JPA 2需要在 persistence.xml中改变版本为2.0,请看例子4.5,“persistence.xml”文件,并且如果你使用EAR,在 application.xml中的版本应该为6——请看例子 4.6,“, “application.xml”,或者,如果你只使用 WAR,在web.xml文件中的版本改为3.0——请看例子4.7,“web.xml”。

 

对开发人员重要的是,大多数应用程序可能只使用带有EJB3.1的WAR,所以不必打包应用程序员为EAR。

 

JPA 2.0 是向后兼容JPA 1.0,所以你不必迁移任何JPA注释或类。JPA 2.0是更像增强版的JPA 1.0。

 

4.2.4.  为资源使用兼容的JNDI

 

Java EE 6为创建可移植JNDI语法带来了新标准化的全局规则。所以,你必须改变所有JNDI 字符串,从_your_application_/#{ejbName}/local改为 java:app/_application-module-name_/#{ejbName},就如在WEB-INF/components.xml中jndiPattern变化的例子,把:

 

seam-mail/#{ejbName}/local

改为

java:app/seam-mail-ejb/#{ejbName}

 

4.3.  JBoss AS 7.1部署

 

4.3.1. 部署变化

 

下一级是你的目标运行时(runtime)的迁移。Seam 2.3使用JBoss AS 7作为默认目标运行时。

 

如果你正在JBoss AS 7.1中开发或测试默认数据源,你需要在你的persistence.xml中改变数据源,从java:/DefaultDS 和java:jboss/datasources/ExampleDS。

 

JBoss AS 7有一个重构的类加载模型。绑定的类加载或提供的库可以在jboss-deployment-structure.xml 或在 META-INF/MANIFEST.MF 文件中的Dependencies部分中被管理。本迁移文档更喜欢使用jboss-deployment-structure.xml文件,根据你的应用程序类型,它被放在你的WAR或 EAR应用程序的 META-INF目录中。

 

对于完整EAR项目, jboss-deployment-structure.xml将会被放在 _your_ear_/META-INF目录中。

 

对于Web(非ear)项目,jboss-deployment-structure.xml 将会被放在_your_war_/WEB-INF目录中。

 

基于Seam 2.3的应用程序的最小内容是:

 

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">

     <deployment>

         <dependencies>

            <module name="org.dom4j" export="true"/>

            <module name="org.apache.commons.collections" export="true"/>

             <module name="javax.faces.api" export="true"/> <!-- keep there only if you use JSF as view technology -->

           </dependencies>

     </deployment>  

   </jboss-deployment-structure>

 

详情请看JBoss AS 7文档。

 

4.3.2.  数据源迁移

 

你现在还可以包括任何数据源描述符(*-ds.xml)到你的项目的META-INF目录中,并且当部署到一个JBoss AS 7.1应用程序服务器时,该数据源将会被自动部署。虽然文件结构已经被改变。以前数据源文件是一个基于xml的文件,但是现在是一个基于IronJacamar的文件。 Iron-Jacamar是JBoss的 JCA (Java Connector Architecture)项目。下面的例子 4.9,“简单的Seam 2.2数据源描述符文件”是用于JBoss AS 4/5的旧数据源,而例子 4.10,“Ironjacamar数据源描述符文件”显示使用相同驱动、URL和证书转换到IronJacamar。

 

例子 4.9,“简单的Seam 2.2数据源描述符文件”

 

<?xml version="1.0" encoding="UTF-8"?>

      <!DOCTYPE datasources

              PUBLIC "-//JBoss//DTD JBOSS JCA Config 1.5//EN"

              "http://www.jboss.org/j2ee/dtd/jboss-ds_1_5.dtd">

      <datasources>

         <local-tx-datasource>

            <jndi-name>seamdiscsDatasource</jndi-name>

            <connection-url>jdbc:hsqldb:.</connection-url>

            <driver-class>org.hsqldb.jdbcDriver</driver-class>

            <user-name>sa</user-name>

            <password></password>

         </local-tx-datasource>

      </datasources>

 

例子 4.10,“Ironjacamar数据源描述符文件”

 

<?xml version="1.0" encoding="UTF-8"?>

      <datasources xmlns="http://www.jboss.org/ironjacamar/schema">

          <datasource

              jndi-name="java:/jboss/seamdiscsDatasource"

              enabled="true"

              use-java-context="true" pool-name="seamdiscs">

              <connection-url>jdbc:hsqldb:.</connection-url>

              <driver>org.hsqldb.jdbcDriver</driver>

              <security>

                  <user-name>sa</user-name>

                  <password></password>

              </security>

          </datasource>

      </datasources>

 

4.4.  在测试框架中的变化

 

SeamTest和JBoss Embedded是遗留组件,并且有许多限制,我们不再像Seam 2.2中那样支持它了。

 

我们带来Arquillian作为JBoss Embedded的替代,你应该继承extendorg.jboss.seam.mock.JUnitSeamTest,而不是org.jboss.seam.mock.SeamTest,DBUnit 测试由org.jboss.seam.mock.DBJUnitSeamTest提供,而不是 org.jboss.seam.mock.DBUnitSeamTest。 由于TestNG框架和Arquillian的断言问题,我们使用JUnit作为首选测试框架。迁移到Junit和Arquillian进行以下步骤:

 

1.   添加

@RunWith(Arquillian.class)

注释你的测试类。

2.   你的测试类应该继承org.jboss.seam.mock.JUnitSeamTest,而不是org.jboss.seam.mock.SeamTest。

3.   添加一个方法,像

@Deployment(name="_your_test_name_")

@OverProtocol("Servlet 3.0")

public static org.jboss.shrinkwrap.api.Archive<?> createDeployment(){}

 

为创建测试部署档案。以下例子取自Registration例子测试套件。它导入了用"mvn package"构建的.ear档案, 添加了测试类给部署,并且用一个特定SeamTest版本替换WEB-INF/web.xml文件。

 

@Deployment(name="RegisterTest")

@OverProtocol("Servlet 3.0")

public static Archive<?> createDeployment()

{

   EnterpriseArchive er = ShrinkWrap.create(ZipImporter.class, "seam-registration.ear").importFrom(new File("../registration-ear/target/seam-registration.ear"))

              .as(EnterpriseArchive.class);

   WebArchive web = er.getAsType(WebArchive.class, "registration-web.war");

   web.addClasses(RegisterTest.class);

 

   // Install org.jboss.seam.mock.MockSeamListener

 

   web.delete("/WEB-INF/web.xml");

   web.addAsWebInfResource("web.xml");

 

   return er;

 

}

 

4.  创建一个特定SeamTest的 web.xml,包含了org.jboss.seam.mock.MockSeamListener,而不是普通的 org.jboss.seam.servlet.SeamListener。

 

<?xml version="1.0" ?>

<web-app version="3.0"

         xmlns="http://java.sun.com/xml/ns/javaee"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

 

    <listener>

        <listener-class>org.jboss.seam.mock.MockSeamListener</listener-class>

    </listener>

 

</web-app>

 

5.   为运行Arquillian 测试,添加arquillian.xml文件到你的类路径的根。该文件内容应该指定你的类路径到远程或管理容器,以及为 JVM 或 Arquillian指定某些选项。Arquillian文件的的例子是在jboss-seam-x.y.z.Final/examples/booking/booking-tests/src/test/resources-integration/arquillian.xml:

 

<?xml version="1.0" encoding="UTF-8"?>

<arquillian xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns="http://jboss.org/schema/arquillian"

    xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd">

 

    <engine>

        <property name="deploymentExportPath">target/</property>

    </engine>

 

    <container qualifier="jboss" default="true">

        <configuration>

            <property name="javaVmArguments">-Xmx1024m -XX:MaxPermSize=512m</property>

            <property name="jbossHome">target/jboss-as-${version.jbossas7}</property>

        </configuration>

    </container>

 

</arquillian>

 

详情请看Seam参考文档的章节38.2,“集成测试Seam组件”。

 

4.5.  使用Maven的依赖变化

 

如上所述,“提供”平台现在是JBoss AS 7.1.x,因此所有包括在AS 7中Java EE 依赖现在都被标记为提供。

 

4.5.1.  Seam材料单

 

材料单是在 <dependencyManagement> 部分中的一组依赖元素,其能够被用来导入到你的应用程序的maven构建中,并且能够声明你希望在你的应用程序中使用那个依赖和它们的版本。关于Seam BOM这种做法的好处是在这儿依赖和它们的版本是与Seam 2.3很好配合工作的推荐依赖。Seam BOM的用法在例子4.11,“Seam BOM用法”中被展示。Seam BOM被部署在JBoss Maven仓库

 

例子4.11,“Seam BOM用法”

 

<dependencyManagement>

           <dependencies>

               <dependency>

                   <groupId>org.jboss.seam</groupId>

                   <artifactId>bom</artifactId>

                   <version>2.3.0.Final</version>

                   <type>pom</type>

                   <scope>import</scope>

               </dependency>

            ...

         </dependencies>

   </dependencyManagement>

   <dependencies>

      <dependency>

         <groupId>org.jboss.seam</groupId>

         <artifactId>jboss-seam</artifactId>

         <type>ejb</type>

      <dependency>

      ...

   </dependencies>

JBoss Seam 2.3.1新功能