1.报空指针异常
@SpringBootTest
public class BatchPushTaskTest {
@Autowired
BatchPushTask batchPushTask;
@Test
public void batchPush() {
batchPushTask.closePush();
}
}
代码如上,贴上报错信息:
java.lang.NullPointerException
at com.maple.tyboot.modular.system.task.BatchPushTaskTest.batchPush(BatchPushTaskTest.java:24)
空指针异常,说明我需要自动装配的这个类没有成功装配。可想而知,就没有进行spring的初始化,所以要加上注解让spring初始化完成。在这里我用的是junit4,所以在类头加上@RunWith(SpringJUnit4ClassRunner.class)
2.spring初始化
加上后还是报错,只是不报空指针异常了,报初始化错误。
java.lang.IllegalStateException: Found multiple @SpringBootConfiguration annotated classes [Generic bean: class [com.maple.tyboot.TybootApplication]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [D:\EB\wx-statistical-website\trunk\tyboot-admin\target\classes\com\maple\tyboot\TybootApplication.class], Generic bean: class [com.maple.tyboot.CoreAppConfig]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [D:\EB\wx-statistical-website\trunk\tyboot-core\target\classes\com\ebupt\tyboot\CoreAppConfig.class]]at org.springframework.util.Assert.state(Assert.java:94)
从错误信息中可以得到。这个错误是指spring无法正常初始化,因为扫描到多个 @SpringBootConfiguration注解。根据标红字体显示,一个是我这次测试要用到的主程序TybootApplication,另一个是CoreAppConfig。我的项目依赖图如下:有两个模块,都是子项目。这两个错误信息提出来的类分别是两个模块的主程序。
+------------------+
| Parent Project |
+------------------+
|
+----------|----------+
| |
+-----|-----+ +------|------+
| Subproject1| | Subproject2|
+------------+ +-------------+
所以要指定主程序,以让spring能够正确读取配置。加上注解@ContextConfiguration(classes = TybootApplication.class)
3.bean名字相同,无法注册
Cannot register bean definition [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=cn.stylefeng.roses.core.config.WebAutoConfiguration; factoryMethodName=error; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [cn/stylefeng/roses/core/config/WebAutoConfiguration.class]] for bean 'error': There is already [Generic bean: class [com.maple.tyboot.core.base.controller.TybootErrorView]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [D:\EB\wx-statistical-website\trunk\tyboot-core\target\classes\com\ebupt\tyboot\core\base\controller\TybootErrorView.class]] bound.
上一步加完以后,又有报错。不过报的错不太一样,这个是在注册bean的过程中发生的错误。可见好歹spring开始初始化了。
这个异常信息表明在注册一个名为 ‘error’ 的 Bean 定义时发生了冲突。根据异常信息,存在两个具有相同名称但类型不同的 Bean 定义:
-
第一个 Bean 定义是一个由名为
WebAutoConfiguration
的工厂类的方法error
创建的 Bean。这个 Bean 的类型是null
,可能是因为类型未正确设置或无法确定。 -
第二个 Bean 是一个类型为
com.ebupt.tyboot.core.base.controller.TybootErrorView
的自定义 Bean。它是一个单例 Bean,已经被注册到 IoC 容器中。
要解决这个问题,可以考虑以下几种方法:
1. 检查 `WebAutoConfiguration` 类中的 `error` 方法,确保正确设置了返回的 Bean 的类型。确保类型与 `com.ebupt.tyboot.core.base.controller.TybootErrorView` 不冲突。
2. 如果 `WebAutoConfiguration` 类是您自己定义的,可以尝试修改方法名,以避免与现有的 Bean 名称冲突。
3. 如果 `WebAutoConfiguration` 类是第三方库或框架提供的,您可以尝试在您的应用程序的配置中排除或禁用该自动配置类,以阻止该冲突的 Bean 注册。
4. 检查是否在其他地方使用了相同的名称 'error' 注册了其他 Bean。如果有,您可以尝试修改其中一个的名称,以确保它们不会冲突。
我的情况是第三种,所以我直接禁用这个类。也就是加了注解
@EnableAutoConfiguration(exclude = WebAutoConfiguration.class),最后终于成功运行。