先看简单的代码
一个 action类
package com.snail.quanzi.action;
@Scope("prototype")
@Controller("teiZiManager_tran")
public class TieZiManager_tran extends ActionSupport implements Preparable
{
private final static Logger logger = Logger
.getLogger(TieZiManager_tran.class);
private Integer zhuTiId;
private Integer quanZiId;
private Zhuti zhuti=new Zhuti();
@Transactional
(
rollbackFor={Exception.class},
propagation=Propagation.REQUIRED)
public String publishZhuTi()
{
return SUCCESS;
}
public String findSomething()
{
return SUCCESS;
}
@Resource(name = "baseDAO")
protected IBaseDAO baseDAO;
private HttpServletRequest request=null;
private HttpServletResponse response=null;
private HttpSession session=null ;
private Huiyuan huiyuan=null;
public void prepare() throws Exception
{
this.request = ServletActionContext.getRequest();
this.response=ServletActionContext.getResponse();
this.session=this.request.getSession(false);
this.huiyuan= (Huiyuan) session.getAttribute("User");
}
public void setBaseDAO(IBaseDAO baseDAO)
{
this.baseDAO = baseDAO;
}
public Integer getZhuTiId()
{
return zhuTiId;
}
public void setZhuTiId(Integer zhuTiId)
{
this.zhuTiId = zhuTiId;
}
public Zhuti getZhuti()
{
return zhuti;
}
public void setZhuti(Zhuti zhuti)
{
this.zhuti = zhuti;
}
public Integer getQuanZiId()
{
return quanZiId;
}
public void setQuanZiId(Integer quanZiId)
{
this.quanZiId = quanZiId;
}
}
上面代码有两个action :publishZhuti 和 findSomething .其中 publishZhuTi是有事务性的(通过spring注解事物,另外不要问我为什么在控制层加事务)。
此时当在通过findSomethong通过chain方式调用另一个action 会抛出ClassCastExcetion:package com.snail.quanzi.action.tieZiManager.
当时就怀疑是事物导致spring 采用cglib生成代理导致的问题。因为控制层 也就是action 无法使用动态代理
由于添加了事务导致spring 使用cglib为其生成代理。这样就出现了上面的错误。
可是内部机制是什么呢?
我这里的struts2 中使用的action都是交给spring管理的。既然spring生成了代理,那么交给struts的也应该是那个代理,也就是和原类没有关系了,那么为什么还会抛出这个异常呢?