问题标签 [spring-environment]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
948 浏览

java - Spring 3.1 中的属性占位符继承

我正在尝试使用 Spring 的新Environment支持移植我们的自定义属性占位符,但我不知道如何获得我们当前的占位符魔法。

我想要的是从类路径中读取一组默认的属性文件,然后让这些属性被其他地方的一堆属性文件覆盖(覆盖)。我不希望所有属性都只替换在另一组文件中设置的属性。

在 Spring 3.1 之前

现在 ConfigResourcesFactoryBean 只是一个神奇的 FactoryBean,它可以找到要提供给占位符配置的资源列表:

现在 customConfig 可能设置为-DcustomConfig=file://blah/*.propertiesexport customConfig=file://blah/*.properties

目录中的属性blah仅覆盖classpath*:META-INF/spring/*.properties. 因此,Resource[]从工厂返回的将是一个 union ,分别classpath*:META-INF/spring*.properties跟随file://blah/*.properties

现在它出现了,而不是我的Resource[]工厂,我可以进行自定义PropertySources并将其连接到 PlaceholderConfig 中,但这似乎与上述相比没有任何价值。

我不能使用ApplicationContextInitializer,因为我发誓它只适用于 Servlet 环境,因此不适用于集成测试(我不想在我的每一个单元测试上添加一个注释来告诉它什么时候我可以只是像以前一样设置系统属性)。

如何使用自定义源覆盖来自硬编码源的属性,而不必覆盖/实现一堆类?

0 投票
1 回答
211 浏览

spring - PropertiesPlaceholderConfigurer 子类可以检测到活动的 Spring 配置文件吗?

我们的配置文件有一个特定的格式,而不是有多个文件 - 即 dev.properties、uat.properties、prod.properties - 我们将所有值放在一个文件中,但每个环境用前缀分隔。例如:

服务端口=9800

DEV_SERVICE_PORT=7800

UAT_SERVICE_PORT=6600

我们有一个现有的类(PropertyPlaceholderConfigurer 的子类)查找这些值,并根据它正在执行的 IP 地址决定在 resolvePlaceHolder() 中添加什么前缀,即对于某个 IP 范围,使用 DEV_ 前缀,对于另一个,使用 UAT_ 前缀。然后这些值被传递给其他 bean,在某些情况下使用上下文 xml,在某些情况下使用某些 bean 构造函数上的 @Value${} 注释。前缀的使用是透明的,因此所有其他配置都将使用 SERVICE_PORT(在示例中)

我们想改变这一点,以便我们只检测活动的 Spring Profile 而不是使用 IP。我们的 web.xml 中有一个自定义的 ApplicationContextIniitalizer,它检测指示我们环境类型的 java System 属性。

我遇到的问题是,在调用 resolvePlaceHolder() 时,似乎还没有任何活动配置文件!我正在做的检测活动配置文件是:

  1. 创建一个 StandardEnvironment 的实例
  2. 调用 getActiveProfiles()

(2) 似乎总是返回一个空数组。这意味着属性占位符解析发生在任何 Spring 配置文件被激活之前。这个对吗??

何时设置活动配置文件,与 Spring 上下文加载期间的其他事件相关,如创建 bean、加载属性文件等?

是否可以在调用 resolvePlaceHolder() 时检测到活动配置文件?我应该扩展另一个类吗?

0 投票
2 回答
15658 浏览

java - 在xml中定义Spring @PropertySource 并在Environment中使用

在 Spring JavaConfig 中,我可以定义属性源并注入 Environment

如果在 xml 中,我该怎么做?我正在使用 context:property-placeholder,并在 JavaConfig 类 @ImportResource 上导入 xml。但我无法使用 environment.getProperty("xx") 检索属性文件中定义的属性

0 投票
1 回答
389 浏览

spring - Spring 3.1 Envirionment 和 PropertySource 的基本用法

我想在启动时将属性值注入 Spring 上下文。我正在尝试使用 Spring 3.1 的新 Environment 和 PropertySource 功能来做到这一点。

在加载 Spring 上下文的类中,我定义了自己的 PropertySource 类,如下所示:

然后,我将此属性源添加到应用程序上下文:

在我的一个 bean 中,我尝试访问属性值:

bur 收到以下错误:

java.lang.IllegalArgumentException:原因:java.lang.IllegalArgumentException:无法解析字符串值 [${region}] 中的占位符“区域”

任何帮助是极大的赞赏

0 投票
1 回答
2299 浏览

java - 暴露Spring 环境的属性

我有一个属性文件,我使用以下property-placeholder元素通过 XML 向 Spring 注册:

我可以使用@Value注释访问属性,例如

但我还需要通过 Spring Environment 访问属性,例如

getValue()这里总是返回null,即使是在属性文件中定义的键,因为似乎 using<property-placeholder>不会将属性暴露给环境。有没有办法强制以这种方式加载的属性可以通过环境访问?

0 投票
3 回答
4800 浏览

spring - 为开发和部署加载不同的属性

我有一个非常常见的用例——当我的程序处于开发模式、测试模式或部署模式时连接到不同的数据库。

我现在这样做的方式是配置数据源,并通过 bean:property 标记传递 ${...} 属性。

但是要获得 ${...},我正在做

在 xml 配置的底部,我有

这似乎效率低下、过于冗长且容易出错。所有弹簧属性教程都告诉我 context:property-placeholder 是环境感知的,而 Environment 负责配置文件,那么我该如何简化呢?对我来说很直观,有一种更简单的方法,我就是想不通。

真的,我正在寻找的是在 context:properties-placeholder 或类似的东西上指定配置文件。

0 投票
1 回答
1023 浏览

java - 用于多种环境的 log4j 模板文件

我希望有一个单一的 WAR 文件,它可以在不同的环境(如 dev、ci 和 prod)中工作,而 spring 环境在很大程度上迎合了我们的用例。每个环境的 log4j 是突出的项目之一。正如其他答案中所建议的那样,我们可以为每个环境配置一个 log4j - 但是每个环境的文件中有很多重复,唯一不同的是次要属性,如 SMTPAppender 的 toAddress 等。是有一种简单的方法可以使用类似模板的 log4j 配置文件并在运行时替换每个环境的不同部分?Maven 在这里不起作用,因为它会导致编译时选择。

我能想到的一种解决方案是扩展 Log4jConfigurer 以读取一些环境变量,即。模板键值对的映射,并将模板文件中的模板变量替换为实际值,然后再将其传递给 DOMConfigurator。只是想检查是否有更简单的方法可以做到这一点,或者从最佳实践的角度来看我是否在吠叫错误的树。

提前致谢!

0 投票
1 回答
1335 浏览

java - Spring 适用于多种环境的最佳方法

我有以下内容:

  • 系统 A - 授权 (REST API)
  • 系统 B - 需要检查身份验证
  • 系统 C - 需要检查身份验证
  • 系统 D - 需要检查身份验证

我有很多环境:

  • 发展
  • 同系物
  • 生产

每个都有不同的 URL System A。所以我想创建一个项目来整合这些系统。由于所有系统都使用 Jersey 和 Spring,我可以创建一个过滤器(jersey),以在用户未获得授权的情况下中止请求。

所以我们的想法是创建Integration System一个带有 Jerseys 过滤器的 JAR,并使用父配置(来自 Spring 的活动配置文件)来获取正确的 URL。如果我能做到这一点,我什至可以使用这个 JAR 让系统 B也与系统 D通信。

诀窍是,让这个 JAR 基于环境(在父项目上设置)获得正确的 .properties 文件。老实说,我不知道从哪里开始。

阅读 Spring Environment 的文档我发现:

如果更简单的方法可以完成工作,请不要使用配置文件。如果配置文件之间唯一变化的是属性的值,那么 Spring 现有的 PropertyPlaceholderConfigurer / 可能就是您所需要的。

我可以有 3 个不同的属性文件(开发、同源或生产),或者我可以有一个具有不同键的属性文件:

最好的方法是什么?你会怎么做?

0 投票
2 回答
2108 浏览

java - 获取 Spring 环境作为属性

我想知道是否有办法以 Properties 实例的形式从 Spring Environment 中提取属性(例如从 ApplicationContext 中获取)?或者,至少,有没有办法枚举 Spring Environment 中的属性,或者将它们全部作为地图,或者我可以将 [最初未知的] 一组属性转换为 Properties 对象的任何其他方式?

我需要这个才能Context通过调用org.jclouds.ContextBuilder.newBuilder()和创建 jclouds .overrides(Properties)。这个想法是仅通过 .properties 文件配置实际的云提供商,我不想将应用程序逻辑与提供商特定的属性结合起来。

[更新]

要使用的 .properties 文件是使用 配置的<context:property-placeholder>,它实际上指定了一个路径列表,如下所示:

这表明在提到的位置列表中按顺序搜索 .properties 文件。我想实现以下目标:

  • 仅在此 XML 定义文件中保留 .properties 文件及其可能位置的列表;
  • 允许将 jclouds 相关属性放在XML 中提到的任何.properties 文件中;
  • 以 Properties 对象的形式访问由 Spring 解析和加载的属性,以便我能够将其提供给 jclouds ContextBuilder

请让我知道这一切是否可行。先感谢您!

-弗拉德

0 投票
2 回答
4031 浏览

spring-boot - Spring 环境 - 多个?

我对 Spring Environment 的工作方式感到困惑。我认为它基本上是一个单例 bean,ApplicationContext每当我加载PropertySources到我的 AppCtx 中时,它们都会自动组合成这个 Environment例。但是,我在我的应用程序中看到这个记录了很多次,这意味着构造函数AbstractEnvironment被多次调用:

结果是我做的事情如下:

我得到了 的实例Environment,但其中没有我期望存在的属性。

Environment当我将此 XML 添加到我的 Spring Boot 应用程序上下文时,我希望它们已添加到此自动连接中:

再说一次,有时Environment属性在那里,如此日志中所示:

注意:我在 Spring Boot 日志中也看到了 2 次:

我本来会在最后一次预料到这一点。也许这是相关的?我是否以某种方式ApplicationContext在我的 Spring Boot 应用程序中创建了多个 s?