EJB初学日记(3)

今天主要是看了一下拦截器的实现,在EJB3.0里面,实现拦截非常简单.加一个注释就可以了,这样就可以随时监视某个方法的调用了,拦截器可以是拦截某一个方法也可以是拦截一个类的所有方法的.具体如下

 首先写一个拦截器方法,拦截器方法并不需要实现什么接口,只要符合一定的规范就可以了,

规范是:  Object xxxxx(InvocationContext context)throws Exception,其中xxxxx是方法名,可以自己取.然后用@AroundInvoke来注释这个方法

/*   
 * MyInterceptor.java   
 *   
 * Created on 2007年9月8日, 上午12:04   
 *   
 * To change this template, choose Tools | Template Manager   
 * and open the template in the editor.   
 
*/   
   
package lbf.interceptor;    
   
import java.lang.reflect.Method;    
import java.util.Date;    
import javax.interceptor.AroundInvoke;    
import javax.interceptor.InvocationContext;    
import lbf.test1.Person;    
   
/**   
 *   
 * 
@author Admin   
 
*/   
public class MyInterceptor {    
        
    
/**   
     * Creates a new instance of MyInterceptor   
     
*/   
    
public MyInterceptor() {    
    }    
    @AroundInvoke   
    
public Object myInter(InvocationContext context)throws Exception{    
        
if(context.getMethod().getName().equals("insertPerson")){    
            System.out.println(
"插入新的Person被调用了");    
        }
else{    
            System.out.println(
"其它方法被调用了");    
        }    
        
return context.proceed();    
    }    
}    

然后,同样是声明远程接口和实现它的类,为了让拦截显得更有效果,我们声明一个实体Bean,把一个实体插入数据库是我们的工作,然后我们再拦截它,看看会怎么样


/*   
 * Person.java   
 *   
 * Created on 2007年9月7日, 下午10:46   
 *   
 * To change this template, choose Tools | Template Manager   
 * and open the template in the editor.   
 
*/   
   
package lbf.test1;    
   
import java.io.Serializable;    
import java.util.Date;    
import javax.persistence.Column;    
import javax.persistence.Entity;    
import javax.persistence.GeneratedValue;    
import javax.persistence.GenerationType;    
import javax.persistence.Id;    
import javax.persistence.Temporal;    
import javax.persistence.TemporalType;    
   
/**   
 * 实体类 Person   
 *    
 * 
@author Admin   
 
*/   
@Entity   
public class Person implements Serializable {    
   
    @Id   
    @GeneratedValue(strategy 
= GenerationType.AUTO)    
    @Column(name
="PersonID",nullable=false)    
    
private Integer id;    
    @Column(name
="PersonName",nullable=false,length=5)    
    
private String name;    
    @Column(name
="PersonAge")    
    
private int age;    
    @Column(name
="PersonSex",nullable=false,length=2)    
    
private String sex;    
    @Column(name
="PersonPhone",nullable=false,length=11)    
    
private String phone;    
    @Column(name
="PersonAddress",nullable=false,length=50)    
    
private String address;    
    @Temporal(value 
= TemporalType.DATE)    
    @Column(name
="PersonBirthday")    
    
private Date birthday;    
        
    
/** Creates a new instance of Person */   
    
public Person() {    
    }    
   
    
/**   
     * 获取此 Person 的 id。   
     * 
@return id   
     
*/   
    
public Integer getId() {    
        
return this.id;    
    }    
   
    
/**   
     * 将此 Person 的 id 设置为指定的值。   
     * 
@param id,新建 id   
     
*/   
    
public void setId(Integer id) {    
        
this.id = id;    
    }    
   
    
/**   
     * 返回对象的散列代码值。该实现根据此对象   
     * 中 id 字段计算散列代码值。   
     * 
@return 此对象的散列代码值。   
     
*/   
    @Override   
    
public int hashCode() {    
        
int hash = 0;    
        hash 
+= (this.id != null ? this.id.hashCode() : 0);    
        
return hash;    
    }    
   
    
/**   
     * 确定其他对象是否等于此 Person。当且仅当   
     * 参数不为 null 且该参数是具有与此对象相同 id 字段值的 Person 对象时,   
     * 结果才为 true。   
     * 
@param 对象,要比较的引用对象   
     * 如果此对象与参数相同,则 
@return true;   
     * 否则为 false。   
     
*/   
    @Override   
    
public boolean equals(Object object) {    
        
// TODO: Warning - this method won't work in the case the id fields are not set    
        if (!(object instanceof Person)) {    
            
return false;    
        }    
        Person other 
= (Person)object;    
        
if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) return false;    
        
return true;    
    }    
   
    
/**   
     * 返回对象的字符串表示法。该实现根据 id 字段   
     * 构造此表示法。   
     * 
@return 对象的字符串表示法。   
     
*/   
    @Override   
    
public String toString() {    
        
return "lbf.test1.Person[id=" + id + "]";    
    }    
   
    
public String getName() {    
        
return name;    
    }    
   
    
public void setName(String name) {    
        
this.name = name;    
    }    
   
    
public String getSex() {    
        
return sex;    
    }    
   
    
public void setSex(String sex) {    
        
this.sex = sex;    
    }    
   
    
public String getPhone() {    
        
return phone;    
    }    
   
    
public void setPhone(String phone) {    
        
this.phone = phone;    
    }    
   
    
public String getAddress() {    
        
return address;    
    }    
   
    
public void setAddress(String address) {    
        
this.address = address;    
    }    
   
    
public Date getBirthday() {    
        
return birthday;    
    }    
   
    
public void setBirthday(Date birthday) {    
        
this.birthday = birthday;    
    }    
   
    
public int getAge() {    
        
return age;    
    }    
   
    
public void setAge(int age) {    
        
this.age = age;    
    }    
        
}  

java 代码,PersonDAO的实现
/*   
 * PersonBean.java   
 *   
 * Created on 2007年9月7日, 下午11:10   
 *   
 * To change this template, choose Tools | Template Manager   
 * and open the template in the editor.   
 
*/   
   
package lbf.test1;    
   
import java.util.List;    
import javax.ejb.Remote;    
import javax.ejb.Stateless;    
import javax.interceptor.Interceptors;    
import javax.persistence.EntityManager;    
import javax.persistence.PersistenceContext;    
import javax.persistence.Query;    
import lbf.interceptor.MyInterceptor;    
   
/**   
 *   
 * 
@author Admin   
 
*/   
@Remote(PersonDAO.
class)    
@Stateless   
@Interceptors({MyInterceptor.
class})    
public class PersonBean implements PersonDAO{    
    @PersistenceContext   
    
private EntityManager em;    
    
/** Creates a new instance of PersonBean */   
    
public PersonBean() {    
    }    
   
    
public boolean insertPerson(Person person) {    
        
try{    
           em.persist(person);    
        }
catch(Exception exe){    
            exe.printStackTrace();    
            
return false;    
        }    
        
return true;    
    }    
   
    
public String getPersonNameByID(int personid) {    
        Person p
=em.find(Person.class,personid);    
        
return p.getName();    
    }    
   
    
public boolean updatePerson(Person person) {    
        
try{    
            em.merge(person);    
        }
catch(Exception exe){    
            exe.printStackTrace();    
            
return false;    
        }    
        
return true;    
    }    
   
    
public Person getPersonByID(int personid) {    
        
return em.find(Person.class,personid);    
    }    
   
    
public List getPersonList(int max, int whichpage) {    
           
try {     
            
int index = (whichpage-1) * max;     
            Query query 
= em.createQuery("from Person p order by personid asc");     
            List list 
= query.setMaxResults(max).     
                                setFirstResult(index).     
                                getResultList();     
            em.clear();
//分离内存中受EntityManager管理的实体bean,让VM进行垃圾回收     
            return list;     
                 
        } 
catch (Exception e) {     
            e.printStackTrace();     
            
return null;     
        }              
    }    
        
}  

/*   
 * PersonDAO.java   
 *   
 * Created on 2007年9月7日, 下午11:10   
 *   
 * To change this template, choose Tools | Template Manager   
 * and open the template in the editor.   
 
*/   
   
package lbf.test1;    
   
import java.util.Date;    
import java.util.List;    
   
/**   
 *   
 * 
@author Admin   
 
*/   
public interface PersonDAO {    
        
    
public boolean insertPerson(Person person);    
    
public String getPersonNameByID(int personid);    
    
public boolean updatePerson(Person person);    
    
public Person getPersonByID(int personid);    
    
public List getPersonList(int max,int whichpage);    
}  

所有的类都定义好了,我们现在开始试用拦截器了

我们声明一个主类去调用PersonBean的一些方法

/*   
 * Main.java   
 *   
 * Created on 2007年9月7日, 下午10:37   
 *   
 * To change this template, choose Tools | Template Manager   
 * and open the template in the editor.   
 
*/   
   
package lbf.client;    
   
import java.util.Date;    
import java.util.Properties;    
import javax.naming.InitialContext;    
import lbf.test1.Person;    
import lbf.test1.PersonDAO;    
   
/**   
 *   
 * 
@author Admin   
 
*/   
public class Main {    
    
private InitialContext ctx;    
    
/** Creates a new instance of Main */   
    
public Main() {    
        initContext();    
    }    
    
private void initContext(){    
        
try{    
            Properties props 
= new Properties();    
            props.setProperty(
"java.naming.factory.initial",    
                    
"org.jnp.interfaces.NamingContextFactory");    
            props.setProperty(
"java.naming.provider.url", "localhost:1099");    
            props.setProperty(
"java.naming.factory.url.pkgs", "org.jboss.naming");    
                
            ctx 
= new InitialContext(props);    
        }
catch(Exception exe){    
            exe.printStackTrace();    
        }    
    }    
    
private void doPerson(){    
        
try{    
            PersonDAO dao
=(PersonDAO)ctx.lookup("PersonBean/remote");    
            Person pp
=new Person();    
            pp.setAddress(
"香莲里33号20C");    
            pp.setAge(
20);    
            pp.setBirthday(
new Date());    
            pp.setName(
"千里冰封");    
            pp.setPhone(
"12536214");    
            pp.setSex(
"男");    
            System.out.println(
"成功吗?"+dao.insertPerson(pp));    
        }
catch(Exception exe){    
            exe.printStackTrace();    
        }    
    }    
    
/**   
     * 
@param args the command line arguments   
     
*/   
    
public static void main(String[] args) {    
        
// TODO code application logic here    
        Main main=new Main();    
        main.doPerson();    
    }    
        
}    

在我们执行Main的时候,会看到JBOSS的标准输出会输出一句

"插入新的Person被调用了"

如果我们调用其它的方法,就会输出"其它方法被调用了"

到这里,我想到一个问题,我们拦截的时候只是为了输出这句话吗,我能不能拦截一些别的东西呢,比如,我保存Person的时候,如果Person的姓名不合法,我可不可以检查一下,然后再插入别的,或者我直接换掉原来的调用,调用我自己的东西.行吗?还是试一下先吧,我们把myInter方法换成如下的样子

@AroundInvoke   
    
public Object myInter(InvocationContext context)throws Exception{    
        
if(context.getMethod().getName().equals("insertPerson")){    
            System.out.println(
"插入新的Person被调用了");    
            Method m
=context.getMethod();    
            Person person
=new Person();    
            person.setAddress(
"被换成的地址");    
            person.setAge(
10);    
            person.setBirthday(
new Date());    
            person.setName(
"被换的名字");    
            person.setPhone(
"1380606");    
            person.setSex(
"男");    
          
return  m.invoke(context.getTarget(),person);    
        }
else{    
            System.out.println(
"其它方法被调用了");    
        }    
        
return context.proceed();    
    }  

加了几句自己的东东,然后直接把要调用的Method取出来,自己去调用它.然后返回它所应该返回的东西

这个时候,你会发现,当你在调用PersonBean上的insertPerson的时候,你自己要插入的Person被我们改了,插入的是我们拦截器里面的Person.

使用拦截器如果只能这样的话,那岂不是也不太好,想像一下,如果我写一个类的时候,没有使用@Interceptors来注释它使用哪个拦截器,后来我又想拦截它了,岂不是要重新注释一下编译一下然后再布署?这样岂不是太麻烦了.有没有别的方法呢

方法当然有,那就是回归到最原始的用XML方法来配置,用XML方法配置以后,就不管你的Bean有没有使用@Interceptors来注释,它都会按照你声明的内容来进行拦截了,这样就比直接用注释灵活性大了很多了.XML的声明如下

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

<ejb-jar xmlns = "http://java.sun.com/xml/ns/javaee" 
         version 
= "3.0" 
         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_0.xsd">
    
<assembly-descriptor>
        
<interceptor-binding>
            
<ejb-name>PersonBean</ejb-name>
            
<interceptor-class>lbf.interceptor.MyInterceptor</interceptor-class>
     &nbs
时序预测 | MATLAB实现NGM(1,1)多变量灰色时间序列预测 阅读详情

相关推荐

HFSS仿真的后处理结果,如何根据天线表面的电流密度分布对天线进行优化?

在HFSS仿真中,天线表面的Jsurf​是最直观、最有价值的诊断工具之一。它不仅告诉你天线“能不能工作”,还能告诉你“为什么工作”以及“哪里出了问题”。

degogmy的博客 1158

[EJB:011008]Unable to bind EJB Home Interface to the JNDI name: BusinessDelegateBean.

1  部署DM-core 的weblogic老是出问题,部署不了?2014-08-04 后台报错: 下午12时50分41秒 GMT> 下午12时50分41秒 GMT> 下午12时50分41秒 GMT> Mon Sep 19 23:06:54 PDT 2005 641358 WebLogic XMLX Module 8.1 SP5  M

Coder Ben 1853

5个免费股票数据API实测对比:从AkShare到BaoStock,哪个最适合你的AI量化项目?

本文深度评测了AkShare、BaoStock、yfinance、Alpha Vantage和EOD Historical Data这五个免费股票数据API,从数据质量、覆盖范围、更新频率、稳定性及易用性进行对比。针对AI量化项目,文章提供了详细的选型策略,帮助开发者根据项目阶段与需求,精准选择最适合的数据源,并强调了多源验证与数据清洗的重要性。

weixin_29290947的博客 5086

真正解决方案: A bean with that name has already been defined in null and overriding is disabled.

A bean with that name has already been defined

极客星云-优快云博客 6万+

Qt 5.12.8在Linux下编译qtvirtualkeyboard模块,我踩过的那些坑(附完整解决方案)

本文详细介绍了在Linux系统下为Qt 5.12.8单独编译qtvirtualkeyboard模块的完整解决方案。通过分析模块缺失原因、提供精准的编译步骤和常见问题处理,帮助开发者高效解决虚拟键盘模块缺失问题,避免重新编译整个Qt源码的繁琐过程。

weixin_29248611的博客 458

SpringBoot 指标监控——Actuator

1、 访问:localhost:8000/actuator 设置健康监控显示具体情况 metrics http://localhost:8000/actuator/metrics/jvm.gc.live.data.size 定制化health信息 //利用构造器,在注册中心中添加cityService.saveCity.count指标 public CityServiceImpl(MeterRegistry meter...

weixin_44302046的博客 4628

EJB初学日记(1)

2007年10月10日 07:40:00 今天终于还是下定决心看看EJB,看着SPRING看了两天,觉得一点头绪都没有,我不是一个讲究速成的人,但是总是感觉和它们的理念不太一样,唉,真可怜,都怪自己,初学JAVA的时候就把J2SE看得太重了.在学习了J2SE一整年之后,发现JAVA的应用还远远没有掌握,我学习一年的结果就是刚刚对JAVA有所了解而已,回首这一年的路,挺艰难的,但 是现在以一

秦梦瑶的专栏 444

AD9361 Fast Lock实战:Python脚本自动生成Profile寄存器配置(附完整代码)

本文详细介绍了利用Python脚本实现AD9361 Fast Lock Profile寄存器自动化配置的实战方案。通过解析频率合成公式、VCO约束及查表机制,脚本能根据目标频率一键生成完整的16进制寄存器序列,大幅提升射频系统开发中多频点切换的效率和准确性,并支持CSV、JSON、C头文件等多种输出格式,便于与FPGA/嵌入式系统集成。

weixin_29194693的博客 475

EJB初学日记(2)

其实在学习EJB之前,就听说过EJB,有人说他很复杂,也有人说一般般而已,但是几乎所有的人都说EJB3.0确实是简单了许多. 一般讲起JAVA EE,一般人都认为是应用在网页里面的,甚至有人把JAVA EE和JSP等同起来,要知道,JAVA EE是一个很庞大的结构,而JSP只是里面一部份中的一部份而已. 今天我就把JAVA EE的EJB应用到JAVA SE中看一看,在JBOSS里面布署好EJB,...

千里冰封 145

ThingsBoard实战指南:RPC命令下发与设备交互详解

本文深入解析了ThingsBoard平台中RPC命令下发的核心机制与实战应用。通过对比客户端与服务端RPC模式,详细阐述了从仪表盘控件配置到设备端Python代码响应的完整双向交互流程,并提供了常见问题排查与进阶优化技巧,帮助开发者构建可靠、实时的物联网设备控制系统。

weixin_29168153的博客 213

microblaze之Video Processing Subsystem调试误区

内容:总结video processing subsystem调试中遇到的问题,以及在解决问题中的思路方法论,引为前车之鉴。 1,我的目的是希望采用vps中的scaler模块对图像进行拉伸缩小。IP的配置如下: 2,整个系统的框架图如下,仅比上期的内容增加了scaler模块,如下: 3,查手册,可以知道这个scaler only组件分成了hscale,vscale和GPIO,其中GPIO是控制上下游stream流控设备复位用,暂时忽略。 hscale和vscale的寄存器空间如下,主要关注图

YDY5659150的专栏 3555

EJB初学日记(4)

2007年10月10日 07:09:00 关于session bean的一些问题 EJB里面,session bean是占了挺重要的地位的,一些重要的事情都是交给session bean来处理的session BEAN一般用于操作一些对外的方法,供客户调用.会话BEAN分两种,一种 是有状态的会话BEAN,一种 是无状态的会话BEAN,它们有什么不同呢?有状态的会话BEAN,会记录每一个调

秦梦瑶的专栏 469

VMware如何安装img镜像,VMware如何安装openwrt软路由(含相关工具镜像)

VMware如何安装img镜像,VMware如何安装openwrt软路由(含相关工具镜像)

XiaoqiangClub的博客 4007

EJB初学日记(6)

2007年10月10日 07:08:00 实体BEAN的关联 今天自己写了一个例子,有关实体BEAN的关联问题,我写的这个例子是一对多的情况,一是人,多是狗,一个人可以养多条狗,每条狗都必须有一个主 人,在删除主人的时候,狗就没有存在的必要了,所以狗也要跟着删除,可是删除狗的时候,主人却可以在.一开始我实现的时候,删除狗的操作是错误的,我以为 直接把Person里面的Dog删掉,然后更新

秦梦瑶的专栏 406

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

EJB初学日记(6)

实体BEAN的关联 今天自己写了一个例子,有关实体BEAN的关联问题,我写的这个例子是一对多的情况,一是人,多是狗,一个人可以养多条狗,每条狗都必须有一个主 人,在删除主人的时候,狗就没有存在的必要了,所以狗也要跟着删除,可是删除狗的时候,主人却可以在.一开始我实现的时候,删除狗的操作是错误的,我以为 直接把Person里面的Dog删掉,然后更新Person就可以了,谁知不是这样的,你在增加...

千里冰封 147

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

EJB初学日记(5)

以前看到一本书上写的,有关定义实体BEAN的一些细节,直到今天才知道其中的差别 代码1: /*     * Test.java     *     * Created on 2006年12月15日, 上午12:06     *     * To change this template, choose Tools | Template Manager     * and open the te...

千里冰封 139

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

J2EE初学

今天终于还是下定决心看看EJB,看着SPRING看了两天,觉得一点头绪都没有,我不是一个讲究速成的人,但是总是感觉和它们的理念不太一样,唉,真可怜,都怪自己,初学JAVA的时候就把J2SE看得太重了. 在学习了J2SE一整年之后,发现JAVA的应用还远远没有掌握,我学习一年的结果就是刚刚对JAVA有所了解而已,回首这一年的路,挺艰难的,但是现在以一个过来人的姿态去看的时候,我又学得很庆幸.因为我没...

千里冰封 161

Java日记(1) 一. 认识Java

Java日记(1)Date:2004-2-25标题:初涉Java注:出水奇芭问有源,E网情深觅仙踪。一.     认识JavaJava的由来和发展历程这里不再累述,顺便找本Java方面的书籍都会有介绍。Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标

brightsome的专栏 932

博客学习日记-2014/12/11

关于Java学习的新的开始 之前跟一个阿里巴巴工作的姐夫聊起他在阿里巴巴的工作,他从事于Java编程。对于Java编程,我之前的实习经历,让我对它还是有一定的了解,但是现在想想自己的理解还是过于肤浅。之前只是在实习的过程中,看到身边的工程师在写Java程序,涉及到JSP、servlet、一些框架(Spring、Hibernate、StrutsII)等等,感觉java就是在做网页,同时也感觉那些框

jingjbuer的专栏 656
上一篇: EJB初学日记(3)
下一篇: JAVA代理机制初探
hadeslbf
博客等级 码龄20年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值