如何将 属性 值注入 Spring 引导组件
How to inject property values into Spring Boot component
在我的 Spring 引导应用程序中,我使用调用存储过程的方法实现了以下 class。
@Component
@ConfigurationProperties(prefix = "spring")
public class FmTrfUtil {
static int returnVal;
@Value("${spring.datasource.url}")
static String url;
public static int insertFmTrfs(List<String> trfs, String source) {
System.out.println(url);
EntityManager em = Persistence.createEntityManagerFactory("RIStore_FM").createEntityManager();
Session session = em.unwrap( Session.class );
final String[] trfArray = trfs.toArray(new String[trfs.size()]);
final String src = source;
session.doWork( new Work(){
public void execute(Connection conn) throws SQLException {
CallableStatement stmt = null;
OracleConnection oraCon = conn.unwrap(OracleConnection.class);
Array array = oraCon.createARRAY("VARCHAR2_TAB_T", trfArray);
stmt = conn.prepareCall("{? = call FM_TRF_UTIL.process_fm_trf(?,?)}");
stmt.registerOutParameter(1, Types.INTEGER);
stmt.setArray(2, array);
stmt.setString(3, src);
stmt.execute();
returnVal = stmt.getInt(1);
}
});
return returnVal;
}
}
由于调用存储过程需要数据库连接,我需要从application.properties:
中加载这些对应的属性值
spring.profiles.active=dev
spring.datasource.url=jdbc:oracle:thin:@ldap://xxx:389/risdev3, cn=OracleContext,dc=x,dc=net
spring.datasource.username=owner
spring.datasource.password=owner987
基于以下关于类似问题的文章, and Using Spring-Boot configuration properties in your own classes and Spring Boot @ConfigurationProperties example,我为我的 class @ConfigurationProperties(prefix = "spring")
添加了这个注释(数据库连接的属性都有 "spring" 作为前缀).然而,当我 运行 它和如下测试 class 时,我得到错误 "the application must supply JDBC connection" 这意味着 application.properties 中的属性没有被拾取。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = RistoreWebApplication.class, initializers = ConfigFileApplicationContextInitializer.class)
public class FmTrfUtilTest {
@Test
public void test() {
List<String> trfs = new ArrayList<String>();
trfs.add("TRF000001");
trfs.add("TRF000002");
int ret = FmTrfUtil.insertFmTrfs(trfs, "SARC");
assertTrue(ret > 0);
}
}
为了 @ConfigurationProperties
工作,我也添加了 Maven 依赖项 spring-boot-configuration-processor
。为什么它仍然不起作用?我错过了什么?
这里有一些错误:
@Value
不适用于静态字段
@ConfigurationProperties
用于将字段从 application.properties
或 application.yml
绑定到 Java 对象。查看来自 Spring Boot 本身的任何 @ConfigurationProperties
注释 class 以轻松理解它应该如何使用。
- 您不应该使用带有前缀
spring
的自己的 @ConfigurationProperties
,因为它已经被 Spring 引导本身使用
spring-boot-configuration-processor
仅用于 IDE 中更好的代码完成。你不需要这个。
如果您想利用 Spring 引导配置属性进行数据库连接,而不是像您那样创建 EntityManager
:
EntityManager em = Persistence.createEntityManagerFactory("RIStore_FM").createEntityManager();
假设你的依赖列表中有 Spring Data JPA Starter,你应该注入它。
我看到您使用了很多 static
方法和字段。这不适用于 Spring。改为使用依赖注入并自动装配你需要的东西。
在我的 Spring 引导应用程序中,我使用调用存储过程的方法实现了以下 class。
@Component
@ConfigurationProperties(prefix = "spring")
public class FmTrfUtil {
static int returnVal;
@Value("${spring.datasource.url}")
static String url;
public static int insertFmTrfs(List<String> trfs, String source) {
System.out.println(url);
EntityManager em = Persistence.createEntityManagerFactory("RIStore_FM").createEntityManager();
Session session = em.unwrap( Session.class );
final String[] trfArray = trfs.toArray(new String[trfs.size()]);
final String src = source;
session.doWork( new Work(){
public void execute(Connection conn) throws SQLException {
CallableStatement stmt = null;
OracleConnection oraCon = conn.unwrap(OracleConnection.class);
Array array = oraCon.createARRAY("VARCHAR2_TAB_T", trfArray);
stmt = conn.prepareCall("{? = call FM_TRF_UTIL.process_fm_trf(?,?)}");
stmt.registerOutParameter(1, Types.INTEGER);
stmt.setArray(2, array);
stmt.setString(3, src);
stmt.execute();
returnVal = stmt.getInt(1);
}
});
return returnVal;
}
}
由于调用存储过程需要数据库连接,我需要从application.properties:
中加载这些对应的属性值spring.profiles.active=dev
spring.datasource.url=jdbc:oracle:thin:@ldap://xxx:389/risdev3, cn=OracleContext,dc=x,dc=net
spring.datasource.username=owner
spring.datasource.password=owner987
基于以下关于类似问题的文章,@ConfigurationProperties(prefix = "spring")
添加了这个注释(数据库连接的属性都有 "spring" 作为前缀).然而,当我 运行 它和如下测试 class 时,我得到错误 "the application must supply JDBC connection" 这意味着 application.properties 中的属性没有被拾取。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = RistoreWebApplication.class, initializers = ConfigFileApplicationContextInitializer.class)
public class FmTrfUtilTest {
@Test
public void test() {
List<String> trfs = new ArrayList<String>();
trfs.add("TRF000001");
trfs.add("TRF000002");
int ret = FmTrfUtil.insertFmTrfs(trfs, "SARC");
assertTrue(ret > 0);
}
}
为了 @ConfigurationProperties
工作,我也添加了 Maven 依赖项 spring-boot-configuration-processor
。为什么它仍然不起作用?我错过了什么?
这里有一些错误:
@Value
不适用于静态字段@ConfigurationProperties
用于将字段从application.properties
或application.yml
绑定到 Java 对象。查看来自 Spring Boot 本身的任何@ConfigurationProperties
注释 class 以轻松理解它应该如何使用。- 您不应该使用带有前缀
spring
的自己的@ConfigurationProperties
,因为它已经被 Spring 引导本身使用 spring-boot-configuration-processor
仅用于 IDE 中更好的代码完成。你不需要这个。
如果您想利用 Spring 引导配置属性进行数据库连接,而不是像您那样创建 EntityManager
:
EntityManager em = Persistence.createEntityManagerFactory("RIStore_FM").createEntityManager();
假设你的依赖列表中有 Spring Data JPA Starter,你应该注入它。
我看到您使用了很多 static
方法和字段。这不适用于 Spring。改为使用依赖注入并自动装配你需要的东西。