weid0907 2009-04-15 22:52
浏览 1233
已采纳

spring AOP中如何给通知传递参数

我想在不修改原对象代码的情况下,插入对域模型的数据搜集方法,需要传入1个参数。
例如:病人信息(PatientInfo)与病人信息操作日志(PatientInfoOperationLog),二者存在一对多的关系。
ORM映射配置中采用了级联,病人信息操作日志为被动插入操作。
在CreatePatientAction中采集病人信息的数据,并对病人信息执行显式的save。
这样看来,病人信息操作日志的信息与Action并没有什么关联,可以视为独立运作单元;而且,如果以后不打算采用这个日志的时候,可以修改配置直接修改或删除AOP和ORM映射配置就可以了。
前段时间考虑过spring是否可以注入方法,经过讨论发现是不可行的。这样我打算使用AOP,但我尝试了AOP配置,在没有传递参数的情况下,可以正常执行通知。但我需要配置2个对象之间的关系,不得不传入病人信息作为参数来完成任务,但不知道怎么配置这个参数。

我尝试过加入arg-names属性,但服务器启动时就报错,没加这个属性也会报错,因为通知调用的方法是有参数的。

而且还有个疑问,这个参数是否可以是一个已经实例化的引用?我需要的是这个引用,而不能是新创建的对象,因为这没有意义。

我的配置如下,这里是没有加arg-names属性:
aop:config



/aop:aspect
/aop:config

PatientInfoOpeLogPlugin类代码如下:

public void plugin(PatientInfo patientInfo){

log.setOperation(defaultOperation);
log.setOperateTime(this.now());
log.setOperator("admin");
log.setPatientInfo(patientInfo);
Set logSet= new HashSet ();
logSet.add(log);
patientInfo.setOperationLog(logSet);

}

服务器启动错误概要信息如下:
有没有配置arg-names的情况都一样:
…… Constructor threw exception; nested exception is java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut
……

[b]问题补充:[/b]
请一楼给个例子我试试,谢谢!
[b]问题补充:[/b]
[size=small][color=blue]三楼whistler的例子是标准例子。看后我考虑了一下,如果对Service类的相关方法进行拦截,确实可以达到我想要的结果,而且还可以不受Struts2的自带拦截器影响。其实,我原来的想法集中在如何让AOP拦截Action了,但后来经过查询资料和测试,发现无法达到,因为Struts2本身也对Action做了处理,与AOP的拦截发生了冲突。如果不拦截Action,就没有这个问题了。
谢谢你、谢谢大家的回复![/color][/size]

  • 写回答

5条回答 默认 最新

  • iteye_19131 2009-04-24 17:16
    关注

    public void plugin(PatientInfo patientInfo);作为一个前置通知执行,你可以绑定连接点(spring只能是方法)的参数。

    而作为连接点的patient.base.action.CreatePatientAction.execute(..)方法的参数应该是HttpServletRequest request, HttpServletResponse response等,并没有PatientInfo类型的参数,所以你是不可能从连接点的执行获得PatientInfo类型的对象。

    我想你的连接点应该是包含PatientInfo类型的参数的业务层类吧,而不是action的方法,
    楼上绑定参数的方法应该都是对的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面