如何避免 BeanCreationException:无法自动装配字段错误
How to avoid BeanCreationException: Could not autowire field error
我有以下 spring 具有不同配置文件的测试配置:
@Configuration
@ComponentScan (value = {"uk.co.test.ws" })
public class SpringTestConfig
{
@Profile( "local")
@PropertySource( "classpath:/config/local/settings.properties" )
public static class SpringTestConfigLocal
{
@Autowired
private Environment environment ;
@Bean(name= "baseUrl" )
public String setBaseUrl()
{
return environment .getRequiredProperty("baseurl.protocol" )+"://" +environment .getRequiredProperty( "baseurl.host");
}
}
然后创建了一个包含基数 url
的基数 class
> @RunWith (SpringJUnit4ClassRunner. class) @ContextConfiguration
> (classes = { SpringTestConfig. class }) public class BaseWsTest {
> @Autowired
> String baseUrl;
然后扩展到其他测试 classes,如下所示:
public class SampleFTest extends BaseWsTest
{
@Test
public void hello() throws FileNotFoundException, Exception
{
System. out .println("base url: " + baseUrl );
当 运行 使用正常的 maven clean install 时,测试有效,但如果我要 运行 通过右键单击该方法,它会得到一个
Error creating bean with name 'uk.co.test.ws.service.base.SampleFTest': Injection of autowired dependencies failed;
您忘记在 SampleFTest
class 中选择配置文件,您应该添加此行:
@ActiveProfiles(profiles = "local")
这样 SpringTestConfigLocal
将被初始化并且 baseUrl
bean 可用
编辑:我会在 .properties
文件中添加一个 属性,这样我就可以使用变量 myprofile:
@ActiveProfiles(profiles = "${myprofile}")
最后,如果您不想不时更改该值,我会应用一些逻辑来加载一个 属性 文件或另一个文件。
编辑 2:对不起,但这不起作用,因为文件是在注释 EL 值分配后加载的,但您可以添加:
spring.profiles.active=local
到 属性 文件,这与放置注释 @IntegrationTest("local")
的效果相同。这是我试过的代码:
@TestPropertySource(value="classpath:/config/test.properties")//, properties={"myaddress=cane", "myprofile=local"})
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest("${myaddress}")
//@ContextConfiguration
//@ActiveProfiles(profiles = "${myprofile}")
public class BasicJUnitTest{
protected Logger logger;
protected MockMvc mockMvc;
@Autowired
private Environment env;
@Value("${myaddress}" )
String myval;
public BasicJUnitTest(){
this.logger = LoggerFactory.getLogger(this.getClass());
}
@Test
public void test(){
logger.info("hola"+myval+ " " + env.getActiveProfiles()[0]);
}
}
我有以下 spring 具有不同配置文件的测试配置:
@Configuration
@ComponentScan (value = {"uk.co.test.ws" })
public class SpringTestConfig
{
@Profile( "local")
@PropertySource( "classpath:/config/local/settings.properties" )
public static class SpringTestConfigLocal
{
@Autowired
private Environment environment ;
@Bean(name= "baseUrl" )
public String setBaseUrl()
{
return environment .getRequiredProperty("baseurl.protocol" )+"://" +environment .getRequiredProperty( "baseurl.host");
}
}
然后创建了一个包含基数 url
的基数 class> @RunWith (SpringJUnit4ClassRunner. class) @ContextConfiguration
> (classes = { SpringTestConfig. class }) public class BaseWsTest {
> @Autowired
> String baseUrl;
然后扩展到其他测试 classes,如下所示:
public class SampleFTest extends BaseWsTest
{
@Test
public void hello() throws FileNotFoundException, Exception
{
System. out .println("base url: " + baseUrl );
当 运行 使用正常的 maven clean install 时,测试有效,但如果我要 运行 通过右键单击该方法,它会得到一个
Error creating bean with name 'uk.co.test.ws.service.base.SampleFTest': Injection of autowired dependencies failed;
您忘记在 SampleFTest
class 中选择配置文件,您应该添加此行:
@ActiveProfiles(profiles = "local")
这样 SpringTestConfigLocal
将被初始化并且 baseUrl
bean 可用
编辑:我会在 .properties
文件中添加一个 属性,这样我就可以使用变量 myprofile:
@ActiveProfiles(profiles = "${myprofile}")
最后,如果您不想不时更改该值,我会应用一些逻辑来加载一个 属性 文件或另一个文件。
编辑 2:对不起,但这不起作用,因为文件是在注释 EL 值分配后加载的,但您可以添加:
spring.profiles.active=local
到 属性 文件,这与放置注释 @IntegrationTest("local")
的效果相同。这是我试过的代码:
@TestPropertySource(value="classpath:/config/test.properties")//, properties={"myaddress=cane", "myprofile=local"})
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest("${myaddress}")
//@ContextConfiguration
//@ActiveProfiles(profiles = "${myprofile}")
public class BasicJUnitTest{
protected Logger logger;
protected MockMvc mockMvc;
@Autowired
private Environment env;
@Value("${myaddress}" )
String myval;
public BasicJUnitTest(){
this.logger = LoggerFactory.getLogger(this.getClass());
}
@Test
public void test(){
logger.info("hola"+myval+ " " + env.getActiveProfiles()[0]);
}
}