问题所在的源码段如下所示,这是一个对DAO层的测试类,在第5行中对ProductCategoryRepository类无法进行注入,每一次DEBUG都是显示为NULL。
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProductCategoryRepositoryTest {
@Autowired
private ProductCategoryRepository repository;
@Test
public void findOneTest()
{
ProductCategory productCategory = repository.findOne( 1);
System.out.println(productCategory.toString());
}
}
1.首先来了解 @Autowired无法注入的原因:
-
@Autowired为自动装配,将对象自动注入到类中使用.
-
@Autowired注入有两个条件,被注入的类的对象交给了spring管理,同时使用的类的对象也要交给spring管理.两个条件都满足才能注入.
2.参照了网上的许多方法,包括了:
(1)将@SpringBootTest设置成@SpringBootTest(classes = SellApplication.class),把类交给spring管理的同时,添加classes属
性来添加springboot项目的启动类,这一点必不可少。
(2)测试类和被测试类的目录必须一样。
(3)测试类不能为springboot项目的启动类的上级,因为扫描时,会从启动类所在包以及其底层这样的顺序扫描,其上层包无法被扫描。
(4)在ProductCategoryRepository 类上加入注解@Repository,但是我的项目可以不加这个注解。
3.当所有方法都测试过之后依旧不行,怀疑是版本不兼容问题,因为我的springboot版本是1.5.3,maven版本是3.6.3,而我的JDK版本是13,所以需要对JDK进行降级,在这里JDK需要降级为1.7版,在idea中JDK的降级步骤是:
(1)下载JDK1.7版本:官方下载链接。
(2)安装JDK1.7,改计算机环境变量等:详细步骤。
(3)在idea的springboot项目中进行更改,需要改以下几个地方,缺一不可。完成后对pom.xml重新import,对整个项目rebuild就可以:
①setting中(打红框部分改成1.7或7即可):
②Project Structer中:(打红框部分改成1.7或7即可)
③更改pom.xml,添加如下代码:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
(4)此时,启动项目没有问题,但是运行测试方法时出现问题,因此此时需要相应的更改JUNIT配置,将原来的JUNIT5降为JUNIT4,不然模块test的时候,会出现错误“com/intellij/junit5/JUnit5IdeaTestRunner : Unsupported major.minor version 52.0”,过程为:JUNIT4配置过程,JUNIT4配置过程参考2。
(5)运行测试方法时候出现错误:springboot available: expected at least 1 bean which qualifies as autowire candidate。
解决方法:添加注解@SpringBootApplication
原因:@SpringBootApplication = (默认属性)@Configuration + @EnableAutoConfiguration + @ComponentScan。
①@Configuration的注解类标识这个类可以使用Spring IoC容器作为bean定义的来源。@Bean注解告诉Spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册为在Spring应用程序上下文中的bean。
②@EnableAutoConfiguration:能够自动配置spring的上下文,试图猜测和配置你想要的bean类,通常会自动根据你的类路径和你的bean定义自动配置。
③@ComponentScan:会自动扫描指定包下的全部标有@Component的类,并注册成bean,当然包括@Component下的子注解@Service,@Repository,@Controller。
4.至此,成功解决问题,可以正常进行注入。