【发布时间】:2020-10-17 09:10:41
【问题描述】:
在某些情况下:
组件需要根据当前环境做逻辑。由于无法手动设置环境,很多 @Properties 注释将不起作用 - 设置属性文件不够灵活,无法满足我们的需求。但是,当我尝试将环境细节拉入我的组件类时,似乎没有任何效果!示例使它看起来很简单,但我的总是返回 null。我是否会在 Spring 的底层遗漏一些会导致这种情况的东西?这是我尝试过的:
使用资源,它的日志:
@Component
@Slf4j
public class compClass {
@Resource
private Environment env;
public void map(DtoObj dto){
log.info("RUN PROFILE IS: {}", env.getActiveProfiles());
}
}
java.lang.NullPointerException: null
at com.demo.Com.map(CompClass.java:22) ~[classes/:na]
使用 Autowire,它的日志:
@Component
@Slf4j
public class CompClass {
@Autowired
private Environment env;
public void map(DtoObj dto){
log.info("RUN PROFILE IS: {}", env.getActiveProfiles());
}
}
java.lang.NullPointerException: null
at com.demo.Com.map(CompClass.java:22) ~[classes/:na]
@Value 与环境及其日志:
@Component
@Slf4j
public class CompClass {
@Value("#{environment.activeProfiles}")
private String[] profiles;
public void map(DtoObj dto){
log.info("RUN PROFILE IS: {}", profiles);
}
}
RUN PROFILE IS: null
带有属性路径的@Value 和它的日志
@Component
@Slf4j
public class CompClass {
@Value("${spring.profiles.active}")
private String[] profiles;
public void map(DtoObj dto){
log.info("RUN PROFILE IS: {}", profiles);
}
}
RUN PROFILE IS: null
这是我可以在 java/main/resources 下共享的属性:
spring:
application:
name: namnam
profiles:
active: dev
我正在使用这个 VM 在 IntelliJ 上运行它:
-Dspring.profiles.active=dev
我的属性文件位于 java/main/resources 目录中,我们可以在代码中使用它的其他属性。我搞砸了怎么办?
【问题讨论】:
-
你能显示
properties文件吗?而且我仍然没有得到您的问题,您的意思是profiles始终为 null 而env.getActiveProfiles()为 null ?你也可以添加日志 -
是的,我已经根据您要求的编辑更新了我的 OP。这是更具描述性的吗?我所做的调用总是返回 null,因此尝试对这些 null 使用方法会抛出 NullPointerException(正如人们所期望的那样)。
-
您的第二种方法
AutowiredEnvironment对我来说看起来不错,而且我还看到Environment为空,所以这意味着您在使用compClass类时做错了一些地方,如果可能的话,你能显示代码你是如何调用compClass类方法或将compClass注入另一个bean -
不幸的是,我在不违反某些协议的情况下分享了我可以使用的代码的范围。这个 CompClass 是一个映射器。控制器调用读取、处理、写入的批处理作业。那个批处理作业就是bean。在流程步骤中,我们的处理器类接触到一个映射器 - 我们的映射器在这里 :) 我是否在 spring 上下文之外太远以至于环境没有任何值?
-
哦,亲爱的 - 在我的配置中,我有用于批处理作业的 bean、我的项目阅读器和我的项目映射器(不同的映射器,而不是我们的映射器),但没有我的处理器。我想知道为我的批处理配置类添加处理器 bean 是否有帮助?
标签: java spring spring-boot environment-variables