奇怪的找不到类SpringNamingPolicy的错误

以下是错误堆栈的一部分:

Caused by: java.lang.NoClassDefFoundError: org/springframework/cglib/core/SpringNamingPolicy
    at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:188)
    at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:109)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:447)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:333)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:293)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:421)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1558)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
    ... 45 more
Caused by: java.lang.ClassNotFoundException: org.springframework.cglib.core.SpringNamingPolicy
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

能看出来,主要的异常信息就是:

java.lang.ClassNotFoundException: org.springframework.cglib.core.SpringNamingPolicy

实际上,这个类能够在spring-core包里面看到,有绝对是有的。对于这种情况,我们一般想到的应该是,存在多个版本包,但是,我遇到的不是这种情况,查看了maven依赖、查看了打包后的lib目录、清理了tomcat工作空间。

我遇到的问题原因是:定义的service层bean的一个方法添加了Transactional注解,但是这个bean没有实现任何接口,只是一个普通的class,定义如下:

@Service
public class MutiTxServiceImpl3 {
    @Transactional
    public void dosth(){

    }
}

问题也就在这里,一般来说我们是要定义接口、定义实体bean同时实现接口,也就是下面这种方式:

@Service
public class MutiTxServiceImpl3 implements IMutiTxService{
    @Transactional
    public void dosth(){

    }
}

如果是采用的第二种样式,也就是实现接口的样式就不会出现找不到SpringNamingPolicy的问题了。应该是spring强制要求必须定义接口、依赖接口的一种限制吧(有机会一定去看下这段源码)。

最后,可能有看到的朋友会说,博主太菜,居然不知道要定义接口、不知道基本的依赖反转原则。其实不是的,大家估计都有针对某个东西写实验程序的时候,在写实验程序的时候大家就有可能会想着省事,偷下懒,这时候如果遇到了同样的问题,那也是相当郁闷和伤脑筋的。这个问题大概花掉了我3个小时的时间[无奈脸]

你可能感兴趣的:(理清spring,spring,找不到类,名策略,编译错误)