我有一个非常简单的配置和一个很大的困惑,需要我解决。
我有一个用@RestController
注释的BaseController。在此类中,我有一个返回String并用@GetMapping
注释的方法。我正在从中读取属性文件并显示应用程序值。直到这里,所有作品都很好。以下是我的文件,
@RestController
public class BaseController {
@Autowired
Environment env;
@GetMapping("/hello")
public String hello() {
String myAppName = env.getProperty("spring.application.name");
return "From Controller -> " + myAppName;
}
}
我的application.properties
文件
server.servlet.context-path=/BootEnv
server.port=8085
spring.application.name=EnvironmentAPITester
当我点击时,
,我得到如下正确答复,
From Controller -> EnvironmentAPITester
在代码中,环境变量为 org.springframework.core.env.Environment ;
直到这里一切都很好。
现在,我创建了一个名为@Configuration
的新ApplicationConfig
类。我也想从该类读取属性文件并返回值。所以下面是我所做的更改,
@RestController
public class BaseController {
@Autowired
Environment env;
@GetMapping("/hello")
public String hello() {
String myAppName = env.getProperty("spring.application.name");
return "From Controller -> " + myAppName;
}
@GetMapping("/helloConf")
public String getDetails() {
ApplicationConfig conf = new ApplicationConfig();
String fromConfig = conf.details();
return "From Config -> "+fromConfig;
}
}
以及下面的课程
@Configuration
public class ApplicationConfig{
@Autowired
Environment env;
public String details() {
return env.getProperty("spring.application.name");
}
}
现在当我按下时,
我得到一个空指针异常,因为Environment
变量为空并且没有自动配置。怎么样?为什么?
谷歌搜索后,我想到了一个解决方案,要求我实现EnvironmentAware
接口并以这种方式设置Environment
变量。因此,下面是我必须对ApplicationConfig
类进行的更改,
@Configuration
public class ApplicationConfig implements EnvironmentAware{
@Autowired
Environment env;
public String details() {
return env.getProperty("spring.application.name");
}
@Override
public void setEnvironment(Environment environment) {
this.env = environment;
}
}
在完成此操作之后,对于相同的Environment
变量值,它仍然给了我空指针异常。然后,我发现不仅必须删除@Autowire
批注,而且我还需要使该变量static
起作用。所以当我这样做时,
//@Autowired
static Environment env;
它完美地工作。当我点击时,
我得到适当的答复,
From Config -> EnvironmentAPITester
困惑是为什么我需要将其设置为static
才能填充值?为什么EnvironmentAware
实现在Environment
不变的情况下仍无法设置@Autowired
变量?
为什么首先在类@Autowired
被标记为Environment
的情况下,ApplicationConfig
没有填充@Configuration
变量?即使我将此类注释更改为@Service
或@Repository
或@Component
,同样的问题仍然存在,未能@Autowire
Environment
变量失败。怎么会来?
我知道这是一篇很长的文章。但是,对此的任何澄清都值得赞赏,因为我很难理解这一点。
谢谢您的帮助。