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

用Spring和嵌套属性的YAML注入值

余信然
2023-03-14

我想从YAML向Spring上下文注入一些值。YAML的结构类似,因此我不想重复代码,但Spring启动失败,因为它无法将值注入占位符。

请注意我的应用程序。属性

server.port=8084

activeProfile=dev

autoAgents.supplier.id=0
autoAgents.supplier.name=test
autoAgents.supplier.serviceType=REST
autoAgents.supplier.authType=1
autoAgents.supplier.adapter=test
autoAgents.supplier.username=test
autoAgents.supplier.secret=test
autoAgents.supplier.apiPassword=12345

autoAgents.client.id=1
autoAgents.client.name=test
autoAgents.client.serviceType=REST
autoAgents.client.authType=1
autoAgents.client.adapter=
autoAgents.client.username=test
autoAgents.client.secret=test
autoAgents.client.apiPassword=12345

然后我将这些值注入YAML,application.yml

activeProfile: ${activeProfile}

autoAgents:
    supplier:
        isSupplier: true
        meta:
            id: ${autoAgents.supplier.id}
            name: ${autoAgents.supplier.name}
            serviceType: ${autoAgents.supplier.serviceType}
            authType: ${autoAgents.supplier.authType}
            adapter: ${autoAgents.supplier.adapter}
        credentials:
            username: ${autoAgents.supplier.username}
            secret: ${autoAgents.supplier.secret}
            apiPassword: ${autoAgents.supplier.apiPassword}
    client:
    isSupplier: false
    meta:
        id: ${autoAgents.client.id}
        name: ${autoAgents.client.name}
        serviceType: ${autoAgents.client.serviceType}
        authType: ${autoAgents.client.authType}
        adapter: ${autoAgents.client.adapter}
    credentials:
        username: ${autoAgents.client.username}
        secret: ${autoAgents.client.secret}
        apiPassword: ${autoAgents.client.apiPassword}

然后我将其导入到配置属性上下文:

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties    
@Data
public class TwoConnectConfigurationProperties {
    
    private String activeProfile;
    @Value("${autoAgents.supplier}")
    private AutoAgentDup supplier;
    @Value("${autoAgents.client}")
    private AutoAgentDup client;
}

但是< code > @ Value(" $ { auto agents . supplier } ")不起作用。

请建议。

共有2个答案

孟成化
2023-03-14

为什么需要“嵌套属性”?如果只想在应用程序中访问它们,只需从 .properties 文件中获取值并将其作为值填充到 .yml 文件中即可。例如:配置文件:开发,或

autoAgents:
  client:
    id: 1

可以从代码访问 .yml 文件中的属性,方法与从 .properties 文件中访问的方式相同。

您的问题在于您如何访问属性。当您使用“@Configuration属性”时,您必须指定要使用的属性(例如@ConfigurationProperties(“autoAgents.client”))。

漆雕誉
2023-03-14

如前所述,将值注入yaml是没有意义的,您可以直接使用值创建“application.yaml”。只需删除“.properies”文件即可。

您可能想看看如何轻松地将带有公共后缀的属性注入到bean中。这里有很好的描述:https://www . bael dung . com/configuration-properties-in-spring-boot

你会有一个豆子:

@Configuration
@ConfigurationProperties(prefix = "autoAgents.supplier")
public class AutoAgentSupplierProperties {

  private long id;
  private String name;
  // ... rest of the properies properties
}

您可能希望“auto.agent”客户端也是如此。

如果您想避免代码重复,您可以拥有一个具有公共属性的bean。使用2个新类扩展该类。一个用于供应商,一个用于代理-并用

@配置属性

注释。

 类似资料:
  • 我在Java spring-boot应用程序的src/main/resources中定义了以下application-errors.yml文件: 请注意,我尝试了两种不同的格式来指定属性。 我通过@Configuration注释类中的以下Bean加载该属性文件: 我看到属性是通过Spring环境变量加载的,但不是我所期望的模式。调试时,我可以看到加载的属性文件的源包含以下值: 看起来 yaml 文

  • 我有一个名为CommonConfig的配置类,到目前为止它工作得很好… 以及与之配套的Yaml属性文件: 我的问题开始于当我想把一个映射到子B中时: 我尝试在SubB类中添加一个简单的映射声明: 当我运行这个时,所有其他属性都在配置中,但映射是空的。我还尝试不初始化映射,但它保持为空。 我的SpringBootApplication类以前只使用了一个注释就可以很好地工作。基于其他一些StackOv

  • 假设我有那些DTO: 在我的存储库中,我使用这些DTO作为投影进行查询: 我可以使用这个repo很好地访问ForumDTO中的id、name,但对于lasthread,它只返回null。我试过作为最后一个线程。Id、lastThread\u Id、lastThreadId均无效。

  • 问题内容: 我需要定义一个切入点,该切入点触发使用自定义注释注释的spring服务的所有方法的执行。我想定义切入点的注释将在另一个注释上。 然后该服务将被注释如下 我尝试使用以下切入点定义,但是仅当@Y在服务本身上时才有效,这意味着它看不到注释在@X上 问题答案: 我在应用程序中有这个确切的需求。我找到了这个答案,但不满意无法完成。 经过更多搜索之后,我发现了用于AspectJ / Spring切

  • 主要内容:构造函数注入,setter 注入,短命名空间注入所谓 Bean 属性注入,简单点说就是将属性注入到 Bean 中的过程,而这属性既可以普通属性,也可以是一个对象(Bean)。 Spring 主要通过以下 2 种方式实现属性注入: 构造函数注入 setter 注入(又称设值注入) 构造函数注入 我们可以通过 Bean 的带参构造函数,以实现 Bean 的属性注入。 使用构造函数实现属性注入大致步骤如下: 在 Bean 中添加一个有参构造函数,构造

  • 我正在使用spring boot开发REST API。我想在我的项目中使用git。在文件应用程序中。属性我有数据库Url、用户名和密码,我不想在git上推送它们。我不知道如何创建包含数据库配置的文件,以及如何将这些配置注入应用程序。属性。 应用属性