如果一个Remoting的service实现了某接口,并且有@Transactional的标注,那么客户端在调用服务器方法的时候很可能报找不到方法的错误。这是因为@Transactional默认使用jdk的动态代理,red5寻找方法的时候去找接口声明的方法。如果该方法没在接口中声明,自然就找不到。
要解决这个问题比较直接的方法是在接口中声明。这样做会比较繁琐。所有Remoting方法都得在接口中声明。
另一种方法是强制使用CGLib代理,这只需要简单配置即可,不必修改代码。配置方法是在Spring配置文件中加上:
<aop:aspectj-autoproxy proxy-target-class="true" /> <!-- 使用annotation定义事务 --> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />