我想编写一些检查已部署WAR的XML Spring配置的测试.不幸的是,某些bean需要设置一些环境变量或系统属性.在使用带有@ContextConfiguration的方便测试样式时,如何在初始化spring bean之前设置环境变量?
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext { ... }
Run Code Online (Sandbox Code Playgroud)
如果我使用注释配置应用程序上下文,我没有看到一个钩子,我可以在初始化spring上下文之前执行某些操作.
在 Spring MVC Web 应用程序中,我在配置文件中配置了一个 bean:
<bean class="com.callback.CallbackService"/>
Run Code Online (Sandbox Code Playgroud)
在服务类中,bean 被初始化如下:
@Autowired
CallbackService service
Run Code Online (Sandbox Code Playgroud)
上面显示的 CallbackService 通过进行以下三个调用来获取其连接属性(目前无法更改):
System.getProperty("user");
System.getProperty("password");
System.getProperty("connectionURL");
Run Code Online (Sandbox Code Playgroud)
声明 CallbackService 实例的服务类可以通过读取属性文件来访问上述三个值,如下所示:
@Value("${user}")
protected String userName;
@Value("${password}")
protected String password;
@Value("${connection}")
protected String connectionString;
Run Code Online (Sandbox Code Playgroud)
为 CallbackService 设置属性所需的只是设置系统属性(在它们初始化之后),如下所示:
System.setProperty("user", userName);
System.setProperty("password", password);
System.setProperty("connectionURL", connectionString);
Run Code Online (Sandbox Code Playgroud)
然而,我遇到的问题是对象初始化的顺序。属性正在初始化,但看起来 System.setProperty 调用发生在 Spring 从属性文件中准备好它们之前。
我尝试了几种解决方案,但似乎 CallbackService 对象在从属性文件中读取值并调用 System.setProperty 之前实例化。
最终会读取属性文件,因为如果我从 @Controller 方法之一访问它们,我可以看到这些值。问题在于初始化属性和初始化 CallbackService 实例的点。
经过几个小时的谷歌搜索,我尝试了以下解决方案,但似乎没有一个在 CallbackService 实例的初始化/实例化之前填充系统属性
InitiazingBean在afterPropertiesSet()方法中实现和设置系统属性
。ApplicationListener在onApplicationEvent()方法中实现和设置系统属性。lazy-init=trueXML 中 CallbackService bean 定义的设置。我从我的Java应用程序连接到SSL over SSL.我已将MYSQL配置为支持SSL并生成客户端证书.我已将服务器CA证书和客户端证书导入密钥库.这就是我的代码目前的样子
String url = "jdbc:mysql://127.0.0.1:3306/MySampleDb? verifyServerCertificate =true&useSSL=true&requireSSL=true"
System.setProperty("javax.net.ssl.keyStore","/home/cert/keystore");
System.setProperty("javax.net.ssl.keyStorePassword","password");
System.setProperty("javax.net.ssl.trustStore","/home/cert/truststore");
System.setProperty("javax.net.ssl.trustStorePassword","password");
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(url, user, password);
Run Code Online (Sandbox Code Playgroud)
我想使用带有C3p0的spring通过SSL连接到MYSQL.这是我的spring配置文件,它从jdbc.properties读取参数.
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
........
</bean>
Run Code Online (Sandbox Code Playgroud)
如何配置spring来设置属性
verifyServerCertificate = true
useSSL = true
requireSSL = true"
还可以在spring配置文件中设置keyStore和trustStore值.
根据这个答案,您可以使用 Spring Batch 类org.springframework.batch.support.SystemPropertyInitializer在 Spring Context 启动期间设置系统属性。
特别是,我希望能够使用它来设置,ENVIRONMENT因为 Spring Batch 配置的一部分如下:
<bean id="placeholderProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:/org/springframework/batch/admin/bootstrap/batch.properties</value>
<value>classpath:batch-default.properties</value>
<value>classpath:batch-${ENVIRONMENT:hsql}.properties</value>
</list>
</property>
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="ignoreResourceNotFound" value="true" />
<property name="ignoreUnresolvablePlaceholders" value="false" />
<property name="order" value="1" />
</bean>
Run Code Online (Sandbox Code Playgroud)
但SystemPropertyInitializer用于afterPropertiesSet()设置系统属性,显然这是在配置后PropertyPlaceholderConfigurer发生的。
有可能实现这一目标吗?
java system-properties spring-batch spring-batch-admin property-placeholder
java ×3
spring ×3
c3p0 ×1
jakarta-ee ×1
jdbc ×1
spring-batch ×1
spring-jdbc ×1
spring-mvc ×1
spring-test ×1
ssl ×1