Spring5+Hibernate环境下用Log4j记录Dao方法时AOP配置异常求助
解决Spring AOP调用Dao方法时的
object is not an instance of declaring class异常 这个异常的核心问题一眼就能看穿:你居然在**Produit实体对象**上去调用IDao接口的addProduit方法——这就像拿个苹果当锤子用,肯定行不通啊!
为什么会踩这个坑?
大概率是下面几个场景中的一个:
- AOP切点范围写错了:你的日志切面(或者其他AOP逻辑)错误地把
tp.entity.Produit类纳入了拦截范围,Spring给实体类生成了代理,但你误把这个代理当成了IDao的实例来调用方法。 - 依赖注入搞混了:在某个需要注入
IDao的地方(比如Service类),你错误地注入了Produit对象,然后去调用它的addProduit方法——完全是对象类型不匹配。 - Bean配置错误:不管是XML还是注解配置,你把
Produit实体类当成了IDao的实现类来注册成Spring Bean,导致注入的时候拿到的是实体而不是Dao实现。
一步步排查解决
检查AOP切点表达式
如果你用注解式AOP,看看你的切点定义是不是范围太广或者路径错误。比如:
错误示例(会拦截所有tp包下的类,包括实体):@Pointcut("execution(* tp..*(..))") public void daoLogPointcut() {}正确写法(只拦截Dao层的方法):
@Pointcut("execution(* tp.dao.*.*(..))") public void daoLogPointcut() {}如果是XML配置的AOP,同样检查
<aop:pointcut>的expression属性,确保只针对Dao层。核对依赖注入的代码
找到你调用addProduit方法的地方,看看注入的对象类型:
错误示例:@Autowired private Produit produit; // 注入了实体类,不是Dao public void addProduit(Produit p) { produit.addProduit(p); // 这里必然报错! }正确写法:
@Autowired private IDao produitDao; // 注入Dao接口的实现类 public void addProduit(Produit p) { produitDao.addProduit(p); // 这才是正确的调用方式 }检查Spring Bean的配置
- 如果用注解:确保
@Repository注解是标注在IDao的实现类(比如ProduitDaoImpl)上,而不是Produit实体类上。 - 如果用XML:检查
<bean>标签,确保Dao对应的bean是实现类,比如:<!-- 正确的Dao Bean配置 --> <bean id="produitDao" class="tp.dao.impl.ProduitDaoImpl"/> <!-- 错误示例:把实体类当成Dao注册 --> <!-- <bean id="produitDao" class="tp.entity.Produit"/> -->
- 如果用注解:确保
验证对象类型
可以在调用方法前打印对象的类型,确认是不是拿到了错误的实例:System.out.println(produitDao.getClass());如果输出的是
tp.entity.Produit或者包含Produit的代理类,那说明你拿到的确实是实体对象,需要回到前面的步骤排查。
内容的提问来源于stack exchange,提问作者TheLordOne
相关产品推荐
相关产品推荐

