日期:2014-05-17  浏览次数:20794 次

请教:为什么我定义切面之后,注入失败了(spring)
框架是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了。
最近在学习搭框架,所以程序的层次并不严谨,上面这些是在尝试做数据库事务处理时发生的。下一楼我会尽量贴出全部代码。

------解决方案--------------------
你的 切面 没有注入 数据源 或 都说是 sessionFactory
<bean id="transactionManager" class="这里是Hibernate的transactionManager工厂类 (至于怎么写我网忘了 好久没用了)">
<tx:advice id="txAdvice" transaction-manager="transactionManager">
------解决方案--------------------
<tx:advice id="txAdvice" transaction-manager="transactionManager">
 <tx:attributes>
 <tx:method name="execute" propagation="REQUIRED"/>
 </tx:attributes>
 </tx:advice>
------解决方案--------------------
<aop:config>加上如下属性,试试:

<aop:config proxy-target-class="true">


------解决方案--------------------
值栈中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是否整合正确啊
------解决方案--------------------
一看就是execution(* *..Action.execute())这个有问题。
------解决方案--------------------
引用:
百度上查了很久,也没有找到action必须使用cglib代理,否则无法注入的问题呢,有没有哪位大神能够解释一下?

使用jdk动态代理的前提是受代理目标对象至少要实现一个接口,如果没有实现任何接口,就得用cglib了