java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list錯誤解決辦法
玩web的SSH總會有些令你意想不到的exception,這裡其中有很多事自己不小心,或者馬虎所造成。因此,解決的方案會各有不同,別人出現的異常解決方案對你的可能無效,就像上面的我報的異常一樣,百度了很多很多次,給我的答案無非就是在aop上加上一句,但是非常抱歉,我加上去無效!所以還是那句話,對於自己的異常,還是要自己解決。
首先說明一下,我這次的練習的ssh結構和異常所報的原因。
用的框架式struts2.2+hibernate4.2+spring4.0,容器室tomcat7.0.在Action中,我寫了一個基類BaseAction,繼承了ActionSupport,實現了ModelDriven接口,代碼如下:
----------@Component@Transactional----------public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T> { private static final long serialVersionUID = 2719688501307297741L; @Resource(name = "roleServiceImpl") protected RoleService roleService; @Resource(name = "departmentService") protected DepartmentService departmentService; @Resource(name = "userService") protected UserService userService; protected T model; public BaseAction() { ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass(); @SuppressWarnings("unchecked") Class<T> clazz = (Class<T>) pt.getActualTypeArguments()[0]; try { model = clazz.newInstance(); } catch (Exception e) { throw new RuntimeException(e); } } public T getModel() { return model ; }}這樣做的好處是,每個組件對應的Action中只需要告訴BaseAction自己要實現的泛型,然後只需要完成自己的邏輯。對於每個Action要實現ActionSupport來講,這是一項基本的且容易想到的方案。
然後,在每個Action中調用service組件實現自己的功能,在每個Action中都使用了@Component(“departmentAction”),@Scope(“prototype”)註解,但是練習一測試,就會出現Java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list()異常,檢查之後發現,原因是:
BaseAction是抽象的,在上面加了@Transactional是沒有意義的,
而@Transactional就是有spring管理,spring管理的對像要生成代理,而對於一個抽象的類,是不能被new成對象的,只有一個抽像類的具體實現類才有可能是被spring代理。
所以,去掉BaseAction上面的@Transactional,就是本題的原因了。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!