配置元数据-1
SpringBoot jar包含元数据文件,这些文件提供了所有支持的配置属性的详细信息。这些文件旨在让IDE开发人员在用户使用时提供上下文帮助和“代码完成”(application.propertes或application.yml)。
大部分元数据文件是在编译时通过处理用@ConfigurationProperties注释的所有项自动生成的。但是,可以手动为案例编写部分元数据。
一、元数据格式
配置元数据文件位于META-INF/spring-configuration-metadata.json. 它们使用JSON格式,将项目分类为“groups”或“properties”,将附加值提示分类为“hints”,如下例所示:
{"groups": [
{
"name": "server",
"type": "org.springframework.boot.autoconfigure.web.ServerProperties",
"sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties"
},
{
"name": "spring.jpa.hibernate",
"type": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate",
"sourceType": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties",
"sourceMethod": "getHibernate()"
}
...
],"properties": [
{
"name": "server.port",
"type": "java.lang.Integer",
"sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties"
},
{
"name": "server.address",
"type": "java.net.InetAddress",
"sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties"
},
{
"name": "spring.jpa.hibernate.ddl-auto",
"type": "java.lang.String",
"description": "DDL mode. This is actually a shortcut for the \"hibernate.hbm2ddl.auto\" property.",
"sourceType": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate"
}
...
],"hints": [
{
"name": "spring.jpa.hibernate.ddl-auto",
"values": [
{
"value": "none",
"description": "Disable DDL handling."
},
{
"value": "validate",
"description": "Validate the schema, make no changes to the database."
},
{
"value": "update",
"description": "Update the schema if necessary."
},
{
"value": "create",
"description": "Create the schema and destroy previous data."
},
{
"value": "create-drop",
"description": "Create and then destroy the schema at the end of the session."
}
]
}
]}
每个“属性”都是用户用给定值指定的配置项。例如,服务器端口以及服务器地址可能在application.properties指定,如下所示:
server.port=9090 server.address=127.0.0.1
“groups”是更高级别的项,它们本身不指定值,而是为属性提供上下文分组。例如服务器端口以及服务器地址属性是服务器组的一部分。
不要求每个“属性”都有一个“组”。有些属性可能本身就存在。
最后,“hints”是用于帮助用户配置给定属性的附加信息。例如,当开发人员配置spring.jpa.hibernate.ddl auto属性,工具可以使用提示为none、validate、update、create和create drop值提供一些自动完成帮助。
Group属性
groups数组中包含的JSON对象可以包含下表所示的属性:
| 名称 | 类型 | 目的 |
| name | String | 组的全名。此属性是必需的。 |
| type | String | 组的数据类型的类名。例如,如果组基于用@ConfigurationProperties注释的类,则该属性将包含该类的完全限定名。如果它基于@Bean方法,那么它将是该方法的返回类型。如果类型未知,则可以省略该属性。 |
| description | String | 可以向用户显示的组的简短描述。如果没有说明,可以省略。建议用简短的段落描述,第一行提供简明的摘要。说明中的最后一行应以句点(.)结尾。 |
| sourceType | String | 提供此组的源的类名。例如,如果该组基于用@ConfigurationProperties注释的@Bean方法,则该属性将包含包含该方法的@Configuration类的完全限定名。如果源类型未知,则可以省略该属性。 |
| sourceMethod | String | 提供此组的方法的全名(包括括号和参数类型)(例如,@ConfigurationProperties注释的@Bean方法的名称)。如果源方法未知,则可以省略。 |
Property 属性
properties数组中包含的JSON对象可以包含下表中描述的属性:
| 名称 | 类型 | 目的 |
| name | String | 属性的全名。名称采用小写句点分隔形式(例如,server.address). 此属性是必需的。 |
| type | String | 属性的数据类型的完整签名(例如,java.lang.String)但也可以是一个完整的泛型类型(例如java.util.Map<java.lang.String,acme.MyEnum>)。可以使用此属性指导用户输入的值类型。为了保持一致性,原语的类型是通过使用其对应的包装器来指定的(例如,boolean变成java.lang.Boolean). 注意,这个类可能是一个复杂类型,在绑定值时从字符串转换而来。如果类型未知,则可以省略。 |
| description | String | 可以显示给用户的属性的简短描述。如果没有说明,可以省略。建议用简短的段落描述,第一行提供简明的摘要。说明中的最后一行应以句点(.)结尾。 |
| sourceType | String | 该类的源提供了该类的名称。例如,如果属性来自用@ConfigurationProperties注释的类,则此属性将包含该类的完全限定名。如果源类型未知,则可以省略。 |
| defaultValue | Object | 默认值,如果未指定属性,则使用该值。如果属性的类型是数组,则可以是值数组。如果默认值未知,则可以省略。 |
| deprecation | Deprecation | 指定属性是否已弃用。如果该字段未被否决或该信息未知,则可以省略该字段。下表提供了关于deprecation属性的更多详细信息。 |
每个properties元素的deprecation属性中包含的JSON对象可以包含以下属性:
| 名称 | 类型 | 目的 |
| level | String | 弃用级别,可以是warning(默认值)或error。当属性具有warning弃用级别时,它仍应绑定在环境中。但是,当属性具有error弃用级别时,该属性将不再受管理且不绑定。 |
| reason | String | 对不推荐使用该属性的原因的简短描述。如果没有理由,可以省略。建议用简短的段落描述,第一行提供简明的摘要。说明中的最后一行应以句点(.)结尾。 |
| replacement | String | 替换此不推荐使用的属性的全名。如果没有替换此属性,则可以省略。 |
在SpringBoot1.3之前,可以使用一个不推荐使用的boolean属性,而不是deprecision元素。这仍然以不推荐的方式支持,不应再使用。如果没有原因和替换,则应设置一个空的弃用对象。
也可以通过将@DeprecatedConfigurationProperty注解添加到公开deprecated属性的getter,在代码中以声明方式指定。例如,假设app.acme.target属性混乱,已重命名为app.acme.name属性. 以下示例说明如何处理这种情况:
@ConfigurationProperties("app.acme")
public class AcmeProperties {
private String name;
public String getName() { ... }
public void setName(String name) { ... }
@DeprecatedConfigurationProperty(replacement = "app.acme.name")
@Deprecated
public String getTarget() {
return getName();
}
@Deprecated
public void setTarget(String target) {
setName(target);
}
}
没有办法设定一个level。由于代码仍在处理属性,因此始终假定为warning。
前面的代码确保不推荐使用的属性仍然有效(在幕后委托给name属性)。一旦可以从公共API中删除getTarget和setTarget方法,元数据中的自动弃用提示也将消失。如果希望保留提示,则添加带有error弃用级别的手动元数据可确保用户仍能了解该属性。当提供替换件时,这样做特别有用。
提示属性
提示数组中包含的JSON对象可以包含下表所示的属性:
| 名称 | 类型 | 目的 |
| name | String | 此提示引用的属性的全名。名称采用小写句点分隔形式(例如 spring.mvc.servlet.path)。如果属性引用一个map(例如system.contexts),该提示要么应用于map的键(system.contexts.keys)或者map的value(system.contexts.values)上。此属性是必需的。 |
| values | ValueHint[] | ValueHint对象定义的有效值的列表(下表中描述)。每个条目定义值并可能有一个描述。 |
| providers | ValueProvider[] | 由ValueProvider对象定义的提供程序列表。每个条目定义提供程序的名称及其参数(如果有)。 |
每个hint元素的values属性中包含的JSON对象可以包含下表中描述的属性:
| 名称 | 类型 | 目的 |
| value | Object | 提示所指向的元素的有效值。如果属性的类型是数组,它也可以是值数组。此属性是必需的。 |
| description | String | 可以显示给用户的值的简短描述。如果没有说明,可以省略。建议用简短的段落描述,第一行提供简明的摘要。说明中的最后一行应以句点(.)结尾。 |
每个hint元素的providers属性中包含的JSON对象可以包含下表中描述的属性:
| 名称 | 类型 | 目的 |
| name | String | 用于为提示所指向的元素提供附加内容帮助的提供程序的名称。 |
| parameters | JSON object | 提供程序支持的任何其他参数 |
二、提供手动提示
要改善用户体验并进一步帮助用户配置给定属性,可以提供其他元数据:
- 描述属性的潜在值列表。
- 关联提供程序,将定义良好的语义附加到属性,以便工具可以根据项目上下文发现潜在值的列表。
值提示
每个提示的name属性都引用属性的名称。spring.jpa.hibernate.ddl auto属性:none、validate、update、create和create drop。每个值也可能有一个描述。
如果属性的类型是Map,则可以为键和值提供提示(但不能为映射本身提供提示)。特殊的.keys和.values后缀必须分别引用键和值。
假设示例上下文将魔法字符串值映射为整数,如下例所示:
@ConfigurationProperties("sample")
public class SampleProperties {
private Map<String,Integer> contexts;
// getters and setters
}
魔法值在本例中是sample1和sample2。为了为键提供额外的内容帮助,可以将以下JSON添加到模块的手动元数据中:
{"hints": [
{
"name": "sample.contexts.keys",
"values": [
{
"value": "sample1"
},
{
"value": "sample2"
}
]
}
]}
我们建议对这两个值使用枚举。如果您的IDE支持它,那么这是迄今为止最有效的自动完成方法。

浙公网安备 33010602011771号