请教:为什么我定义切面之后,注入失败了(spring)

猫+猫>猫猫 2013-05-22 12:33:49
框架是struts2+spring2.5+hibernate3.5
以下是定义切面之前的主要代码,运行是成功的
applicationContext.xml:
<bean id="menuAction" class="com.infoCmu.login.action.MenuAction">
<property name="userServer" ref="userServer"></property>
</bean>
java:
public class MenuAction extends ActionSupport {

private UserServer userServer;

public void setUserServer(UserServer userServer){
this.userServer = userServer;
}

public String execute(){
User userobj1 = new User();
userobj1.setUserid("aaa"+(int)Math.floor(Math.random()*1000));
userobj1.setPwd("pwd");
try{
userServer.setUserinfo(userobj1);
}catch(Exception e){
e.printStackTrace();
}
}
这个时候通过debug可以看到,userServer是获得对象的
然后在applicationContext.xml加入了如下切面:
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="execute" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>

<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* *..Action.execute())"/>
</aop:config>
这个时候再debug,上面的userServer就是null了。
最近在学习搭框架,所以程序的层次并不严谨,上面这些是在尝试做数据库事务处理时发生的。下一楼我会尽量贴出全部代码。
...全文
463 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
艾边城 2014-08-14
  • 打赏
  • 举报
回复
加包或者让serverxxx被代理类实现一个接口
dracularking 2013-05-26
  • 打赏
  • 举报
回复
引用 27 楼 weightman2008 的回复:
那为什么一定要在切面里加入<aop:config proxy-target-class="true">呢?我还实验了一下,加入了序列化的借口serialize,但是也不行。
这个配置就是指示使用cglib。 Serializable接口这个倒特别提及, 我查到是这么实现的,假设 SimplePojo implements Pojo ProxyFactory factory = new ProxyFactory(new SimplePojo()); factory.adddInterface(Pojo.class); factory.addAdvice(new RetryAdvice()); factory.setExposeProxy(true); Pojo pojo = (Pojo) factory.getProxy(); // this is a method call on the proxy! pojo.foo();
dracularking 2013-05-24
  • 打赏
  • 举报
回复
引用 25 楼 weightman2008 的回复:
百度上查了很久,也没有找到action必须使用cglib代理,否则无法注入的问题呢,有没有哪位大神能够解释一下?
使用jdk动态代理的前提是受代理目标对象至少要实现一个接口,如果没有实现任何接口,就得用cglib了
猫+猫>猫猫 2013-05-24
  • 打赏
  • 举报
回复
引用 26 楼 dracularking 的回复:
[quote=引用 25 楼 weightman2008 的回复:] 百度上查了很久,也没有找到action必须使用cglib代理,否则无法注入的问题呢,有没有哪位大神能够解释一下?
使用jdk动态代理的前提是受代理目标对象至少要实现一个接口,如果没有实现任何接口,就得用cglib了[/quote] 那为什么一定要在切面里加入<aop:config proxy-target-class="true">呢?我还实验了一下,加入了序列化的借口serialize,但是也不行。
猫+猫>猫猫 2013-05-23
  • 打赏
  • 举报
回复
引用 8 楼 ABCD_0000 的回复:
<aop:config>加上如下属性,试试:

<aop:config proxy-target-class="true">
果然是这个原因呢,加上这句话,事务处理切面就可以正常处理了,谢谢。 之前报错是因为缺少包,我以为是设定有问题,不好意思,但是切面如果定在server就不用这句话,下午再研究下。
猫+猫>猫猫 2013-05-23
  • 打赏
  • 举报
回复
谢谢各位的回复,我现在将事务处理定位在了server,经提示加入了cglib等包之后,在server层形成了事务。 我想也许是因为struts对action有限制所以无法设定切点吧。但我更期望能在action层形成事务,这个问题我回头再找找资料,如果大家还有好的想法,请继续回复。 我下午再研究下,晚上或者明天来结贴。再次感谢!
猫+猫>猫猫 2013-05-23
  • 打赏
  • 举报
回复
百度上查了很久,也没有找到action必须使用cglib代理,否则无法注入的问题呢,有没有哪位大神能够解释一下?
  • 打赏
  • 举报
回复
还是好好看看aop里面的几个概念再写配置吧
白开水MD5 2013-05-23
  • 打赏
  • 举报
回复
execution(* com.infoCmu.login.action.MenuAction.execute(..))是不是少了2点啊
白开水MD5 2013-05-23
  • 打赏
  • 举报
回复
引用 6 楼 weightman2008 的回复:
4(5)楼的朋友,谢谢你的回答。 但是transaction-manager的默认值就是"transactionManager",所以不用特别设定。
这个还不知道呢,学习了
猫+猫>猫猫 2013-05-23
  • 打赏
  • 举报
回复
引用 14 楼 fangmingshijie 的回复:
改为"execution(* com.infoCmu.Action.*.*(..))" 根据你具体包名写
已经改成如下内容,还是一样的: <tx:advice id="txAdvice"> <tx:attributes> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.infoCmu.login.action.MenuAction.execute())"/> </aop:config>
dracularking 2013-05-23
  • 打赏
  • 举报
回复
引用 15 楼 weightman2008 的回复:
加上这个属性启动就报错了。所以应该不是这个的问题。 Caused by: org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.
没必要强制aop使用cglib代理,jdk动态代理没有报出错误
  • 打赏
  • 举报
回复
execution(* com.accp.biz.impl.*(这个*代表你的类).*(这个*代表你类中的方法)(..(括号中的两点代表你方法中的参数)))
dracularking 2013-05-23
  • 打赏
  • 举报
回复
引用 13 楼 weightman2008 的回复:
[quote=引用 11 楼 fangmingshijie 的回复:] 一看就是execution(* *..Action.execute())这个有问题。
切点的声明我确实有点迷糊。能不能详细点,最好根据我现在的程序,帮我写一下声明?多谢。[/quote] 确实有可能是切点的声明错误导致其后无法注入,Action应该无法代表MenuAction,这个查一下就知道了 即使先暂时换成MenuAction用来测试
猫+猫>猫猫 2013-05-23
  • 打赏
  • 举报
回复
引用 8 楼 ABCD_0000 的回复:
<aop:config>加上如下属性,试试:

<aop:config proxy-target-class="true">
加上这个属性启动就报错了。所以应该不是这个的问题。 Caused by: org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.
  • 打赏
  • 举报
回复
改为"execution(* com.infoCmu.Action.*.*(..))" 根据你具体包名写
猫+猫>猫猫 2013-05-23
  • 打赏
  • 举报
回复
引用 11 楼 fangmingshijie 的回复:
一看就是execution(* *..Action.execute())这个有问题。
切点的声明我确实有点迷糊。能不能详细点,最好根据我现在的程序,帮我写一下声明?多谢。
猫+猫>猫猫 2013-05-23
  • 打赏
  • 举报
回复
引用 9 楼 qiangan7788 的回复:
值栈中userserver为null说明,userserver没注入进去啊。看看你的spring和struts2是否正确整合,另外在你的代码中, <class name="com.infoCmu.obj.User" table="user" catalog="infocmu"> 和<property name="url" value="jdbc:mysql://localhost:3306/infocum"></property>两个数据库的名字不一样。关键是你的spring和你的struts2是否整合正确啊
只要不加事务处理的切面,程序就是可以的。另外感谢你仔细看了我的程序,才能发现infocum这种细微的地方。我数据库的名字起错了,但是因为是练习,所以懒得改了。改完之后,还是不行,一样的问题。
  • 打赏
  • 举报
回复
一看就是execution(* *..Action.execute())这个有问题。
小丑哥_V5 2013-05-23
  • 打赏
  • 举报
回复
到我的博客下载那个开源项目看看, 基于spring整合的,里面有事务可以参考下做法
加载更多回复(9)

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧