当前位置: 首页 > 知识库问答 >
问题:

如何将属性值注入Spring Boot组件

宇文智敏
2023-03-14

在我的Spring Boot Application中,我用一个调用存储过程的方法实现了以下类。

@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;
    }
}

由于调用存储过程需要数据库连接,所以我需要从应用程序加载这些相应的属性值。特性:

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

基于以下关于类似问题的文章,Spring boot—应用程序中的自定义变量。属性,并在您自己的类和Spring Boot@ConfigurationProperties示例中使用Spring Boot配置属性,我为我的类@ConfigurationProperties(prefix=“Spring”)(db连接的属性都以“Spring”作为前缀)添加了此注释。然而,当我使用如下的测试类运行它时,我得到了错误“应用程序必须提供JDBC连接”,这意味着应用程序中的属性。不拾取属性。

@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 dependencyspring boot配置处理器。为什么它仍然不起作用?我错过了什么?

共有1个答案

连德水
2023-03-14

这里几乎没有什么不对的地方:

  • @Value不适用于静态字段

如果您想利用Spring Boot配置属性进行数据库连接,而不是像您这样创建EntityManager

EntityManager em = Persistence.createEntityManagerFactory("RIStore_FM").createEntityManager();

假设您的依赖项列表中有Spring数据JPA启动器,您应该注入它。

我看到您使用了很多静态方法和字段。这对Spring不起作用。改为使用依赖项注入,并自动连接所需内容。

 类似资料:
  • Spring Boot提供了一种优雅的方法,可以使用将带有特定键前缀的属性注入Configuration类。这是显示在这里和这里。问题是,如何将前缀属性注入到实例中,如下所示?

  • 我试图向自定义注释中注入一个值,但Spring似乎没有进行评估。

  • 问题内容: 有点卡在这里。我有一个带有3个配置文件的pom。Theese配置文件具有不同的版本名称。我要在构建特定配置文件时将该版本名称注入属性文件。 我的个人资料: 和filter.properties看起来像这样: 怎么做?我通过命令构建项目: 问题答案: 您需要做的是在POM文件的部分中添加一个新部分。 像这样: 这将在指定文件的指定文件夹()内部查找,并在遇到定义的变量时更改文件。 因此,

  • 我有我的Jhipster配置/应用程序属性。java类设置和工作,但不清楚如何将属性值注入url的假客户端注释: 使用@Value在下面不起作用: 有什么想法吗?

  • 在我的microservice Spring Boot项目中,我用@ResponseStatus注释了这个自定义异常: 它工作得很好:当引发异常时,我的控制器返回指定的状态(404),但原因没有得到解决(错误消息是“${message.custom.notFound}”)。 您知道是否有方法将属性文件中的属性注入到此注释中吗? 提前感谢

  • 我做错了什么?我需要组件的完整构造函数吗?这是因为cs是静态的?springboot不是要自动填充这些值吗?