spring-boot-configuration-processor:如何为使用变量前缀的外部提供的配置属性生成或提供元数据

时间:2019-12-29 13:48:24

标签: spring-boot

如何使用spring-boot-configuration-processor为外部提供的与可变前缀一起使用的配置属性生成或提供元数据。

我们使用配置属性功能使用不同的前缀多次绑定属性。

@ConfigurationProperties(prefix = "client-a")
@Bean
public MyClientProperties clientAproperties() {
  return new  MyClientProperties();
}

@ConfigurationProperties(prefix = "client-b")
@Bean
public MyClientProperties clientBproperties() {
  return new  MyClientProperties();
}

只要MyClientProperties类在我的spring-boot项目中是本地的,spring-boot-configuration-processor就可以为我使用的每个前缀生成元数据。特别是,description元数据是从类的字段级javadoc中提取的:

public class MyClientProperties {
  /**
   * Web service remote endpoint url
   */
  public String endpoint = "http://localhost:8080/services";
...
}

生成的元数据

    {
      "name": "client-a.endpoint",
      "type": "java.lang.String",
      "description": "Web service remote endpoint url",
      "sourceType": "com.example.client.MyClientProperties",
      "defaultValue": "http:\/\/localhost:8080\/services"
    },
...
    {
      "name": "client-b.endpoint",
      "type": "java.lang.String",
      "description": "Web service remote endpoint url",
      "sourceType": "com.example.client.MyClientProperties",
      "defaultValue": "http:\/\/localhost:8080\/services"
    },

一旦将类移到外部jar依赖项以便在多个 项目,spring-boot-configuration-processor无法访问属性类型的源代码。 descriptiondefaultValue元数据不再可用。

    {
      "name": "client-a.endpoint",
      "type": "java.lang.String",
      "sourceType": "com.example.client.MyClientProperties"
    },
...
    {
      "name": "client-b.endpoint",
      "type": "java.lang.String",
      "sourceType": "com.example.client.MyClientProperties"
    },

如果MyClientProperties仅用于固定前缀,则可以运行spring-boot-configuration-processor 在外部jar模块中,并将生成的metatdata.json文件打包。生成的元数据将可见 在my-client前缀下使用的spring-boot应用程序的上下文中。

@@ConfigurationProperties(prefix = "my-client")
public class MyClientProperties {
...
}

我需要一种从外部提供的访问descriptiondefaultValue元数据的机制 属性类位于正在使用的spring-boot应用程序选择的动态前缀之下。

即使经过大量研究,我仍未找到使这种情况起作用的方法。我应该监督某些事情吗?还是它更适合作为增强请求而不是问题?

2 个答案:

答案 0 :(得分:0)

请考虑在creating an issue前稍等。

如果未与MyClientProperties一起使用,则注释处理器将无法访问@ConfigurationProperties的源模型。如果没有源模型,则无法访问Javadoc和默认值。

答案 1 :(得分:0)

任何有兴趣的人都应该观看this spring-boot enhancement issue