B.1 Meta-data format
Configuration meta-data files are located inside jars under META-INF/spring-configuration-metadata.json
They use a simple JSON format with items categorized under either “groups” or “properties” and additional values hint categorized under "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.servlet-path", "type": "java.lang.String", "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties", "defaultValue": "/" }, { "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." } ] } ]}
Each “property” is a configuration item that the user specifies with a given value. For example server.port
and server.servlet-path
might be specified in application.properties
as follows:
server.port=9090 server.servlet-path=/home
The “groups” are higher level items that don’t themselves specify a value, but instead provide a contextual grouping for properties. For example the server.port
and server.servlet-path
properties are part of the server
group.
Note | |
---|---|
It is not required that every “property” has a “group”, some properties might just exist in their own right. |
Finally, “hints” are additional information used to assist the user in configuring a given property. When configuring the spring.jpa.hibernate.ddl-auto
property, a tool can use it to offer some auto-completion help for the none
, validate
, update
, create
and create-drop
values.
B.1.1 Group Attributes
The JSON object contained in the groups
array can contain the following attributes:
Name | Type | Purpose |
---|---|---|
name |
String | The full name of the group. This attribute is mandatory. |
type |
String | The class name of the data type of the group. For example, if the group was based on a class annotated with @ConfigurationProperties the attribute would contain the fully qualified name of that class. If it was based on a @Bean method, it would be the return type of that method. The attribute may be omitted if the type is not known. |
description |
String | A short description of the group that can be displayed to users. May be omitted if no description is available. It is recommended that descriptions are a short paragraphs, with the first line providing a concise summary. The last line in the description should end with a period (. ). |
sourceType |
String | The class name of the source that contributed this group. For example, if the group was based on a @Bean method annotated with @ConfigurationProperties this attribute would contain the fully qualified name of the @Configuration class containing the method. The attribute may be omitted if the source type is not known. |
sourceMethod |
String | The full name of the method (include parenthesis and argument types) that contributed this group. For example, the name of a @ConfigurationProperties annotated @Bean method. May be omitted if the source method is not known. |
B.1.2 Property Attributes
The JSON object contained in the properties
array can contain the following attributes:
Name | Type | Purpose |
---|---|---|
name |
String | The full name of the property. Names are in lowercase dashed form (e.g. server.servlet-path ). This attribute is mandatory. |
type |
String | The class name of the data type of the property. For example, java.lang.String . This attribute can be used to guide the user as to the types of values that they can enter. For consistency, the type of a primitive is specified using its wrapper counterpart, i.e. boolean becomes java.lang.Boolean . Note that this class may be a complex type that gets converted from a String as values are bound. May be omitted if the type is not known. |
description |
String | A short description of the group that can be displayed to users. May be omitted if no description is available. It is recommended that descriptions are a short paragraphs, with the first line providing a concise summary. The last line in the description should end with a period (. ). |
sourceType |
String | The class name of the source that contributed this property. For example, if the property was from a class annotated with @ConfigurationProperties this attribute would contain the fully qualified name of that class. May be omitted if the source type is not known. |
defaultValue |
Object | The default value which will be used if the property is not specified. Can also be an array of value(s) if the type of the property is an array. May be omitted if the default value is not known. |
deprecation |
Deprecation | Specify if the property is deprecated. May be omitted if the field is not deprecated or if that information is not known. See below for more details. |
The JSON object contained in the deprecation
attribute of each properties
element can contain the following attributes:
Name | Type | Purpose |
---|---|---|
reason |
String | A short description of the reason why the property was deprecated. May be omitted if no reason is available. It is recommended that descriptions are a short paragraphs, with the first line providing a concise summary. The last line in the description should end with a period (. ). |
replacement |
String | The full name of the property that is replacing this deprecated property. May be omitted if there is no replacement for this property. |
Note | |
---|---|
Prior to Spring Boot 1.3, a single deprecated boolean attribute can be used instead of the deprecation element. This is still supported in a deprecated fashion and should no longer be used. If no reason and replacement are available, an empty deprecation object should be set. |
Deprecation can also be specified declaratively in code by adding the @DeprecatedConfigurationProperty
annotation to the getter exposing the deprecated property. For instance, let’s assume the app.foo.target
property was confusing and was renamed to app.foo.name
_@ConfigurationProperties("app.foo")_ public class FooProperties { private String name; public String getName() { ... } public void setName(String name) { ... } _@DeprecatedConfigurationProperty(replacement = "app.foo.name")_ _@Deprecated_ public String getTarget() { return getName(); } _@Deprecated_ public void setTarget(String target) { setName(target); } }
The code above makes sure that the deprecated property still works (delegating to the name
property behind the scenes). Once the getTarget
and setTarget
methods can be removed from your public API, the automatic deprecation hint in the meta-data will go away as well.
B.1.3 Hint Attributes
The JSON object contained in the hints
array can contain the following attributes:
Name | Type | Purpose |
---|---|---|
name |
String | The full name of the property that this hint refers to. Names are in lowercase dashed form (e.g. server.servlet-path ). If the property refers to a map (e.g. system.contexts ) the hint either applies to the keys of the map (system.context.keys ) or the values (system.context.values ). This attribute is mandatory. |
values |
ValueHint[] | A list of valid values as defined by the ValueHint object (see below). Each entry defines the value and may have a description |
providers |
ValueProvider[] | A list of providers as defined by the ValueProvider object (see below). Each entry defines the name of the provider and its parameters, if any. |
The JSON object contained in the values
attribute of each hint
element can contain the following attributes:
Name | Type | Purpose |
---|---|---|
value |
Object | A valid value for the element to which the hint refers to. Can also be an array of value(s) if the type of the property is an array. This attribute is mandatory. |
description |
String | A short description of the value that can be displayed to users. May be omitted if no description is available. It is recommended that descriptions are a short paragraphs, with the first line providing a concise summary. The last line in the description should end with a period (. ). |
The JSON object contained in the providers
attribute of each hint
element can contain the following attributes:
Name | Type | Purpose |
---|---|---|
name |
String | The name of the provider to use to offer additional content assistance for the element to which the hint refers to. |
parameters |
JSON object | Any additional parameter that the provider supports (check the documentation of the provider for more details). |
B.1.4 Repeated meta-data items
It is perfectly acceptable for “property” and “group” objects with the same name to appear multiple times within a meta-data file. For example, you could bind two separate classes to the same prefix, with each potentially offering overlap of property names. While this is not supposed to be a frequent scenario, consumers of meta-data should take care to ensure that they support such scenarios.