阅读更多

19顶
0踩

编程语言

原创新闻 EJB 3.0和Spring 2.5 :在Spring中使用EJB 3.0

2008-08-29 12:55 by 副主编 QQbyte 评论(11) 有21212人浏览
Meera Subbarao说道:EJB和Spring社区的开发者为什么总是贬低对方呢?我同时使用EJB和Spring,就像所有的开发者一样,我对于两者需要大量的XML设置非常头疼,但是从Java 5发布以来,XML配置已经用annotation来替代了。但是在使用了最新的Spring 2.5和EJB 3.0,我觉得它们是互相补充的关系,而非相互竞争关系。

许多开发者理解,Spring是由Spring Source创建的最常用的非标准框架,而EJB 3.0是一个由主要的JEE厂商创建的规格。我以前曾一起工作的同事更愿意使用标准规格,选择EJB 2.X现在迁移到EJB 3.0。也有开发者愿意使用Spring而拒绝EJB。但是没有任何东西阻止开发者同时使用Spring和EJB,对不对?在Spring的配置文件增加几行就能够在Spring中无缝使用EJB 3.0组件。

下面我将展示这个过程是多么简单,我们可以通过Spring的强大的依赖注入机制来注入Customer session bean。这个Customer session bean可以使用Entity Manager来进行创建/读写/删除操作。

1。创建一个简单的JPA Entity:

package com.ejb.domain;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 *
 * @author meerasubbarao
 */
@Entity
@Table(name = "CUSTOMER", catalog = "", schema = "ADMIN")
public class Customer implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "CUSTOMER_ID")
    private Long customerId;
    @Column(name = "FIRST_NAME")
    private String firstName;
    @Column(name = "LAST_NAME")
    private String lastName;
    @Column(name = "MIDDLE_NAME")
    private String middleName;
    @Column(name = "EMAIL_ID")
    private String emailId;

    public Customer() {
    }

    public Customer(Long customerId) {
        this.customerId = customerId;
    }

    public Long getCustomerId() {
        return customerId;
    }

    public void setCustomerId(Long customerId) {
        this.customerId = customerId;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getMiddleName() {
        return middleName;
    }

    public void setMiddleName(String middleName) {
        this.middleName = middleName;
    }

    public String getEmailId() {
        return emailId;
    }

    public void setEmailId(String emailId) {
        this.emailId = emailId;
    }


}



2.创建一个EJB 3.0 Session bean.

The Interface:

package com.ejb.service;

import com.ejb.domain.Customer;
import java.util.Collection;
import javax.ejb.Remote;

/**
 *
 * @author meerasubbarao
 */
@Remote
public interface CustomerService {

    Customer create(Customer info);

    Customer update(Customer info);

    void remove(Long customerId);

    Collection<Customer> findAll();

    Customer[] findAllAsArray();

    Customer findByPrimaryKey(Long customerId);
}


The Implementation Class:

package com.ejb.service;

import com.ejb.domain.Customer;
import java.util.Collection;
import javax.ejb.Stateless;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.jws.WebMethod;

/**
 *
 * @author meerasubbarao
 */
@WebService(name = "CustomerService", serviceName = "CustomerService", targetNamespace = "urn:CustomerService")
@SOAPBinding(style = SOAPBinding.Style.RPC)
@Stateless(name = "CustomerService")
public class CustomerServiceImpl implements CustomerService {

    @PersistenceContext
    private EntityManager manager;

    @WebMethod
    public Customer create(Customer info) {
        this.manager.persist(info);
        return info;
    }

    @WebMethod
    public Customer update(Customer info) {
        return this.manager.merge(info);
    }

    @WebMethod
    public void remove(Long customerId) {
        this.manager.remove(this.manager.getReference(Customer.class, customerId));
    }

    public Collection<Customer> findAll() {
        Query query = this.manager.createQuery("SELECT c FROM Customer c");
        return query.getResultList();
    }

    @WebMethod
    public Customer[] findAllAsArray() {
        Collection<Customer> collection = findAll();
        return (Customer[]) collection.toArray(new Customer[collection.size()]);
    }

    @WebMethod
    public Customer findByPrimaryKey(Long customerId) {
        return (Customer) this.manager.find(Customer.class, customerId);
    }

  
}


3.编译,打包,部署到一个应用服务器上。

我使用GlassFish,用缺省的持久化提供工具TopLink,persistence.xml文件配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" 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">
  <persistence-unit name="SpringAndEJBPU" transaction-type="JTA">
    <provider>oracle.toplink.essentials.PersistenceProvider</provider>
    <jta-data-source>spring-ejb</jta-data-source>
    <properties>
      <property name="toplink.ddl-generation" value="drop-and-create-tables"/>
    </properties>
  </persistence-unit>
</persistence>


当你的应用部署以后,确认session bean JNDI名称,在 GlassFish 中,点击JNDI浏览工具按钮查看:



4: 测试无状态 Session beans.



5: 创建一个 Spring Bean.

创建一个CustomerManager 接口:

package com.spring.service;

import com.ejb.domain.Customer;

/**
 *
 * @author meerasubbarao
 */
public interface CustomerManager {

    public void addCustomer(Customer customer);
    public void removeCustomer(Long customerId);
    public Customer[] listCustomers();


}


package com.spring.service;

import com.ejb.domain.Customer;
import com.ejb.service.CustomerService;

/**
 *
 * @author meerasubbarao
 */
public class CustomerManagerImpl implements CustomerManager {

    CustomerService customerService;

    public void setCustomerService(CustomerService customerService) {
        this.customerService = customerService;
    }

    public void removeCustomer(Long customerId) {
        customerService.remove(customerId);
    }

    public Customer[] listCustomers() {
        return customerService.findAllAsArray();
    }

    public void addCustomer(Customer customer) {
        customerService.create(customer);
    }
}


6: 注入 EJB 3.0 Session bean 进入我们的 Spring Beans.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
       http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">
    <jee:jndi-lookup id="customerService" <b>jndi-name="com.ejb.service.CustomerService"</b>>
    </jee:jndi-lookup>
    <bean id="manageCustomer"
        class="com.spring.service.CustomerManagerImpl">
        <property name="customerService" ref="customerService" />
    </bean>
</beans>


<jee:jndi-lookup id="customerService" jndi-name="com.ejb.service.CustomerService">
</jee:jndi-lookup>


    <bean id="manageCustomer"
        class="com.spring.service.CustomerManagerImpl">
        <property name="customerService" ref="customerService" />
    </bean>


7: 测试

package com.spring.client;

import com.ejb.domain.Customer;
import com.spring.service.CustomerManager;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringAndEJBMain {

    public static void main(String[] args) {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("SpringXMLConfig.xml");

        CustomerManager service = (CustomerManager) context.getBean("manageCustomer");
        Customer customer = new Customer();
        customer.setFirstName("Meera");
        customer.setLastName("Subbarao");
        customer.setMiddleName("B");
        customer.setEmailId("meera@springandejb.com");
        customer.setCustomerId(new Long(1));

        service.addCustomer(customer);
        for (Customer cust : service.listCustomers()) {
            System.out.println(cust.getFirstName());
            System.out.println(cust.getLastName());
            System.out.println(cust.getMiddleName());
            System.out.println(cust.getEmailId());

        }
        service.removeCustomer(new Long(1));

    }
}






整个过程结束,使用Spring和EJB 3.0能够同时或者两者的好处。
来自: java.dzone.com
19
0
评论 共 11 条 请登录后发表评论
11 楼 zhuchao_ko 2011-06-14 17:14
你们问的问题之前先把EJB3先学一遍,不是很难。
之后你们问的问题都不是问题。OK?
10 楼 darkkid00 2010-10-14 20:48
EJB+spring我大学的毕业设计就是用这种架构做的

EJB提供分布式组建,spring自动访问EJB组建,为客户端组建解耦
9 楼 linzewu100 2010-07-06 15:47
我开发过分布式系统,终端服务使用的是EJB,客户端是使用spring。两者合作得不错。个人觉得EJB在分布式方面确实是很优越,而Spring更合适用来解耦合。spring本身是支持EJB的。特别是对EJB的连接上。比自己去写连接性能上会提高很多。
8 楼 taxuewuhen 2009-04-02 14:21
[/align][align=left]
[/align][align=right]
[/align][align=right]
[/align][align=left]
[/align][color=red][/color][size=small][/size][align=center]
7 楼 jameswallace 2008-10-13 11:02
我有一个问题,如果基于ANNOTATION,那么在需要修改配置时,该如何解决?
6 楼 zhongxun20 2008-09-03 13:00
想得太多了 这些都不是你能决定的,各有各的优点和缺点.看你需求啦
5 楼 xiaopang106 2008-09-02 17:22
不太明白的是为什么要spring +EJB3.0,单独用EJB3.0无法实现吗??
4 楼 xiaoqulai 2008-09-01 17:58
第三步结束后,启动glassfishv2,出现如下问题:

avax.management.InstanceNotFoundException: 没有与指定的名称 "server.security-service.message-security-config.SOAP.provider-config.XWS_ClientProvider.property.signature.key.alias" 匹配的对象
javax.management.InstanceNotFoundException: 没有与指定的名称 "domain.applications.lifecycle-module.JBIFramework.property.com.sun.jbi.home" 匹配的对象
javax.management.InstanceNotFoundException: 没有与指定的名称 "server.security-service.message-security-config.SOAP.provider-config.XWS_ServerProvider.property.encryption.key.alias" 匹配的对象
javax.management.InstanceNotFoundException: 没有与指定的名称 "server.security-service.message-security-config.SOAP.provider-config.ClientProvider.property.security.config" 匹配的对象
javax.management.InstanceNotFoundException: 没有与指定的名称 "server.security-service.message-security-config.SOAP.provider-config.ClientProvider.property.encryption.key.alias" 匹配的对象
javax.management.InstanceNotFoundException: 没有与指定的名称 "server.security-service.message-security-config.SOAP.provider-config.ServerProvider.property.security.config" 匹配的对象
javax.management.InstanceNotFoundException: 没有与指定的名称 "server.applications.lifecycle-module.JBIFramework.property.com.sun.jbi.home" 匹配的对象
javax.management.InstanceNotFoundException: 没有与指定的名称 "server.security-service.message-security-config.SOAP.provider-config.ClientProvider.property.dynamic.username.password" 匹配的对象
javax.management.InstanceNotFoundException: 没有与指定的名称 "server.security-service.message-security-config.SOAP.provider-config.ServerProvider.property.signature.key.alias" 匹配的对象
javax.management.InstanceNotFoundException: 没有与指定的名称 "server.security-service.message-security-config.SOAP.provider-config.XWS_ClientProvider.property.dynamic.username.password" 匹配的对象
javax.management.InstanceNotFoundException: 没有与指定的名称 "server.security-service.message-security-config.SOAP.provider-config.XWS_ClientProvider.property.encryption.key.alias" 匹配的对象
javax.management.InstanceNotFoundException: 没有与指定的名称 "server.security-service.message-security-config.SOAP.provider-config.ClientProvider.property.signature.key.alias" 匹配的对象
javax.management.InstanceNotFoundException: 没有与指定的名称 "server.security-service.message-security-config.SOAP.provider-config.ServerProvider.property.encryption.key.alias" 匹配的对象
javax.management.InstanceNotFoundException: 没有与指定的名称 "server.security-service.message-security-config.SOAP.provider-config.XWS_ServerProvider.property.signature.key.alias" 匹配的对象

Why?
3 楼 janmy 2008-08-30 20:47
我想问的是,,开发ejb3.0,,要结全webservice吗??
2 楼 Acaleph 2008-08-30 07:45
应用决定方案?还是方案决定应用?
批评和指责,有助于进步。
这只是从应用层面,做了个使用例子,实际项目开发过程中,要考虑的东西还是很多的。
1 楼 key232323 2008-08-29 18:48
顶,坐沙发。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 文本朗读SDK

    采用Windows系统文本语音转换API,可进行中英文混合文本朗读,并支持各种语音库。可在此基础上开发出类似于金山词霸的朗读功能模块。

  • 在我们的程序中让电脑说英语

           随着计算机多媒体技术的发展,让电脑唱歌说话已经不是什么新鲜事了。但是能不能在我们自己编写的软件中让电脑朗读文本信息呢?微软公司开发的一套文字朗读引擎(Text-To-Speech Engine,简称 TTS)使我们这一功能的实现变得易如反掌。只要您安装了“金山词霸2000”(或“金山词霸.net”),那么在 Windows 文件夹下会生成一个 Speech 文件夹,里面的 VTXTA

  • 在 程 序 中 加 入 英 文 朗 读 功 能 (转)

    在 程 序 中 加 入 英 文 朗 读 功 能 (转)[@more@] 在 程 序 中 加 入 英 文 朗 读 功 能 华 中 师 范 大 学 卢 小 海(flier@126.com) ---- 金 山 词 霸2...

  • 免费的文字转语音朗读 -API接口

    接口地址(中文):https://api.oick.cn/txt/apiz.php 接口地址(英文):https://api.oick.cn/txt/apie.php 返回格式:MP3 请求方式:GET 请求示例:https://api.oick.cn/txt/apiz.php?text=方包博客&amp;spd=1 请求参数说明: 名称 必填 类型 说明 text 是 String 输入要转换的文字或英文 spd 是 Strin...

  • 文本朗诵语音的API

    请勿用于商业请勿用于商业请勿用于商业请勿用于商业请勿用于商业请勿用于商业请勿用于商业请勿用于商业请勿用于商业请勿用于商业请勿用于商业请勿用于商业

  • 网页朗读程序

    html xmlns="http://www.w3.org/1999/xhtml" >    head>    title>网页朗读程序title>        script type="text/javascript">...            //定义并创建ActiveX控件            var VoiceObj = new ActiveXObject("Sapi.SpVo

  • 【英语学习系统】使用百度API进行在线文字换语音,语音合成

    使用百度API进行在线文字换语音,语音合成

  • 基于SAPI(微软的语音API)的文字转语音功能

    一、环境配置1、下载Microsoft Speech SDK 5.1,下载地址为:http://www.microsoft.com/download/en/details.aspx?id=10121  。2、然后进行安装,VC++6.0具体配置过程可以参考如下网址:https://jingyan.baidu.com/article/fb48e8be58421c6e622e14af.html    ...

  • 有道单词发音接口

    http://dict.youdao.com/dictvoice?audio= 例如: http://dict.youdao.com/dictvoice?audio=hello

  • 使用Web Speech API实现语音文本互转

    本教程中,我们将尝试使用Web Speech API,这是一个非常强大的浏览器接口,可以用来记录语音并将其转换为文本,同样的,也可以用来朗读字符串。 接下来进入正题,这个App应当具有以下几个功能: 通过语音录入或者键盘输入的方式保存笔记;将笔记保存到本地;显示历史笔记并可以通过语音朗读笔记; 此App无需使用任何花哨的依赖,只需使用jQuery来进行简单的DOM操作,以及Sho

  • TTS中英文混合朗读的完全设计实现

    ===========转载请注明出处:南才北往=================本文由所有代码全由南才北往开发的转载请注明原作者名称==============转载请注明出处:南才北往==============中英文混合朗读一直是个难点,即在一段文本中要将中文和英文分离出来进行分别朗读,又不能打乱朗读的次序,所以我们设计如下的两种方法,每种方法

  • 单词发音接口

    1、有道词典 http://dict.youdao.com/dictvoice?audio= 在等号后面添单词为变量,可用浏览器打开, 如http://dict.youdao.com/dictvoice?audio=good 2、扇贝接口 1. 美式:http://media.shanbay.com/audio/us/单词.mp3 2. 英式:http://media.shanb...

  • 功能案例----java实现语音播报功能

    功能案例----java实现语音播报功能 根据自己最近的写的项目,总结整理了关于java语音播报功能的方法,可分为两种形式 一种是通过自己写出一个语音播报方法的工具类,然后从前端获取文本数据,最后跳到控制层进行语音播报方法的调用,但是这种方式需要外部导入jacob这个jar包以及dll文件的位置设置,主要是通过java工具类来实现;(但是这种导入Jacob包的方法只适合在window的开发环境使用,因为里面的dll文件只支持在Windows环境下的com组件运行,而Linux系统不适用) 另一种就是通过

  • 有道英语发音API

    调用有道词典的在线发音库: audio后边加上单词即可美音: http://dict.youdao.com/dictvoice?type=0&amp;audio= 英音: http://dict.youdao.com/dictvoice?type=1&amp;audio= ...

  • 【API解析】微软edge浏览器大声朗读功能(read aloud)调用步骤

    微软edge浏览器大声朗读(read aloud)接口模拟过程,文本转语音(text-to-speech)功能

  • 百度和有道还有bing的语音播报发音url接口,有女声也有男声

    http://tts.baidu.com/text2audio?lan=zh&ie=UTF-8&text=百度翻译女声语音播报apihttp://api.microsofttranslator.com/v2/http.svc/speak?appId=TJnIprF8gfKIzzWSJUYbWZBxOdX4nQDJK4o5BoiI42GE*&language=zh-TW&format=audio/mp

  • 在线中英文翻译

    可在线进行中英文翻译,直接放入网站后台即可!

Global site tag (gtag.js) - Google Analytics