...
首先定义一个EJB的应用,然后就可以直接调用这个EJB的商务方法,剩下的工作由Container来为我们完成。
2.4 新的事务管理
EJB中的事务(Transaction)管理大大简化了用户开发程序。把应用分成一个一个小的单元,叫做transaction. 事务系统保证了这个单元里面的任务是完整的,要么全部执行,要么出错后完全退回到初始状态。
J2EE中有两种类型的事务, 容器管理的和Bean管理的。他们在如何启动和结束事务上是不同的。Bean 管理的事务由组件使用 UserTransaction类显式启动和结束的。代码中需要调用方法 UserTransaction.begin() 和 UserTransaction.commit() 。Container 管理的事物是由container 自动来完成的。 针对不同的事务类型,可以定义6种不同的事务属性。 事务属性告诉 Container 是否把EJB方法里面的工作放到用户的事务里面。还是针对这个方法重新启动一个新的事务. 或者执行这个方法而不包含在事务里面,等等。 在EJB3.0规范中,我们缺省的定义是容器管理的事务. 而且针对所有的Bean方法,应用Required Transaction属性,它的意思是如果调用这个方法的应用没有Transaction Environment,那么这个方法会自动创建一个新的。 开发人员可以使用标注的方式在针对整个EJB或者某个具体的方法指定他的Transaction Attribute. 首先我们看一个工资处理的EJB的例子, 这是一个标准的EJB 3.0 Stateless Session Bean。缺省情况下,每个方法是都是由container来管理Transaction的,缺省的事务属性是required // Uses container-managed transction, REQUIRED attribute @Stateless public PayrollBean implements Payroll { public void setBenefitsDeduction(int empId, double deduction) {...} public double getBenefitsDeduction(int empId) {...} public double getSalary(int empId) {...} public void setSalary(int empId, double salary) {...} }
下面还是这个例子,我们知道对于有关重要数据的改动,总是非常敏感的。比如我们在更改某个用户的工资的时候同时修改他的所得税,我们希望这两个调用是在同一个Transaction里面发生的。
@Stateless public PayrollBean implements Payroll { @TransactionAttribute(MANDATORY) public void setBenefitsDeduction(int empId, double deduction) {...} public double getBenefitsDeduction(int empId) {...} public double getSalary(int empid) {...} @TransactionAttribute(MANDATORY) public void setSalary(int empId, double salary) {...} }
那么调用用户的工资改动的方法就必须在一个已经存在的Transaction Environment 中,为此,我们用@transactionattribute(mandatory)标注 这个方法必须在一个客户端的transaction中,如果客户端没有这样的一个 Transaction Context, Container会扔出来一个 Javax.ejb.EjbTransactionRequiredException 的错误信息。
2.5 新的安全机制 EJB架构不鼓励开发人员用代码的方式实现安全机制,而是采用安全角色的方法,通过定义可以访问的安全角色,来限制对某个方法的访问权限。
缺省情况,在3.0里面所有的方法都是"unchecked"。也就是说缺省情况下对所有方法是不用安全控制策略的。如果调用某个方法的客户端具有某个用户角色(Role) ,我们可以制定是否这个方法也是沿用这个角色。缺省情况下的安全策略是"Caller Identity",也就是说被调用者的角色和调用者的角色应该是一致的
这是一个EJB 3.0的安全实现的例子。我们对于其他的方法都没有设定安全策略。但是对于设定某个员工的工资是多少,这样的安全要求比较高的方法设定了只有人事部门的管理员才能调用。我们采用了一个
@RolesAllowed("HR_PayrollAdministrator ") // Security view @Stateless public PayrollBean implements Payroll { public void setBenefitsDeduction(int empId, double deduction) {...} public double getBenefitsDeduction(int empId) {...}
上一篇:Spring Framework中的面向方面编程(AOP),第一部分
下一篇:使用EasyMock使单元测试更加容易
|