使用本地接口实现 EJB 的 RESTful 视图

如果您具有使用本地接口视图展示的企业 JavaBeans (EJB) 应用程序,那么可以使用 Java™ API for RESTful Web Services (JAX-RS) 向企业 Bean 展示 RESTful 接口。 通过实施 JAX-RS 注释企业 Bean,您保持 EJB 功能,包括事务支持、注入 Java EE 组件和资源以及其他 EJB 会话 Bean 功能。

开始之前

在 EJB 3.1 之前,需要 EJB 本地客户机视图的企业 Bean 也需要单独的 Java 接口,通常该接口位于单独文件中,其声明了本地查看方法。企业 Bean 指定其使用部署描述符或 EJB 注释来实施 EJB 本地视图接口。

如果使用 EJB 3.1 规范,您可以选择在没有显式 EJB 本地接口的情况下展示企业 Bean 的本地视图。而企业 Bean 具有无接口客户机视图,其基于您 bean 类的公共方法。基于以下原因,无接口视图企业 Bean 的开发比本地视图企业 Bean 更简单:
  • 无接口视图企业 Bean 无需单独的 Java 接口声明。
  • 无接口视图企业 Bean 无需在部署描述符中或在使用注释时指定其他元数据。
请参阅 EJB 3.1 规范以了解关于企业 Bean 的无接口视图的更多详细信息。

JAX-RS 支持使用企业 Bean,其声明本地业务接口和无接口视图企业 Bean。

此任务描述以本地接口实施企业 Bean 的 RESTful 视图以使企业 Bean 展示 JAX-RS 资源。

关于此任务

您可以使用 JAX-RS 注释创建简单的企业 Bean。即使此任务专门描述如何实施本地接口视图企业 Bean 的 RESTful 视图,您考虑应用程序体系结构的完整作用域以及在决定资源模型时希望如何展示资源并确定哪些 RESTful 视图适合企业 Bean 应用程序,这一点也很重要。这些注意事项超出了该任务的作用域。

JAX-RS 支持无状态和单一会话 Bean。 您可以将 JAX-RS 注释添加到会话 Bean 的本地接口。而且对于 EJB 3.1,如果企业 Bean 展示无接口视图,您可以将 JAX-RS 注释直接添加到 EJB 类。

凭借 EJB 3.1 封装规则,您可以直接在 WEB-INF/class 目录中或使用 WEB-INF/lib 目录中的 Java 归档 (JAR) 文件在 Web 应用程序归档 (WAR) 文件中添加 JAX-RS 企业 Bean。您可以使用注释和/或使用 EJB 部署描述符来声明企业 Bean。

EAR 中独立或单独 ejb-jar 文件中的 JAX-RS 注释企业 Bean 不受支持。

最佳实践 最佳实践: 虽然您可以用不同方式声明企业 Bean,但最佳实践是直接实施 EJB 业务本地接口以及始终声明 @javax.ejb.Local 注释。 通过使用此方法,需要 EJB bean 实施本地业务接口,这避免了在输入方法名称和参数类型的更改时出错。通过始终使用 @javax.ejb.Local 注释,如果曾经存在多个业务接口,您可以仅将业务接口添加到注释值。您还可以使用此方式来利用部署描述符修改企业 Bean。bprac

过程

  1. 为企业 Bean 应用程序创建企业 Bean 本地接口。 以下示例演示针对要采购的项的简单本地业务接口(可采购的 EJB 本地接口):
    package com.example.jaxrs;
    @javax.ws.rs.Path("itemsForPurchase/{itemID}")
    public interface Purchasable {
    
        public int getItemsLeft(String itemID);
    
        @javax.ws.rs.POST
        public Order purchase(
            @javax.ws.rs.PathParam("itemID") String itemID,
            @javax.ws.rs.QueryParam("orderId") String orderID);
    }

    getItemsLeft 方法是与 JAX-RS 无关的常规 EJB 方法。javax.ws.rs.Path 注释表示要使用的 HTTP 请求路径。向 itemsForPurchase/{itemID} 对象提出 HTTP POST 请求时,JAX-RS 运行时环境查找实施 Purchasable 本地接口以及在企业 Bean 上调用采购方法的 EJB bean。

    您仍然可以在 JAX-RS 运行时环境请求之外使用采购方法。您可以将注入或 JNDI 查找用于可采购企业 Bean 并以两个字符串参数 itemIDorderID 调用采购方法。

    最佳实践 最佳实践: 如果存在实施本地业务接口的多个企业 Bean,那么 JAX-RS 运行时环境选择随机 EJB bean 以在提出 JAX-RS 请求时使用。最佳实践是仅启用一个 bean 类来实施 JAX-RS 注释 EJB 本地接口。如有必要,创建单独的 EJB 本地接口,在新接口上使用 JAX-RS 注释,然后修改 bean 类的元数据以便它实施新的 EJB 本地接口。bprac
  2. 创建实施本地业务接口的企业 Bean。 以下示例演示可采购 EJB bean:
        public int getItemsLeft(String itemID) {
            // Return the number of items left.  
        }
    
        public Order purchase(String itemID, String orderId) {
            // Add the given item to the order id and return it.  
        }
    
    }
  3. 声明 Book 类是企业 Bean 并实施本地接口。 使用以下方法之一将您的类声明为企业 Bean,该 bean 实施本地接口。在以下示例中,将 Book 类声明为实施本地接口的企业 Bean。
    • 在 Book 类上使用 EJB 注释 @javax.ejb.Stateless 或 @javax.ejb.Singleton 来指定您希望此 EJB 成为无状态还是单体。还将本地接口的 @javax.ejb.Local 注释添加为注释值;例如:
      @javax.ejb.Stateless
      @javax.ejb.Local(Purchasable.class)
      public class Book {
      如果您实施了多个本地业务接口,请将接口类添加到 @javax.ejb.Local 注释值;例如:
      @javax.ejb.Local({Purchasable.class, Rentable.class})
    • 您可以使用部署描述符来声明其实施的 EJB bean 和业务接口;例如:
      <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" version="3.1"
          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/ejb-jar_3_1.xsd">
      <!--
          This file must exist in the WEB-INF/
          directory of your WAR file. See EJB 3.1 spec 20.4 for more details.
      -->
          <enterprise-beans>
              <session>
                  <ejb-name>Book</ejb-name>
                  <business-local>com.example.jaxrs.Purchasable</business-local>
                  <ejb-class>com.example.jaxrs.Book</ejb-class>
                  <session-type>Stateless</session-type>
              		</session>
          </enterprise-beans>
      </ejb-jar>

      如果您实施了多个本地业务接口,您必须将业务本地元素添加到 Bean 定义中的每个本地接口。

    • 如果您只有一个本地业务接口,那么您可以直接实施该接口;例如:
      @javax.ejb.Stateless
      public class Book implements Purchasable {
  4. (可选)将 @javax.annotation.Resource 注释 Java EE 资源字段和属性添加到 JAX-RS EJB 类以容易地访问应用程序中的资源。 Java EE 注入在具有 JAX-RS 注释的普通 Java 类中无效。仅在您的 JAX-RS 注释类为企业 Bean 或 Java 上下文和依赖关系注入 (JCDI) (JSR-299) 受管 Bean 的情况下,将 @javax.annotation.Resource 注释 Java EE 资源字段和属性注入到 JAX-RS EJB 类才有效;例如:
    package com.example.jaxrs;
    
    @javax.ejb.Stateless
    @javax.ejb.Local(Purchasable.class)
    public class Book implements Purchasable {
        @javax.annotation.Resource(name="jdcb/TestDataSource")
        private javax.sql.DataSource datasource;
    
        public int getItemsLeft(String itemID) {
            // Reads from the datasource. 
            // Returns the number of items left.  
        }
    
        public Order purchase(String itemID, String orderId) {
            // Reads from the datasource. 
            // Adds the given item to the order id and returns it.  
        }
    }
    在此示例中,如果以正确的 JNDI 名称合适地配置了数据源,那么将 DataSource 对象注入到资源类。
  5. (可选)使用 JAX-RS @javax.ws.rs.core.Context 注入来获取对请求相关信息的访问权。 您可以将 @javax.ws.rs.core.Context UriInfo 字段添加到 JAX-RS EJB 类以访问关于请求 URI 的信息;例如:
    package com.example.jaxrs;
    
    @javax.ejb.Stateless
    @javax.ejb.Local(Purchasable.class)
    public class Book implements Purchasable {
        @javax.ws.rs.core.Context
        private UriInfo uriInfo;
    
        public int getItemsLeft(String itemID) {
            // Return the number of items left.  
        }
    
        public Order purchase(String itemID, String orderId) {
            // Add the given item to the order id and return it.  
        }
    }
    要从请求读取参数(例如 @javax.ws.rs.HeaderParam、@javax.ws.rs.QueryParam 和 @javax.ws.rs.PathParam),将参数添加到资源方法;例如:
    package com.example.jaxrs;
    
    @javax.ws.rs.Path("itemsForPurchase/{itemID}")
    public interface Purchasable {
        public int getItemsLeft(String itemID);
    
        @javax.ws.rs.POST
        public Order purchase(
            @javax.ws.rs.PathParam("itemID") String itemID,
            @javax.ws.rs.QueryParam("orderId") String orderID);
    }
    package com.example.jaxrs;
    
    @javax.ejb.Stateless
    @javax.ejb.Local(Purchasable.class)
    public class Book implements Purchasable {
        @javax.ws.rs.core.Context
        private UriInfo uriInfo;
    
        public int getItemsLeft(String itemID) {
            // Returns the number of items left.  
        }
    
        public Order purchase(String itemID, String orderId) {
            // The method parameters contain the request values. 
            // Add the given item to the order id and return it.  
        }
    
        /*  The following field will not be set. */
        @javax.ws.rs.QueryParam("q")
        private String willNotWork;
    
        @javax.ws.rs.QueryParam("q")
        public void setMyQueryParam(String q) {
            /* This property will not be set. */
        }
    }
    支持的配置 支持的配置: 使用业务接口时,必须将 JAX-RS 参数注释添加到 EJB 业务接口中的资源方法。不能将其添加到实施 Bean。sptcfg
  6. 将企业 Bean 封装到 WAR 文件的 WEB-INF/class 目录或者封装在 WAR 文件的 WEB-INF/lib 目录中包含的 JAR 文件内。

    客户机向 JAX-RS 注释企业 Bean 提出请求时,JAX-RS 运行时环境查找并使用该类的 EJB 实例,然后调用 JAX-RS 资源方法。

结果

您已启用具有本地接口的现有企业 Bean,以便展示 JAX-RS 资源来进行使用。


指示主题类型的图标 任务主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxrs_ejb_localinterface
文件名:twbs_jaxrs_ejb_localinterface.html