着急的黄瓜 · 杭州锦绣·育才中学附属学校2024年招生入学 ...· 7 月前 · |
好帅的苦咖啡 · SkipResumeTrainingVali ...· 9 月前 · |
坏坏的蚂蚁 · ISO/IEC 15504-2:2003 ...· 9 月前 · |
傲视众生的佛珠 · 如何使用IDEA远程调试_MapReduce ...· 11 月前 · |
Table of Contents
settings.xml
persistence.xml
File
spring-boot-antlib
The Spring Boot reference guide is available as
The latest copy is available at docs.spring.io/spring-boot/docs/current/reference .
Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each common questions.
spring-boot
.
Note | |
---|---|
All of Spring Boot is open source, including the documentation. If you find problems with the docs or if you want to improve them, please get involved . |
If you are getting started with Spring Boot or 'Spring' in general, start with the following topics :
Ready to actually start using Spring Boot? We have you covered :
Need more details about Spring Boot’s core features? The following content is for you :
Spring Boot 2.0.0.M7 requires Java 8 and Spring Framework 5.0.2.RELEASE or above. Explicit build support is provided for Maven 3.2+ and Gradle 4.
The following embedded servlet containers are supported out of the box:
Name | Servlet Version |
---|---|
Tomcat 8.5 |
3.1 |
Jetty 9.4 |
3.1 |
Undertow 1.3 |
3.1 |
You can also deploy Spring Boot applications to any Servlet 3.0+ compatible container.
Spring Boot can be used with “classic” Java development tools or installed as a command line tool. Either way, you need Java SDK v1.8 or higher. Before you begin, you should check your current Java installation by using the following command:
$ java -version
If you are new to Java development or if you want to experiment with Spring Boot, you might want to try the Spring Boot CLI (Command Line Interface) first, otherwise, read on for “classic” installation instructions.
Spring Boot is compatible with Apache Maven 3.2 or above. If you do not already have Maven installed, you can follow the instructions at maven.apache.org .
Tip | |
---|---|
On many operating systems, Maven can be installed with a package manager. If you use
OSX Homebrew, try
|
Spring Boot dependencies use the
org.springframework.boot
groupId
. Typically, your
Maven POM file inherits from the
spring-boot-starter-parent
project and declares
dependencies to one or more
“Starters”
.
Spring Boot also provides an optional
Maven plugin
to create
executable jars.
The following listing shows a typical
pom.xml
file:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>myproject</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- Inherit defaults from Spring Boot --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.M7</version> </parent> <!-- Add typical dependencies for a web application --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <!-- Package as an executable jar --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <!-- Add Spring repositories --> <!-- (you don't need this if you are using a .RELEASE version) --> <repositories> <repository> <id>spring-snapshots</id> <url>http://repo.spring.io/snapshot</url> <snapshots><enabled>true</enabled></snapshots> </repository> <repository> <id>spring-milestones</id> <url>http://repo.spring.io/milestone</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <url>http://repo.spring.io/snapshot</url> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <url>http://repo.spring.io/milestone</url> </pluginRepository> </pluginRepositories> </project>
Tip | |
---|---|
The
|
Spring Boot is compatible with Gradle 4. If you do not already have Gradle installed, you can follow the instructions at www.gradle.org/ .
Spring Boot dependencies can be declared by using the
org.springframework.boot
group
.
Typically, your project declares dependencies to one or more
“Starters”
. Spring Boot
provides a useful
Gradle
plugin
that can be used to simplify dependency declarations and to create executable
jars.
Gradle Wrapper
The Gradle Wrapper provides a nice way of “obtaining” Gradle when you need to build a project. It is a small script and library that you commit alongside your code to bootstrap the build process. See docs.gradle.org/4.2.1/userguide/gradle_wrapper.html for details.
The following example shows a typical
build.gradle
file:
buildscript { repositories { jcenter() maven { url 'http://repo.spring.io/snapshot' } maven { url 'http://repo.spring.io/milestone' } dependencies { classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.0.0.M7' apply plugin: 'java' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' jar { baseName = 'myproject' version = '0.0.1-SNAPSHOT' repositories { jcenter() maven { url "http://repo.spring.io/snapshot" } maven { url "http://repo.spring.io/milestone" } dependencies { compile("org.springframework.boot:spring-boot-starter-web") testCompile("org.springframework.boot:spring-boot-starter-test") }
The Spring Boot CLI (Command Line Interface) is a command line tool that you can use to quickly prototype with Spring. It lets you run Groovy scripts, which means that you have a familiar Java-like syntax without so much boilerplate code.
You do not need to use the CLI to work with Spring Boot, but it is definitely the quickest way to get a Spring application off the ground.
You can download the Spring CLI distribution from the Spring software repository:
Cutting edge snapshot distributions are also available.
Once downloaded, follow the
INSTALL.txt
instructions from the unpacked archive. In summary, there is a
spring
script
(
spring.bat
for Windows) in a
bin/
directory in the
.zip
file. Alternatively, you
can use
java -jar
with the
.jar
file (the script helps you to be sure that the
classpath is set correctly).
SDKMAN! (The Software Development Kit Manager) can be used for managing multiple versions of various binary SDKs, including Groovy and the Spring Boot CLI. Get SDKMAN! from sdkman.io and install Spring Boot by using the following commands:
$ sdk install springboot $ spring --version Spring Boot v2.0.0.M7
If you are developing features for the CLI and want easy access to the version you built, use the following commands:
$ sdk install springboot dev /path/to/spring-boot/spring-boot-cli/target/spring-boot-cli-2.0.0.M7-bin/spring-2.0.0.M7/ $ sdk default springboot dev $ spring --version Spring CLI v2.0.0.M7
The preceding instructions install a local instance of
spring
called the
dev
instance. It points at your target build location, so every time you rebuild Spring Boot,
spring
is up-to-date.
You can see it by running the following command:
$ sdk ls springboot ================================================================================ Available Springboot Versions ================================================================================ > + dev * 2.0.0.M7 ================================================================================ + - local version * - installed > - currently in use ================================================================================
If you are on a Mac and use Homebrew , you can install the Spring Boot CLI by using the following commands:
$ brew tap pivotal/tap $ brew install springboot
Homebrew installs
spring
to
/usr/local/bin
.
Note | |
---|---|
If you do not see the formula, your installation of brew might be out-of-date. In
that case, run
|
If you are on a Mac and use MacPorts , you can install the Spring Boot CLI by using the following command:
$ sudo port install spring-boot-cli
The Spring Boot CLI includes scripts that provide command completion for the
BASH
and
zsh
shells. You can
source
the script (also named
spring
) in any shell or put it in your personal or system-wide bash completion
initialization. On a Debian system, the system-wide scripts are in
/shell-completion/bash
and all scripts in that directory are executed when a new shell
starts. For example, to run the script manually if you have installed using SDKMAN!, use
the following commands:
$ . ~/.sdkman/candidates/springboot/current/shell-completion/bash/spring $ spring <HIT TAB HERE> grab help jar run test version
Note | |
---|---|
If you install the Spring Boot CLI by using Homebrew or MacPorts, the command-line completion scripts are automatically registered with your shell. |
@RestController class ThisWillActuallyRun { @RequestMapping("/") String home() { "Hello World!" }
Then run it from a shell, as follows:
$ spring run app.groovy
Note | |
---|---|
The first run of your application is slow, as dependencies are downloaded. Subsequent runs are much quicker. |
Open localhost:8080 in your favorite web browser. You should see the following output:
Hello World!
If you are upgrading from an earlier release of Spring Boot check the “release notes” hosted on the project wiki . You’ll find upgrade instructions along with a list of “new and noteworthy” features for each release.
To upgrade an existing CLI installation use the appropriate package manager command (for
example,
brew upgrade
) or, if you manually installed the CLI, follow the
standard instructions
remembering to update
your
PATH
environment variable to remove any older references.
Tip | |
---|---|
The spring.io web site contains many “Getting Started” guides that use Spring Boot. If you need to solve a specific problem, check there first. You can shortcut the steps below by going to start.spring.io and choosing the "Web" starter from the dependencies searcher. Doing so generates a new project structure so that you can start coding right away . Check the Spring Initializr documentation for more details. |
$ java -version java version "1.8.0_102" Java(TM) SE Runtime Environment (build 1.8.0_102-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
$ mvn -v Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T16:41:47+00:00) Maven home: /usr/local/Cellar/maven/3.3.9/libexec Java version: 1.8.0_102, vendor: Oracle Corporation
Note | |
---|---|
This sample needs to be created in its own folder. Subsequent instructions assume that you have created a suitable folder and that it is your “current directory”. |
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>myproject</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.M7</version> </parent> <!-- Additional lines to be added here... --> <!-- (you don't need this if you are using a .RELEASE version) --> <repositories> <repository> <id>spring-snapshots</id> <url>http://repo.spring.io/snapshot</url> <snapshots><enabled>true</enabled></snapshots> </repository> <repository> <id>spring-milestones</id> <url>http://repo.spring.io/milestone</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <url>http://repo.spring.io/snapshot</url> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <url>http://repo.spring.io/milestone</url> </pluginRepository> </pluginRepositories> </project>
Note | |
---|---|
At this point, you could import the project into an IDE (most modern Java IDEs include built-in support for Maven). For simplicity, we continue to use a plain text editor for this example. |
Spring Boot provides a number of “Starters” that let you add jars to your classpath.
Our sample application has already used
spring-boot-starter-parent
in the
parent
section of the POM. The
spring-boot-starter-parent
is a special starter that provides
useful Maven defaults. It also provides a
dependency-management
section so that you can omit
version
tags for “blessed” dependencies.
Other “Starters” provide dependencies that you are likely to need when developing a
specific type of application. Since we are developing a web application, we add a
spring-boot-starter-web
dependency. Before that, we can look at what we currently have
by running the following command:
$ mvn dependency:tree [INFO] com.example:myproject:jar:0.0.1-SNAPSHOT
The
mvn dependency:tree
command prints a tree representation of your project
dependencies. You can see that
spring-boot-starter-parent
provides no dependencies by
itself. To add the necessary dependencies, edit your
pom.xml
and add the
spring-boot-starter-web
dependency immediately below the
parent
section:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
If you run
mvn dependency:tree
again, you see that there are now a number of additional
dependencies, including the Tomcat web server and Spring Boot itself.
import org.springframework.boot.*; import org.springframework.boot.autoconfigure.*; import org.springframework.web.bind.annotation.*; @RestController @EnableAutoConfiguration public class Example { @RequestMapping("/") String home() { return "Hello World!"; public static void main(String[] args) throws Exception { SpringApplication.run(Example.class, args); }
Tip | |
---|---|
The
|
$ mvn spring-boot:run . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.0.0.M7) ....... . . . ....... . . . (log output here) ....... . . . ........ Started Example in 2.222 seconds (JVM running for 6.514)
If you open a web browser to localhost:8080 , you should see the following output:
Hello World!
To gracefully exit the application, press
ctrl-c
.
Spring Boot takes a different approach and allows you to actually nest jars directly.
To create an executable jar, we need to add the
spring-boot-maven-plugin
to our
pom.xml
. To do so, insert the following lines just below the
dependencies
section:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
Note | |
---|---|
The
|
Save your
pom.xml
and run
mvn package
from the command line, as follows:
$ mvn package [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building myproject 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] .... .. [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ myproject --- [INFO] Building jar: /Users/developer/example/spring-boot-example/target/myproject-0.0.1-SNAPSHOT.jar [INFO] [INFO] --- spring-boot-maven-plugin:2.0.0.M7:repackage (default) @ myproject --- [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------
If you look in the
target
directory, you should see
myproject-0.0.1-SNAPSHOT.jar
. The
file should be around 10 MB in size. If you want to peek inside, you can use
jar tvf
,
as follows:
$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar
You should also see a much smaller file named
myproject-0.0.1-SNAPSHOT.jar.original
in
the
target
directory. This is the original jar file that Maven created before it was
repackaged by Spring Boot.
To run that application, use the
java -jar
command, as follows:
$ java -jar target/myproject-0.0.1-SNAPSHOT.jar . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.0.0.M7) ....... . . . ....... . . . (log output here) ....... . . . ........ Started Example in 2.536 seconds (JVM running for 2.864)
As before, to exit the application, press
ctrl-c
.
Hopefully, this section provided some of the Spring Boot basics and got you on your way to writing your own applications. If you are a task-oriented type of developer, you might want to jump over to spring.io and check out some of the getting started guides that solve specific “How do I do that with Spring?” problems. We also have Spring Boot-specific “ How-to ” reference documentation.
The Spring Boot repository also has a bunch of samples you can run. The samples are independent of the rest of the code (that is, you do not need to build the rest to run or use the samples).
Otherwise, the next logical step is to read Part III, “Using Spring Boot” . If you are really impatient, you could also jump ahead and read about Spring Boot features .
If you are starting out with Spring Boot, you should probably read the Getting Started guide before diving into this section.
It is strongly recommended that you choose a build system that supports dependency management and that can consume artifacts published to the “Maven Central” repository. We would recommend that you choose Maven or Gradle. It is possible to get Spring Boot to work with other build systems (Ant, for example), but they are not particularly well supported.
Note | |
---|---|
You can still specify a version and override Spring Boot’s recommendations if you need to do so. |
The curated list contains all the spring modules that you can use with Spring Boot as
well as a refined list of third party libraries. The list is available as a standard
Bills of Materials (
spring-boot-dependencies
)
that can be used with both
Maven
and
Gradle
.
Warning | |
---|---|
Each release of Spring Boot is associated with a base version of the Spring Framework. We highly recommend that you not specify its version. |
application.properties
and
application.yml
including profile-specific files (for example,
application-foo.properties
and
application-foo.yml
)
Note that, since the
application.properties
and
application.yml
files accept Spring
style placeholders (
${…}
), the Maven filtering is changed to use
@..@
placeholders.
(You can override that by setting a Maven property called
resource.delimiter
.)
<!-- Inherit defaults from Spring Boot --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.M7</version> </parent>
Note | |
---|---|
You should need to specify only the Spring Boot version number on this dependency. If you import additional starters, you can safely omit the version number. |
<properties> <spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version> </properties>
Tip | |
---|---|
Check the
|
<dependencyManagement> <dependencies> <dependency> <!-- Import dependency management from Spring Boot --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.0.0.M7</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
<dependencyManagement> <dependencies> <!-- Override Spring Data release train provided by Spring Boot --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-releasetrain</artifactId> <version>Fowler-SR2</version> <scope>import</scope> <type>pom</type> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.0.0.M7</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
Note | |
---|---|
In the preceding example, we specify a BOM , but any dependency type can be overridden in the same way. |
Spring Boot includes a
Maven
plugin
that can package the project as an executable jar. Add the plugin to your
<plugins>
section if you want to use it, as shown in the following example:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
Note | |
---|---|
If you use the Spring Boot starter parent pom, you need to add only the plugin. There is no need to configure it unless you want to change the settings defined in the parent. |
To declare dependencies, a typical
ivy.xml
file looks something like the following
example:
<ivy-module version="2.0"> <info organisation="org.springframework.boot" module="spring-boot-sample-ant" /> <configurations> <conf name="compile" description="everything needed to compile this module" /> <conf name="runtime" extends="compile" description="everything needed to run this module" /> </configurations> <dependencies> <dependency org="org.springframework.boot" name="spring-boot-starter" rev="${spring-boot.version}" conf="compile" /> </dependencies> </ivy-module>
A typical
build.xml
looks like the following example:
<project xmlns:ivy="antlib:org.apache.ivy.ant" xmlns:spring-boot="antlib:org.springframework.boot.ant" name="myapp" default="build"> <property name="spring-boot.version" value="2.0.0.M7" /> <target name="resolve" description="--> retrieve dependencies with ivy"> <ivy:retrieve pattern="lib/[conf]/[artifact]-[type]-[revision].[ext]" /> </target> <target name="classpaths" depends="resolve"> <path id="compile.classpath"> <fileset dir="lib/compile" includes="*.jar" /> </path> </target> <target name="init" depends="classpaths"> <mkdir dir="build/classes" /> </target> <target name="compile" depends="init" description="compile"> <javac srcdir="src/main/java" destdir="build/classes" classpathref="compile.classpath" /> </target> <target name="build" depends="compile"> <spring-boot:exejar destfile="build/myapp.jar" classes="build/classes"> <spring-boot:lib> <fileset dir="lib/runtime" /> </spring-boot:lib> </spring-boot:exejar> </target> </project>
Tip | |
---|---|
If you do not want to use the
|
As explained in the “
Creating Your
Own Starter
” section, third party starters should not start with
spring-boot
, as it
is reserved for official Spring Boot artifacts. Rather, a third-party starter typically
starts with the name of the project. For example, a third-party starter project called
thirdpartyproject
would typically be named
thirdpartyproject-spring-boot-starter
.
The following application starters are provided by Spring Boot under the
org.springframework.boot
group:
Table 13.1. Spring Boot application starters
Name | Description | Pom |
---|---|---|
Core starter, including auto-configuration support, logging and YAML |
||
Starter for JMS messaging using Apache ActiveMQ |
||
Starter for using Spring AMQP and Rabbit MQ |
||
Starter for aspect-oriented programming with Spring AOP and AspectJ |
||
Starter for JMS messaging using Apache Artemis |
||
Starter for using Spring Batch |
||
Starter for using Spring Framework’s caching support |
||
Starter for using Spring Cloud Connectors which simplifies connecting to services in cloud platforms like Cloud Foundry and Heroku |
||
Starter for using Cassandra distributed database and Spring Data Cassandra |
||
Starter for using Cassandra distributed database and Spring Data Cassandra Reactive |
||
Starter for using Couchbase document-oriented database and Spring Data Couchbase |
||
Starter for using Couchbase document-oriented database and Spring Data Couchbase Reactive |
||
Starter for using Elasticsearch search and analytics engine and Spring Data Elasticsearch |
||
Starter for using Spring Data JPA with Hibernate |
||
Starter for using Spring Data LDAP |
||
Starter for using MongoDB document-oriented database and Spring Data MongoDB |
||
Starter for using MongoDB document-oriented database and Spring Data MongoDB Reactive |
||
Starter for using Neo4j graph database and Spring Data Neo4j |
||
Starter for using Redis key-value data store with Spring Data Redis and the Lettuce client |
||
Starter for using Redis key-value data store with Spring Data Redis reactive and the Lettuce client |
||
Starter for exposing Spring Data repositories over REST using Spring Data REST |
||
Starter for using the Apache Solr search platform with Spring Data Solr |
||
Starter for building MVC web applications using FreeMarker views |
||
Starter for building MVC web applications using Groovy Templates views |
||
Starter for building hypermedia-based RESTful web application with Spring MVC and Spring HATEOAS |
||
Starter for using Spring Integration |
||
Starter for using JDBC with the Tomcat JDBC connection pool |
||
Starter for building RESTful web applications using JAX-RS and Jersey. An alternative to
|
||
Starter for using jOOQ to access SQL databases. An alternative to
|
||
Starter for reading and writing json |
||
Starter for JTA transactions using Atomikos |
||
Starter for JTA transactions using Bitronix |
||
Spring Boot Narayana JTA Starter |
||
Starter for using Java Mail and Spring Framework’s email sending support |
||
Starter for building web applications using Mustache views |
||
Spring Boot Quartz Starter |
||
Starter for using Spring Security |
||
Starter for testing Spring Boot applications with libraries including JUnit, Hamcrest and Mockito |
||
Starter for building MVC web applications using Thymeleaf views |
||
Starter for using Java Bean Validation with Hibernate Validator |
||
Starter for building web, including RESTful, applications using Spring MVC. Uses Tomcat as the default embedded container |
||
Starter for using Spring Web Services |
||
Starter for building WebFlux applications using Spring Framework’s Reactive Web support |
||
Starter for building WebSocket applications using Spring Framework’s WebSocket support |
In addition to the application starters, the following starters can be used to add production ready features:
Finally, Spring Boot also includes the following starters that can be used if you want to exclude or swap specific technical facets:
Table 13.3. Spring Boot technical starters
Name | Description | Pom |
---|---|---|
Starter for using Jetty as the embedded servlet container. An alternative to
|
||
Starter for using Log4j2 for logging. An alternative to
|
||
Starter for logging using Logback. Default logging starter |
||
Starter for using Reactor Netty as the embedded reactive HTTP server. |
||
Starter for using Tomcat as the embedded servlet container. Default servlet container starter used by
|
||
Starter for using Undertow as the embedded servlet container. An alternative to
|
Tip | |
---|---|
For a list of additional community contributed starters, see the
README file
in
the
|
Tip | |
---|---|
We recommend that you follow Java’s recommended package naming conventions and use a
reversed domain name (for example,
|
The following listing shows a typical layout:
com +- example +- myapplication +- Application.java +- customer | +- Customer.java | +- CustomerController.java | +- CustomerService.java | +- CustomerRepository.java +- order +- Order.java +- OrderController.java +- OrderService.java +- OrderRepository.java
package com.example.myapplication; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @EnableAutoConfiguration @ComponentScan public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }
Tip | |
---|---|
Many Spring configuration examples have been published on the Internet that use XML
configuration. If possible, always try to use the equivalent Java-based configuration.
Searching for
|
Tip | |
---|---|
You should only ever add one
|
import org.springframework.boot.autoconfigure.*; import org.springframework.boot.autoconfigure.jdbc.*; import org.springframework.context.annotation.*; @Configuration @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) public class MyConfiguration { }
Tip | |
---|---|
You can define exclusions both at the annotation level and by using the property. |
package com.example.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class DatabaseAccountService implements AccountService { private final RiskAssessor riskAssessor; @Autowired public DatabaseAccountService(RiskAssessor riskAssessor) { this.riskAssessor = riskAssessor; // ... }
If a bean has one constructor, you can omit the
@Autowired
, as shown in the following
example:
@Service public class DatabaseAccountService implements AccountService { private final RiskAssessor riskAssessor; public DatabaseAccountService(RiskAssessor riskAssessor) { this.riskAssessor = riskAssessor; // ... }
Tip | |
---|---|
Notice how using constructor injection lets the
|
Many Spring Boot developers always have their main class annotated with
@Configuration
,
@EnableAutoConfiguration
, and
@ComponentScan
. Since these annotations are so
frequently used together (especially if you follow the
best practices
above), Spring Boot provides a
convenient
@SpringBootApplication
alternative.
The
@SpringBootApplication
annotation is equivalent to using
@Configuration
,
@EnableAutoConfiguration
, and
@ComponentScan
with their default attributes, as shown
in the following example:
package com.example.myapplication; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }
Note | |
---|---|
|
Note | |
---|---|
This section only covers jar based packaging. If you choose to package your application as a war file, you should refer to your server and IDE documentation. |
If you cannot directly import your project into your IDE, you may be able to generate IDE metadata by using a build plugin. Maven includes plugins for Eclipse and IDEA . Gradle offers plugins for various IDEs .
Tip | |
---|---|
If you accidentally run a web application twice, you see a “Port already in use”
error. STS users can use the
|
$ java -jar target/myapplication-0.0.1-SNAPSHOT.jar
$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \ -jar target/myapplication-0.0.1-SNAPSHOT.jar
Since Spring Boot applications are just plain Java applications, JVM hot-swapping should work out of the box. JVM hot swapping is somewhat limited with the bytecode that it can replace. For a more complete solution, JRebel can be used.
The
spring-boot-devtools
module also includes support for quick application restarts.
See the
Chapter 20,
Developer Tools
section below and the
Hot swapping “How-to”
for details.
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> </dependencies>
dependencies { compile("org.springframework.boot:spring-boot-devtools")
Note Developer tools are automatically disabled when running a fully packaged application. If your application is launched using
java -jar
or if it is started from a special classloader, then it is considered a “production application”. Flagging the dependency as optional is a best practice that prevents devtools from being transitively applied to other modules using your project. Gradle does not supportoptional
dependencies out-of-the-box, so you may want to have a look at thepropdeps-plugin
.
Tip Repackaged archives do not contain devtools by default. If you want to use a certain remote devtools feature, you need to disable the
excludeDevtools
build property to include it. The property is supported with both the Maven and Gradle plugins.Several of the libraries supported by Spring Boot use caches to improve performance. For example, template engines cache compiled templates to avoid repeatedly parsing template files. Also, Spring MVC can add HTTP caching headers to responses when serving static resources.
While caching is very beneficial in production, it can be counter-productive during development, preventing you from seeing the changes you just made in your application. For this reason, spring-boot-devtools disables the caching options by default.
Cache options are usually configured by settings in your
application.properties
file. For example, Thymeleaf offers thespring.thymeleaf.cache
property. Rather than needing to set these properties manually, thespring-boot-devtools
module automatically applies sensible development-time configuration.
Tip For a complete list of the properties that are applied by the devtools, see DevToolsPropertyDefaultsPostProcessor.
Applications that use
spring-boot-devtools
automatically restart whenever files on the classpath change. This can be a useful feature when working in an IDE, as it gives a very fast feedback loop for code changes. By default, any entry on the classpath that points to a folder is monitored for changes. Note that certain resources, such as static assets and view templates, do not need to restart the application.Triggering a restart
As DevTools monitors classpath resources, the only way to trigger a restart is to update the classpath. The way in which you cause the classpath to be updated depends on the IDE that you are using. In Eclipse, saving a modified file causes the classpath to be updated and triggers a restart. In IntelliJ IDEA, building the project (
Build -> Make Project
) has the same effect.
Note As long as forking is enabled, you can also start your application by using the supported build plugins (Maven and Gradle), since DevTools needs an isolated application classloader to operate properly. By default, Gradle and Maven do that when they detect DevTools on the classpath.
Tip Automatic restart works very well when used with LiveReload. See the LiveReload section for details. If you use JRebel, automatic restarts are disabled in favor of dynamic class reloading. Other devtools features (such as LiveReload and property overrides) can still be used.
Note DevTools relies on the application context’s shutdown hook to close it during a restart. It does not work correctly if you have disabled the shutdown hook (
SpringApplication.setRegisterShutdownHook(false)
).
Note When deciding if an entry on the classpath should trigger a restart when it changes, DevTools automatically ignores projects named
spring-boot
,spring-boot-devtools
,spring-boot-autoconfigure
,spring-boot-actuator
, andspring-boot-starter
.
Note DevTools needs to customize the
ResourceLoader
used by theApplicationContext
. If your application provides one already, it is going to be wrapped. Direct override of thegetResource
method on theApplicationContext
is not supported.Restart vs Reload
The restart technology provided by Spring Boot works by using two classloaders. Classes that do not change (for example, those from third-party jars) are loaded into a base classloader. Classes that you are actively developing are loaded into a restart classloader. When the application is restarted, the restart classloader is thrown away and a new one is created. This approach means that application restarts are typically much faster than “cold starts”, since the base classloader is already available and populated.
If you find that restarts are not quick enough for your applications or you encounter classloading issues, you could consider reloading technologies such as JRebel from ZeroTurnaround. These work by rewriting classes as they are loaded to make them more amenable to reloading.
To disable the logging of the report, set the following property:
spring.devtools.restart.log-condition-evaluation-delta=falseCertain resources do not necessarily need to trigger a restart when they are changed. For example, Thymeleaf templates can be edited in-place. By default, changing resources in
/META-INF/maven
,/META-INF/resources
,/resources
,/static
,/public
, or/templates
does not trigger a restart but does trigger a live reload. If you want to customize these exclusions, you can use thespring.devtools.restart.exclude
property. For example, to exclude only/static
and/public
you would set the following property:spring.devtools.restart.exclude=static/**,public/**
Tip If you want to keep those defaults and add additional exclusions, use the
spring.devtools.restart.additional-exclude
property instead.You may want your application to be restarted or reloaded when you make changes to files that are not on the classpath. To do so, use the
spring.devtools.restart.additional-paths
property to configure additional paths to watch for changes. You can use thespring.devtools.restart.exclude
property described above to control whether changes beneath the additional paths trigger a full restart or a live reload.
Tip You might want to set
spring.devtools.restart.trigger-file
as a global setting, so that all your projects behave in the same way.As described in the Restart vs Reload section above, restart functionality is implemented by using two classloaders. For most applications, this approach works well. However, sometimes it can cause classloading issues.
By default, any open project in your IDE is loaded with the “restart” classloader, and any regular
.jar
file is loaded with the “base” classloader. If you work on a multi-module project, and not every module is imported into your IDE, you may need to customize things. To do so, you can create aMETA-INF/spring-devtools.properties
file.The
spring-devtools.properties
file can contain properties prefixed withrestart.exclude
andrestart.include
. Theinclude
elements are items that should be pulled up into the “restart” classloader, and theexclude
elements are items that should be pushed down into the “base” classloader. The value of the property is a regex pattern that is applied to the classpath, as shown in the following example:restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
Note All property keys must be unique. As long as a property starts with
restart.include.
orrestart.exclude.
it is considered.
Tip All
META-INF/spring-devtools.properties
from the classpath will be loaded. You can package files inside your project, or in the libraries that the project consumes.The
spring-boot-devtools
module includes an embedded LiveReload server that can be used to trigger a browser refresh when a resource is changed. LiveReload browser extensions are freely available for Chrome, Firefox and Safari from livereload.com.If you do not want to start the LiveReload server when your application runs, you can set the
spring.devtools.livereload.enabled
property tofalse
.
Note You can only run one LiveReload server at a time. Before starting your application, ensure that no other LiveReload servers are running. If you start multiple applications from your IDE, only the first has LiveReload support.
You can configure global devtools settings by adding a file named
.spring-boot-devtools.properties
to your$HOME
folder (note that the filename starts with “.”). Any properties added to this file apply to all Spring Boot applications on your machine that use devtools. For example, to configure restart to always use a trigger file, you would add the following property:~/.spring-boot-devtools.properties.
spring.devtools.reload.trigger-file=.reloadtrigger
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludeDevtools>false</excludeDevtools> </configuration> </plugin> </plugins> </build>Then you need to set a
spring.devtools.remote.secret
property, as shown in the following example:spring.devtools.remote.secret=mysecret
Warning Enabling
spring-boot-devtools
on a remote application is a security risk. You should never enable support on a production deployment.A running remote client might resemble the following listing:
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \ \\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) ) ' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / / =========|_|==============|___/===================================/_/_/_/ :: Spring Boot Remote :: 2.0.0.M7 2015-06-10 18:25:06.632 INFO 14938 --- [ main] o.s.b.devtools.RemoteSpringApplication : Starting RemoteSpringApplication on pwmbp with PID 14938 (/Users/pwebb/projects/spring-boot/code/spring-boot-devtools/target/classes started by pwebb in /Users/pwebb/projects/spring-boot/code/spring-boot-samples/spring-boot-sample-devtools) 2015-06-10 18:25:06.671 INFO 14938 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2a17b7b6: startup date [Wed Jun 10 18:25:06 PDT 2015]; root of context hierarchy 2015-06-10 18:25:07.043 WARN 14938 --- [ main] o.s.b.d.r.c.RemoteClientConfiguration : The connection to http://localhost:8080 is insecure. You should use a URL starting with 'https://'. 2015-06-10 18:25:07.074 INFO 14938 --- [ main] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 2015-06-10 18:25:07.130 INFO 14938 --- [ main] o.s.b.devtools.RemoteSpringApplication : Started RemoteSpringApplication in 0.74 seconds (JVM running for 1.105)
Note Because the remote client is using the same classpath as the real application it can directly read application properties. This is how the
spring.devtools.remote.secret
property is read and passed to the server for authentication.
Tip It is always advisable to use
https://
as the connection protocol, so that traffic is encrypted and passwords cannot be intercepted.
Tip If you need to use a proxy to access the remote application, configure the
spring.devtools.remote.proxy.host
andspring.devtools.remote.proxy.port
properties.The remote client monitors your application classpath for changes in the same way as the local restart. Any updated resource is pushed to the remote application and (if required) triggers a restart. This can be helpful if you iterate on a feature that uses a cloud service that you do not have locally. Generally, remote updates and restarts are much quicker than a full rebuild and deploy cycle.
Note Files are only monitored when the remote client is running. If you change a file before starting the remote client, it is not pushed to the remote server.
For additional “production ready” features, such as health, auditing, and metric REST
or JMX end-points, consider adding
spring-boot-actuator
. See
Part V, “Spring Boot Actuator: Production-ready features”
for details.
You should now understand how you can use Spring Boot and some best practices that you should follow. You can now go on to learn about specific Spring Boot features in depth, or you could skip ahead and read about the “ production ready ” aspects of Spring Boot.
This section dives into the details of Spring Boot. Here you can learn about the key features that you may want to use and customize. If you have not already done so, you might want to read the " Part II, “Getting Started” " and " Part III, “Using Spring Boot” " sections so that you have a good grounding of the basics.
public static void main(String[] args) { SpringApplication.run(MySpringConfiguration.class, args); }
When your application starts, you should see something similar to the following output:
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: v2.0.0.M7 2013-07-31 00:08:16.117 INFO 56603 --- [ main] o.s.b.s.app.SampleApplication : Starting SampleApplication v0.1.0 on mycomputer with PID 56603 (/apps/myapp.jar started by pwebb) 2013-07-31 00:08:16.166 INFO 56603 --- [ main] ationConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6e5a8246: startup date [Wed Jul 31 00:08:16 PDT 2013]; root of context hierarchy 2014-03-04 13:09:54.912 INFO 41370 --- [ main] .t.TomcatServletWebServerFactory : Server initialized with port: 8080 2014-03-04 13:09:56.501 INFO 41370 --- [ main] o.s.b.s.app.SampleApplication : Started SampleApplication in 2.992 seconds (JVM running for 3.658)
*************************** APPLICATION FAILED TO START *************************** Description: Embedded servlet container failed to start. Port 8080 was already in use. Action: Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.
Note | |
---|---|
Spring Boot provides numerous
|
If no failure analyzers are able to handle the exception, you can still display the full
conditions report to better understand what went wrong. To do so, you need to
enable the
debug
property
or
enable
DEBUG
logging
for
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
.
For instance, if you are running your application by using
java -jar
, you can enable
the
debug
property as follows:
$ java -jar myproject-0.0.1-SNAPSHOT.jar --debug
Inside your
banner.txt
file, you can use any of the following placeholders:
Table 23.1. Banner variables
Variable | Description |
---|---|
|
The version number of your application, as declared in
|
|
The version number of your application, as declared in
|
|
The Spring Boot version that you are using. For example
|
|
The Spring Boot version that you are using, formatted for display (surrounded with
brackets and prefixed with
|
|
Where
|
|
The title of your application, as declared in
|
Tip | |
---|---|
The
|
You can also use the
spring.main.banner-mode
property to determine if the banner has
to be printed on
System.out
(
console
), sent to the configured logger (
log
), or not
produced at all (
off
).
The printed banner is registered as a singleton bean under the following name:
springBootBanner
.
Note | |
---|---|
YAML maps
spring: main: banner-mode: "off" |
public static void main(String[] args) { SpringApplication app = new SpringApplication(MySpringConfiguration.class); app.setBannerMode(Banner.Mode.OFF); app.run(args); }
Note | |
---|---|
The constructor arguments passed to
|
It is also possible to configure the
SpringApplication
by using an
application.properties
file. See
Chapter 24,
Externalized Configuration
for details.
For a complete list of the configuration options, see the
SpringApplication
Javadoc
.
new SpringApplicationBuilder() .sources(Parent.class) .child(Application.class) .bannerMode(Banner.Mode.OFF) .run(args);
Note | |
---|---|
There are some restrictions when creating an
|
In addition to the usual Spring Framework events, such as
ContextRefreshedEvent
,
a
SpringApplication
sends some additional application events.
Note | |
---|---|
Some events are actually triggered before the
If you want those listeners to be registered automatically, regardless of the way the
application is created, you can add a
org.springframework.context.ApplicationListener=com.example.project.MyListener |
Application events are sent in the following order, as your application runs:
ApplicationStartingEvent
is sent at the start of a run but before any processing
except the registration of listeners and initializers.
ApplicationEnvironmentPreparedEvent
is sent when the
Environment
to be used in
the context is known but before the context is created.
ApplicationPreparedEvent
is sent just before the refresh is started but after bean
definitions have been loaded.
ApplicationReadyEvent
is sent after the refresh and any related callbacks have
been processed, to indicate that the application is ready to service requests.
ApplicationFailedEvent
is sent if there is an exception on startup.
Tip | |
---|---|
You often need not use application events, but it can be handy to know that they exist. Internally, Spring Boot uses events to handle a variety of tasks. |
Application events are sent by using Spring Framework’s event publishing mechanism. Part
of this mechanism ensures that an event published to the listeners in a child context is
also published to the listeners in any ancestors contexts. As a result of this, if your
application uses a hierarchy of
SpringApplication
instances, a listener may receive
multiple instances of the same type of application event.
To allow your listener to distinguish between an event for its context and an event for
a descendant context, it should request that its application context is injected and then
compare the injected context with the context of the event. The context can be injected
by implementing
ApplicationContextAware
or, if the listener is a bean, by using
@Autowired
.
Tip | |
---|---|
It is often desirable to call
|
import org.springframework.boot.* import org.springframework.beans.factory.annotation.* import org.springframework.stereotype.* @Component public class MyBean { @Autowired public MyBean(ApplicationArguments args) { boolean debug = args.containsOption("debug"); List<String> files = args.getNonOptionArgs(); // if run with "--debug logfile.txt" debug=true, files=["logfile.txt"] }
Tip | |
---|---|
Spring Boot also registers a
|
It is possible to enable admin-related features for the application by specifying the
spring.application.admin.enabled
property. This exposes the
SpringApplicationAdminMXBean
on the platform
MBeanServer
. You could use this feature to administer your Spring Boot
application remotely. This feature could also be useful for any service wrapper
implementation.
Tip | |
---|---|
If you want to know on which HTTP port the application is running, get the property
with a key of
|
Caution | |
---|---|
Take care when enabling this feature, as the MBean exposes a method to shutdown the application. |
Spring Boot lets you externalize your configuration so that you can work with the same
application code in different environments. You can use properties files, YAML files,
environment variables, and command-line arguments to externalize configuration. Property
values can be injected directly into your beans by using the
@Value
annotation,
accessed through Spring’s
Environment
abstraction or
bound to structured
objects
through
@ConfigurationProperties
.
Spring Boot uses a very particular
PropertySource
order that is designed to allow
sensible overriding of values. Properties are considered in the following order:
~/.spring-boot-devtools.properties
when devtools is active).
@TestPropertySource
annotations on your tests.
@SpringBootTest#properties
annotation attribute on your tests.
SPRING_APPLICATION_JSON
(inline JSON embedded in an environment
variable or system property).
ServletConfig
init parameters.
ServletContext
init parameters.
java:comp/env
.
System.getProperties()
).
RandomValuePropertySource
that only has properties in
random.*
.
application-{profile}.properties
and YAML variants).
application-{profile}.properties
and YAML variants).
application.properties
and YAML
variants).
application.properties
and YAML
variants).
@PropertySource
annotations on your
@Configuration
classes.
SpringApplication.setDefaultProperties
).
To provide a concrete example, suppose you develop a
@Component
that uses a
name
property, as shown in the following example:
import org.springframework.stereotype.* import org.springframework.beans.factory.annotation.* @Component public class MyBean { @Value("${name}") private String name; // ... }
On your application classpath (for example, inside your jar) you can have an
application.properties
file that provides a sensible default property value for
name
.
When running in a new environment, an
application.properties
file can be provided
outside of your jar that overrides the
name
. For one-off testing, you can launch with a
specific command line switch (for example,
java -jar app.jar --name="Spring"
).
Tip | |
---|---|
The
$ SPRING_APPLICATION_JSON='{"foo":{"bar":"spam"}}' java -jar myapp.jar
In the preceding example, you end up with
$ java -Dspring.application.json='{"foo":"bar"}' -jar myapp.jar You can also supply the JSON by using a command line argument, as shown in the following example: $ java -jar myapp.jar --spring.application.json='{"foo":"bar"}'
You can also supply the JSON as a JNDI variable, as follows:
|
Note | |
---|---|
You can also use YAML ('.yml') files as an alternative to '.properties'. |
$ java -jar myproject.jar --spring.config.name=myproject
The following example shows how to specify two locations:
$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
Warning | |
---|---|
|
Note | |
---|---|
If you use environment variables rather than system properties, most operating
systems disallow period-separated key names, but you can use underscores instead (for
example,
|
Note | |
---|---|
If your application runs in a container, then JNDI properties (in
|
Note | |
---|---|
If you have specified any files in
|
app.name=MyApp app.description=${app.name} is a Spring Boot application
Tip | |
---|---|
You can also use this technique to create ‘short’ variants of existing Spring Boot properties. See the Section 73.4, “Use ‘Short’ Command Line Arguments” how-to for details. |
YAML
is a superset of JSON and, as such, is a very convenient format for
specifying hierarchical configuration data. The
SpringApplication
class automatically
supports YAML as an alternative to properties whenever you have the
SnakeYAML
library on your classpath.
Note | |
---|---|
If you use ‘Starters’, SnakeYAML is automatically provided by
|
For example, consider the following YAML document:
environments: dev: url: http://dev.bar.com name: Developer Setup prod: url: http://foo.bar.com name: My Cool App
The preceding example would be transformed into the following properties:
environments.dev.url=http://dev.bar.com environments.dev.name=Developer Setup environments.prod.url=http://foo.bar.com environments.prod.name=My Cool App
my: servers: - dev.bar.com - foo.bar.com
The preceding example would be transformed into these properties:
my.servers[0]=dev.bar.com my.servers[1]=foo.bar.com
@ConfigurationProperties(prefix="my") public class Config { private List<String> servers = new ArrayList<String>(); public List<String> getServers() { return this.servers; }
Note | |
---|---|
When lists are configured in more than one place, overriding works by replacing the entire list.
In the preceding example, when
|
server: address: 192.168.1.100 spring: profiles: development server: address: 127.0.0.1 spring: profiles: production server: address: 192.168.1.120
server: port: 8000 spring: profiles: default security: user: password: weak
server: port: 8000 security: user: password: weak
As we have seen above , any YAML content is ultimately transformed to properties. That process may be counter-intuitive when overriding “list” properties through a profile.
For example, assume a
MyPojo
object with
name
and
description
attributes that are
null
by default. The following example exposes a list of
MyPojo
from
FooProperties
:
@ConfigurationProperties("foo") public class FooProperties { private final List<MyPojo> list = new ArrayList<>(); public List<MyPojo> getList() { return this.list; }
Consider the following configuration:
foo: list: - name: my name description: my description spring: profiles: dev foo: list: - name: my another name
If the
dev
profile is not active,
FooProperties.list
contains one
MyPojo
entry
as defined above. If the
dev
profile is enabled however, the
list
still
contains only one entry (with a name of “my another name” and a description of
null
).
This configuration
does not
add a second
MyPojo
instance to the list, and it does not
merge the items.
When a collection is specified in multiple profiles, the one with the highest priority (and only that one) is used:
foo: list: - name: my name description: my description - name: another name description: another description spring: profiles: dev foo: list: - name: my another name
In the preceding example, if the
dev
profile is active,
FooProperties.list
contains
one
MyPojo
entry (with a name of “my another name” and a description of
null
).
package com.example; import java.net.InetAddress; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties("foo") public class FooProperties { private boolean enabled; private InetAddress remoteAddress; private final Security security = new Security(); public boolean isEnabled() { ... } public void setEnabled(boolean enabled) { ... } public InetAddress getRemoteAddress() { ... } public void setRemoteAddress(InetAddress remoteAddress) { ... } public Security getSecurity() { ... } public static class Security { private String username; private String password; private List<String> roles = new ArrayList<>(Collections.singleton("USER")); public String getUsername() { ... } public void setUsername(String username) { ... } public String getPassword() { ... } public void setPassword(String password) { ... } public List<String> getRoles() { ... } public void setRoles(List<String> roles) { ... } }
The preceding POJO defines the following properties:
foo.enabled
,
false
by default.
foo.remote-address
, with a type that can be coerced from
String
.
foo.security.username
, with a nested "security" object whose name is determined by
the name of the property. In particular, the return type is not used at all there and
could have been
SecurityProperties
.
foo.security.password
.
foo.security.roles
, with a collection of
String
.
Note | |
---|---|
Getters and setters are usually mandatory, since binding is through standard Java Beans property descriptors, just like in Spring MVC. A setter may be omitted in the following cases:
Some people use Project Lombok to add getters and setters automatically. Make sure that Lombok does not generate any particular constructor for such type, as it is used automatically by the container to instantiate the object. |
Tip | |
---|---|
See also the
differences between
|
@Configuration @EnableConfigurationProperties(FooProperties.class) public class MyConfiguration { }
Note | |
---|---|
When the
The bean name in the example above is
|
@Component @ConfigurationProperties(prefix="foo") public class FooProperties { // ... see the preceding example }
# application.yml foo: remote-address: 192.168.1.1 security: username: foo roles: - USER - ADMIN # additional configuration as required
@Service public class MyService { private final FooProperties properties; @Autowired public MyService(FooProperties properties) { this.properties = properties; //... @PostConstruct public void openConnection() { Server server = new Server(this.properties.getRemoteAddress()); // ... }
Tip | |
---|---|
Using
|
For example, consider the following
@ConfigurationProperties
class:
@ConfigurationProperties(prefix="acme.my-project.person") public class OwnerProperties { private String firstName; public String getFirstName() { return this.firstName; public void setFirstName(String firstName) { this.firstName = firstName; }
In the preceding example, the following properties names can all be used:
Note | |
---|---|
The
|
Table 24.2. relaxed binding rules per property source
Property Source | Simple | List |
---|---|---|
Properties Files |
Camel case, kebab case, or underscore notation |
Standard list syntax using
|
YAML Files |
Camel case, kebab case, or underscore notation |
Standard YAML list syntax or comma-separated values |
Environment Variables |
Upper case format with underscore as the delimiter.
|
Numeric values surrounded by underscores, such as
|
System properties |
Camel case, kebab case, or underscore notation |
Standard list syntax using
|
Tip | |
---|---|
We recommend that, when possible, properties are stored in lower-case kebab format,
such as
|
Note | |
---|---|
As this bean is requested very early during the application lifecycle, make sure to
limit the dependencies that your
|
@ConfigurationProperties(prefix="foo") @Validated public class FooProperties { @NotNull private InetAddress remoteAddress; // ... getters and setters }
@ConfigurationProperties(prefix="connection") @Validated public class FooProperties { @NotNull private InetAddress remoteAddress; @Valid private final Security security = new Security(); // ... getters and setters public static class Security { @NotEmpty public String username; // ... getters and setters }
You can also add a custom Spring
Validator
by creating a bean definition called
configurationPropertiesValidator
. The
@Bean
method should be declared
static
. The
configuration properties validator is created very early in the application’s lifecycle,
and declaring the
@Bean
method as static lets the bean be created without having to
instantiate the
@Configuration
class. Doing so avoids any problems that may be caused
by early instantiation. There is a
property
validation sample
that shows how to set things up.
Tip | |
---|---|
The
|
Feature |
@ConfigurationProperties
|
@Value
|
---|---|---|
Yes |
No |
|
Yes |
No |
|
|
No |
Yes |
Finally, while you can write a
SpEL
expression in
@Value
, such expressions are not
processed from
Application
property files
.
@Configuration @Profile("production") public class ProductionConfiguration { // ... }
spring.profiles.active=dev,hsqldb
--- my.property: fromyamlfile spring.profiles: prod spring.profiles.include: - proddb - prodmq
Note | |
---|---|
Remember that the
|
Spring Boot uses Commons Logging for all internal logging but leaves the underlying log implementation open. Default configurations are provided for Java Util Logging , Log4J2 , and Logback . In each case, loggers are pre-configured to use console output with optional file output also available.
By default, if you use the ‘Starters’, Logback is used for logging. Appropriate Logback routing is also included to ensure that dependent libraries that use Java Util Logging, Commons Logging, Log4J, or SLF4J all work correctly.
Tip | |
---|---|
There are a lot of logging frameworks available for Java. Do not worry if the above list seems confusing. Generally, you do not need to change your logging dependencies and the Spring Boot defaults work just fine. |
The default log output from Spring Boot resembles the following example:
2014-03-05 10:57:51.112 INFO 45469 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/7.0.52 2014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1358 ms 2014-03-05 10:57:51.698 INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/] 2014-03-05 10:57:51.702 INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
The following items are output:
ERROR
,
WARN
,
INFO
,
DEBUG
, or
TRACE
.
---
separator to distinguish the start of actual log messages.
Note | |
---|---|
Logback does not have a
|
$ java -jar myapp.jar --debug
Note | |
---|---|
You can also specify
|
If your terminal supports ANSI, color output is used to aid readability. You can set
spring.output.ansi.enabled
to a
supported value
to override the auto
detection.
Color coding is configured by using the
%clr
conversion word. In its simplest form the
converter colors the output according to the log level, as shown in the following
example:
%clr(%5p)
The mapping of log level to a color is as follows:
Level | Color |
---|---|
|
Red |
|
Red |
|
Yellow |
|
Green |
|
Green |
|
Green |
Alternatively, you can specify the color or style that should be used by providing it as an option to the conversion. For example, to make the text yellow, use the following setting:
%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow}
The following colors and styles are supported:
blue
cyan
faint
green
magenta
red
yellow
The following table shows how the
logging.*
properties can be used together:
Log files rotate when they reach 10 MB and, as with console output,
ERROR
-level,
WARN
-level, and
INFO
-level messages are logged by default. Size limits can be changed
using the
logging.file.max-size
property. Previously rotated files are archived
indefinitely unless the
logging.file.max-history
property has been set.
Note | |
---|---|
The logging system is initialized early in the application lifecycle. Consequently,
logging properties are not found in property files loaded through
|
Tip | |
---|---|
Logging properties are independent of the actual logging infrastructure. As a
result, specific configuration keys (such as
|
Note | |
---|---|
Since logging is initialized
before
the
|
Depending on your logging system, the following files are loaded:
Logging System | Customization |
---|---|
Logback |
|
Log4j2 |
|
JDK (Java Util Logging) |
|
Note | |
---|---|
When possible, we recommend that you use the
|
Warning | |
---|---|
There are known classloading issues with Java Util Logging that cause problems when running from an 'executable jar'. We recommend that you avoid it when running from an 'executable jar' if at all possible. |
Spring Environment | System Property | Comments |
---|---|---|
|
|
The conversion word used when logging exceptions. |
|
|
If defined, it is used in the default log configuration. |
|
|
Maximum log file size (if LOG_FILE enabled). (Only supported with the default logback setup.) |
|
|
Maximum number of archive log files to keep (if LOG_FILE enabled). (Only supported with the default logback setup.) |
|
|
If defined, it is used in the default log configuration. |
|
|
The log pattern to use on the console (stdout). (Only supported with the default logback setup.) |
|
|
The log pattern to use in a file (if
|
|
|
The format to use when rendering the log level (default
|
|
|
The current process ID (discovered if possible and when not already defined as an OS environment variable). |
Tip | |
---|---|
If you want to use a placeholder in a logging property, you should use
Spring Boot’s syntax
and not
the syntax of the underlying framework. Notably, if you use Logback, you should use
|
Tip | |
---|---|
You can add MDC and other ad-hoc content to log lines by overriding only the
2015-09-30 12:30:04.031 user:someone INFO 22174 --- [ nio-8080-exec-0] demo.Controller Handling authenticated request |
Note | |
---|---|
Because the standard
|
Warning | |
---|---|
The extensions cannot be used with Logback’s configuration scanning . If you attempt to do so, making changes to the configuration file results in an error similar to one of the following being logged: |
ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProperty], current ElementPath is [[configuration][springProperty]] ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProfile], current ElementPath is [[configuration][springProfile]]
<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host" defaultValue="localhost"/> <appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender"> <remoteHost>${fluentHost}</remoteHost> </appender>
Note | |
---|---|
The
|
If you have not yet developed a Spring Boot web application, you can follow the "Hello World!" example in the Getting started section.
The following code shows a typical example
@RestController
to serve JSON data:
@RestController @RequestMapping(value="/users") public class MyRestController { @RequestMapping(value="/{user}", method=RequestMethod.GET) public User getUser(@PathVariable Long user) { // ... @RequestMapping(value="/{user}/customers", method=RequestMethod.GET) List<Customer> getUserCustomers(@PathVariable Long user) { // ... @RequestMapping(value="/{user}", method=RequestMethod.DELETE) public User deleteUser(@PathVariable Long user) { // ... }
Spring MVC is part of the core Spring Framework, and detailed information is available in the reference documentation . There are also several guides that cover Spring MVC available at spring.io/guides .
Spring Boot provides auto-configuration for Spring MVC that works well with most applications.
The auto-configuration adds the following features on top of Spring’s defaults:
ContentNegotiatingViewResolver
and
BeanNameViewResolver
beans.
Converter
,
GenericConverter
, and
Formatter
beans.
HttpMessageConverters
(see below).
MessageCodesResolver
(covered later in this document).
index.html
support.
Favicon
support (covered later in this document).
ConfigurableWebBindingInitializer
bean (covered later in this
document).
If you want to keep Spring Boot MVC features and you want to add additional
MVC configuration
(interceptors, formatters, view
controllers, and other features), you can add your own
@Configuration
class of type
WebMvcConfigurer
but
without
@EnableWebMvc
. If you wish to provide custom
instances of
RequestMappingHandlerMapping
,
RequestMappingHandlerAdapter
, or
ExceptionHandlerExceptionResolver
, you can declare a
WebMvcRegistrationsAdapter
instance to provide such components.
If you want to take complete control of Spring MVC, you can add your own
@Configuration
annotated with
@EnableWebMvc
.
If you need to add or customize converters, you can use Spring Boot’s
HttpMessageConverters
class:
import org.springframework.boot.autoconfigure.web.HttpMessageConverters; import org.springframework.context.annotation.*; import org.springframework.http.converter.*; @Configuration public class MyConfiguration { @Bean public HttpMessageConverters customConverters() { HttpMessageConverter<?> additional = ... HttpMessageConverter<?> another = ... return new HttpMessageConverters(additional, another); }
If you use Jackson to serialize and deserialize JSON data, you might want to write your
own
JsonSerializer
and
JsonDeserializer
classes. Custom serializers are usually
registered with Jackson through
a module
, but Spring Boot provides an alternative
@JsonComponent
annotation that makes
it easier to directly register Spring Beans.
You can use the
@JsonComponent
annotation directly on
JsonSerializer
or
JsonDeserializer
implementations. You can also use it on classes that contains
serializers/deserializers as inner-classes, as shown in the following example:
import java.io.*; import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.databind.*; import org.springframework.boot.jackson.*; @JsonComponent public class Example { public static class Serializer extends JsonSerializer<SomeObject> { // ... public static class Deserializer extends JsonDeserializer<SomeObject> { // ... }
All
@JsonComponent
beans in the
ApplicationContext
are automatically registered with
Jackson. Because
@JsonComponent
is meta-annotated with
@Component
, the usual
component-scanning rules apply.
Spring Boot also provides
JsonObjectSerializer
and
JsonObjectDeserializer
base
classes that provide useful alternatives to the standard Jackson versions when
serializing objects. See
JsonObjectSerializer
and
JsonObjectDeserializer
in
the Javadoc for details.
Spring MVC has a strategy for generating error codes for rendering error messages from
binding errors:
MessageCodesResolver
. If you set the
spring.mvc.message-codes-resolver.format
property
PREFIX_ERROR_CODE
or
POSTFIX_ERROR_CODE
, Spring Boot creates one for you (see the enumeration in
DefaultMessageCodesResolver.Format
).
spring.mvc.static-path-pattern=/resources/**
In addition to the ‘standard’ static resource locations mentioned earlier, a special
case is made for
Webjars content
. Any resources with a path in
/webjars/**
are served from jar files if they are packaged in the Webjars format.
Tip | |
---|---|
Do not use the
|
Spring Boot also supports the advanced resource handling features provided by Spring MVC, allowing use cases such as cache-busting static resources or using version agnostic URLs for Webjars.
To use version agnostic URLs for Webjars, add the
webjars-locator
dependency.
Then declare your Webjar. Using jQuery as an example, adding
"/webjars/jquery/dist/jquery.min.js"
results in
"/webjars/jquery/x.y.z/dist/jquery.min.js"
. where
x.y.z
is the Webjar version.
Note | |
---|---|
If you are using JBoss, you need to declare the
|
To use cache busting, the following configuration configures a cache busting solution for
all static resources, effectively adding a content hash, such as
<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>
, in URLs:
spring.resources.chain.strategy.content.enabled=true spring.resources.chain.strategy.content.paths=/**
Note | |
---|---|
Links to resources are rewritten in templates at runtime, thanks to a
|
When loading resources dynamically with, for example, a JavaScript module loader, renaming files is not an option. That is why other strategies are also supported and can be combined. A "fixed" strategy adds a static version string in the URL without changing the file name, as shown in the following example:
spring.resources.chain.strategy.content.enabled=true spring.resources.chain.strategy.content.paths=/** spring.resources.chain.strategy.fixed.enabled=true spring.resources.chain.strategy.fixed.paths=/js/lib/ spring.resources.chain.strategy.fixed.version=v12
With this configuration, JavaScript modules located under
"/js/lib/"
use a fixed
versioning strategy (
"/v12/js/lib/mymodule.js"
), while other resources still use the
content one (
<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>
).
See
ResourceProperties
for more of the supported options.
Tip | |
---|---|
This feature has been thoroughly described in a dedicated post and in Spring Framework’s reference documentation . |
Spring Boot includes auto-configuration support for the following templating engines:
Tip | |
---|---|
If possible, JSPs should be avoided. There are several known limitations when using them with embedded servlet containers. |
When you use one of these templating engines with the default configuration, your
templates are picked up automatically from
src/main/resources/templates
.
Tip | |
---|---|
Depending on how you run your application, IntelliJ IDEA orders the classpath
differently. Running your application in the IDE from its main method results in a
different ordering than when you run your application by using Maven or Gradle or from
its packaged jar. This can cause Spring Boot to fail to find the templates on the
classpath. If you have this problem, you can reorder the classpath in the IDE to place
the module’s classes and resources first. Alternatively, you can configure the template
prefix to search every templates directory on the classpath, as follows:
|
Tip | |
---|---|
The
|
@ControllerAdvice(basePackageClasses = FooController.class) public class FooControllerAdvice extends ResponseEntityExceptionHandler { @ExceptionHandler(YourException.class) @ResponseBody ResponseEntity<?> handleControllerException(HttpServletRequest request, Throwable ex) { HttpStatus status = getStatus(request); return new ResponseEntity<>(new CustomErrorType(status.value(), ex.getMessage()), status); private HttpStatus getStatus(HttpServletRequest request) { Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); if (statusCode == null) { return HttpStatus.INTERNAL_SERVER_ERROR; return HttpStatus.valueOf(statusCode); }
For example, to map
404
to a static HTML file, your folder structure would be as
follows:
src/ +- main/ +- java/ | + <source code> +- resources/ +- public/ +- error/ | +- 404.html +- <other public assets>
To map all
5xx
errors by using a FreeMarker template, your folder structure would be as
follows:
src/ +- main/ +- java/ | + <source code> +- resources/ +- templates/ +- error/ | +- 5xx.ftl +- <other templates>
public class MyErrorViewResolver implements ErrorViewResolver { @Override public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) { // Use the request or status to optionally return a ModelAndView return ... }
You can also use regular Spring MVC features such as
@ExceptionHandler
methods
and
@ControllerAdvice
. The
ErrorController
then picks up any unhandled exceptions.
@Bean public ErrorPageRegistrar errorPageRegistrar(){ return new MyErrorPageRegistrar(); // ... private static class MyErrorPageRegistrar implements ErrorPageRegistrar { @Override public void registerErrorPages(ErrorPageRegistry registry) { registry.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/400")); }
Note | |
---|---|
If you register an
|
@Bean public FilterRegistrationBean myFilter() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new MyFilter()); registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class)); return registration; }
Note that the default
FilterRegistrationBean
does not include the
ERROR
dispatcher
type.
Cross-origin resource sharing (CORS) is a W3C specification implemented by most browsers that allows you to specify in a flexible way what kind of cross-domain requests are authorized, instead of using some less secure and less powerful approaches such as IFRAME or JSONP.
As of version 4.2, Spring MVC
supports CORS
.
Using
controller method
CORS configuration
with
@CrossOrigin
annotations in your Spring Boot application does not require any specific configuration.
Global CORS configuration
can be
defined by registering a
WebMvcConfigurer
bean with a customized
addCorsMappings(CorsRegistry)
method, as shown in the following example:
@Configuration public class MyConfiguration { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**"); }
Spring WebFlux is the new reactive web framework introduced in Spring Framework 5.0. Unlike Spring MVC, it does not require the Servlet API, is fully asynchronous and non-blocking, and implements the Reactive Streams specification through the Reactor project .
Spring WebFlux comes in two flavors: functional and annotation-based. The annotation-based one is quite close to the Spring MVC model we know, as shown in the following example:
@RestController @RequestMapping("/users") public class MyRestController { @GetMapping("/{user}") public Mono<User> getUser(@PathVariable Long user) { // ... @GetMapping("/{user}/customers") Flux<Customer> getUserCustomers(@PathVariable Long user) { // ... @DeleteMapping("/{user}") public Mono<User> deleteUser(@PathVariable Long user) { // ... }
‘WebFlux.fn’, the functional variant, separates the routing configuration from the actual handling of the requests, as shown in the following example:
@Configuration public class RoutingConfiguration { @Bean public RouterFunction<ServerResponse> monoRouterFunction(UserHandler userHandler) { return route(GET("/{user}").and(accept(APPLICATION_JSON)), userHandler::getUser) .andRoute(GET("/{user}/customers").and(accept(APPLICATION_JSON)), userHandler::getUserCustomers) .andRoute(DELETE("/{user}").and(accept(APPLICATION_JSON)), userHandler::deleteUser); @Component public class UserHandler { public Mono<ServerResponse> getUser(ServerRequest request) { // ... public Mono<ServerResponse> getUserCustomers(ServerRequest request) { // ... public Mono<ServerResponse> deleteUser(ServerRequest request) { // ... }
WebFlux is part of the Spring Framework. and detailed information is available in its reference documentation .
To get started, add the
spring-boot-starter-webflux
module to your application.
Note | |
---|---|
Adding both
|
Spring Boot provides auto-configuration for Spring WebFlux that works well with most applications.
The auto-configuration adds the following features on top of Spring’s defaults:
If you want to keep Spring Boot WebFlux features and you want to add additional
WebFlux configuration
, you can add your own
@Configuration
class of type
WebFluxConfigurer
but
without
@EnableWebFlux
.
If you want to take complete control of Spring WebFlux, you can add your own
@Configuration
annotated with
@EnableWebFlux
.
import org.springframework.boot.web.codec.CodecCustomizer; @Configuration public class MyConfiguration { @Bean public CodecCustomizer myCodecCustomizer() { return codecConfigurer -> { // ... }
You can also leverage Boot’s custom JSON serializers and deserializers .
spring.webflux.static-path-pattern=/resources/**
In addition to the ‘standard’ static resource locations listed earlier, a special case
is made for
Webjars content
. Any resources with a path in
/webjars/**
are served from jar files if they are packaged in the Webjars format.
Tip | |
---|---|
Spring WebFlux applications do not strictly depend on the Servlet API, so they
cannot be deployed as war files and do not use the
|
Spring Boot includes auto-configuration support for the following templating engines:
When you use one of these templating engines with the default configuration, your
templates are picked up automatically from
src/main/resources/templates
.
Spring Boot provides a
WebExceptionHandler
that handles all errors in a sensible way.
Its position in the processing order is immediately before the handlers provided by
WebFlux, which are considered last. For machine clients it will produce a JSON response
with details of the error, the HTTP status and the exception message. For browser clients
there is a ‘whitelabel’ error handler that renders the same data in HTML format. You
can also provide your own HTML templates to display errors (see the
next section
).
The first step to customizing this feature is often about using the existing mechanism
but replacing or augmenting the error contents. For that, you can simply add a bean of
type
ErrorAttributes
.
To change the error handling behavior, you can implement
ErrorWebExceptionHandler
and
register a bean definition of that type. Because a
WebExceptionHandler
is quite
low-level, Spring Boot also provides a convenient
AbstractErrorWebExceptionHandler
to
let you handle errors in a WebFlux functional way, as shown in the following example:
public class CustomErrorWebExceptionHandler extends AbstractErrorWebExceptionHandler { // Define constructor here @Override protected RouterFunction<ServerResponse> getRoutingFunction(ErrorAttributes errorAttributes) { return RouterFunctions .route(aPredicate, aHandler) .andRoute(anotherPredicate, anotherHandler); }
For a more complete picture, you can also subclass
DefaultErrorWebExceptionHandler
directly and override specific methods.
For example, to map
404
to a static HTML file, your folder structure would be as
follows:
src/ +- main/ +- java/ | + <source code> +- resources/ +- public/ +- error/ | +- 404.html +- <other public assets>
To map all
5xx
errors by using a Mustache template, your folder structure would be as
follows:
src/ +- main/ +- java/ | + <source code> +- resources/ +- templates/ +- error/ | +- 5xx.mustache +- <other templates>
@Component public class JerseyConfig extends ResourceConfig { public JerseyConfig() { register(Endpoint.class); }
Warning | |
---|---|
Jersey’s support for scanning executable archives is rather limited. For
example, it cannot scan for endpoints in a package found in
|
@Component @Path("/hello") public class Endpoint { public String message() { return "Hello"; }
There is a
Jersey sample
so
that you can see how to set things up. There is also a
Jersey 1.x sample
. Note
that, in the Jersey 1.x sample, the spring-boot maven plugin has been configured to
unpack some Jersey jars so that they can be scanned by the JAX-RS implementation (because
the sample asks for them to be scanned in its
Filter
registration). If any of your
JAX-RS resources are packaged as nested jars, you may need to do the same.
Warning | |
---|---|
If you choose to use Tomcat on CentOS, be aware that, by default, a temporary
directory is used to store compiled JSPs, file uploads, and so on. This directory may be
deleted by
|
Tip | |
---|---|
|
Note | |
---|---|
You usually do not need to be aware of these implementation classes. Most
applications are auto-configured, and the appropriate
|
Common server settings include:
server.port
), interface
address to bind to
server.address
, and so on.
server.session.persistence
),
session timeout (
server.session.timeout
), location of session data
(
server.session.store-dir
), and session-cookie configuration
(
server.session.cookie.*
).
server.error.path
), and so on.
Spring Boot tries as much as possible to expose common settings, but this is not always
possible. For those cases, dedicated namespaces offer server-specific customizations (see
server.tomcat
and
server.undertow
). For instance,
access logs
can be configured with specific
features of the embedded servlet container.
Tip | |
---|---|
See the
|
@Bean public ConfigurableServletWebServerFactory webServerFactory() { TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); factory.setPort(9000); factory.setSessionTimeout(10, TimeUnit.MINUTES); factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/notfound.html")); return factory; }
Setters are provided for many configuration options. Several protected method “hooks” are also provided should you need to do something more exotic. See the source code documentation for details.
error.jsp
page does not override the default view for
error handling
.
Custom error pages
should be used
instead.
There is a JSP sample so that you can see how to set things up.
If Spring Security is on the classpath, then web applications are secure by default.
Spring Boot relies on Spring Security’s content-negotiation strategy to determine whether
to use
httpBasic
or
formLogin
. To add method-level security to a web application, you can also add
@EnableGlobalMethodSecurity
with your desired settings. Additional information can be
found in the
Spring Security Reference
.
The default
AuthenticationManager
has a single user (the user name is ‘user’, and the
password is random and is printed at INFO level when the application starts), as shown in
the following example:
Using default security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35
Note | |
---|---|
If you fine-tune your logging configuration, ensure that the
|
The default security configuration is implemented in
SecurityAutoConfiguration
and in
the classes imported from there (
SpringBootWebSecurityConfiguration
for web security
and
AuthenticationManagerConfiguration
for authentication configuration, which is also
relevant in non-web applications). To switch off the default web application security
configuration completely, you can add a bean of type
WebSecurityConfigurerAdapter
(this
does not disable the authentication manager configuration or Actuator’s security).
To also switch off the authentication manager configuration, you can add a bean of type
UserDetailsService
,
AuthenticationProvider
or
AuthenticationManager
.
There are several secure applications in the
Spring
Boot samples
to get you started with common use cases.
The basic features you get by default in a web application are:
UserDetailsService
bean with in-memory store and a single user with a generated
password.
Access rules can be overriden by adding a custom
WebSecurityConfigurerAdapter
. Spring
Boot provides convenience methods that can be used to override access rules for actuator
endpoints and static resources.
EndpointRequest
can be used to create a
RequestMatcher
that is based on the
management.endpoints.web.base-path
property.
StaticResourceRequest
can be used to create a
RequestMatcher
for static resources in
commonly used locations.
OAuth2 is a widely used authorization framework that is supported by Spring.
spring.security.oauth2.client.registration.my-client-1.client-id=abcd spring.security.oauth2.client.registration.my-client-1.client-secret=password spring.security.oauth2.client.registration.my-client-1.client-name=Client for user scope spring.security.oauth2.client.registration.my-client-1.provider=my-oauth-provider spring.security.oauth2.client.registration.my-client-1.scope=user spring.security.oauth2.client.registration.my-client-1.redirect-uri-template=http://my-redirect-uri.com spring.security.oauth2.client.registration.my-client-1.client-authentication-method=basic spring.security.oauth2.client.registration.my-client-1.authorization-grant-type=authorization_code spring.security.oauth2.client.registration.my-client-2.client-id=abcd spring.security.oauth2.client.registration.my-client-2.client-secret=password spring.security.oauth2.client.registration.my-client-2.client-name=Client for email scope spring.security.oauth2.client.registration.my-client-2.provider=my-oauth-provider spring.security.oauth2.client.registration.my-client-2.scope=email spring.security.oauth2.client.registration.my-client-2.redirect-uri-template=http://my-redirect-uri.com spring.security.oauth2.client.registration.my-client-2.client-authentication-method=basic spring.security.oauth2.client.registration.my-client-2.authorization-grant-type=authorization_code spring.security.oauth2.client.provider.my-oauth-provider.authorization-uri=http://my-auth-server/oauth/authorize spring.security.oauth2.client.provider.my-oauth-provider.token-uri=http://my-auth-server/oauth/token spring.security.oauth2.client.provider.my-oauth-provider.user-info-uri=http://my-auth-server/userinfo spring.security.oauth2.client.provider.my-oauth-provider.jwk-set-uri=http://my-auth-server/token_keys spring.security.oauth2.client.provider.my-oauth-provider.user-name-attribute=name
public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { .authorizeRequests() .anyRequest().authenticated() .and() .oauth2Login() .redirectionEndpoint() .baseUri("/custom-callback"); }
In other words, the two configurations in the following example use the Google provider:
spring.security.oauth2.client.registration.my-client.client-id=abcd spring.security.oauth2.client.registration.my-client.client-secret=password spring.security.oauth2.client.registration.my-client.provider=google spring.security.oauth2.client.registration.google.client-id=abcd spring.security.oauth2.client.registration.google.client-secret=password
Tip | |
---|---|
See the ‘How-to’ section for more advanced examples, typically to take full control over the configuration of the DataSource. |
Tip | |
---|---|
The ‘How-to’ section includes a section on how to initialize a database . |
Spring Boot can auto-configure embedded H2 , HSQL , and Derby databases. You need not provide any connection URLs. You need only include a build dependency to the embedded database that you want to use.
Note | |
---|---|
If you are using this feature in your tests, you may notice that the same database is
reused by your whole test suite regardless of the number of application contexts that you
use. If you want to make sure that each context has a separate embedded database, you
should set
|
For example, typical POM dependencies would be as follows:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <scope>runtime</scope> </dependency>
Note | |
---|---|
You need a dependency on
|
Tip | |
---|---|
If, for whatever reason, you do configure the connection URL for an embedded
database, take care to ensure that the database’s automatic shutdown is disabled. If you
use H2, you should use
|
Note | |
---|---|
You can bypass that algorithm completely and specify the connection pool to use by
setting the
|
Tip | |
---|---|
Additional connection pools can always be configured manually. If you define your
own
|
spring.datasource.url=jdbc:mysql://localhost/test spring.datasource.username=dbuser spring.datasource.password=dbpass spring.datasource.driver-class-name=com.mysql.jdbc.Driver
Note | |
---|---|
You should at least specify the URL by setting the
|
Tip | |
---|---|
You often do not need to specify the
|
Note | |
---|---|
For a pooling
|
See
DataSourceProperties
for more of the supported options. These are the standard options that work regardless of
the actual implementation. It is also possible to fine-tune implementation-specific
settings using their respective prefix (
spring.datasource.hikari.*
,
spring.datasource.tomcat.*
, and
spring.datasource.dbcp2.*
). Refer to the
documentation of the connection pool implementation you are using for more details.
For instance, if you use the Tomcat connection pool , you could customize many additional settings:
# Number of ms to wait before throwing an exception if no connection is available. spring.datasource.tomcat.max-wait=10000 # Maximum number of active connections that can be allocated from this pool at the same time. spring.datasource.tomcat.max-active=50 # Validate the connection before borrowing it from the pool. spring.datasource.tomcat.test-on-borrow=true
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; @Component public class MyBean { private final JdbcTemplate jdbcTemplate; @Autowired public MyBean(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; // ... }
spring.jdbc.template.max-rows=500
Note | |
---|---|
The
|
Tip | |
---|---|
We do not go into too many details of JPA or Spring Data here. You can follow the ‘Accessing Data with JPA’ guide from spring.io and read the Spring Data JPA and Hibernate reference documentation. |
package com.example.myapp.domain; import java.io.Serializable; import javax.persistence.*; @Entity public class City implements Serializable { @GeneratedValue private Long id; @Column(nullable = false) private String name; @Column(nullable = false) private String state; // ... additional members, often include @OneToMany mappings protected City() { // no-args constructor required by JPA spec // this one is protected since it shouldn't be used directly public City(String name, String state) { this.name = name; this.country = country; public String getName() { return this.name; public String getState() { return this.state; // ... etc }
Tip | |
---|---|
You can customize entity scanning locations by using the
|
For more complex queries, you can annotate your method with Spring Data’s
Query
annotation.
Spring Data repositories usually extend from the
Repository
or
CrudRepository
interfaces. If you use auto-configuration, repositories are searched from the package
containing your main configuration class (the one annotated with
@EnableAutoConfiguration
or
@SpringBootApplication
) down.
The following example shows a typical Spring Data repository interface definition:
package com.example.myapp.domain; import org.springframework.data.domain.*; import org.springframework.data.repository.*; public interface CityRepository extends Repository<City, Long> { Page<City> findAll(Pageable pageable); City findByNameAndCountryAllIgnoringCase(String name, String country); }
Tip | |
---|---|
We have barely scratched the surface of Spring Data JPA. For complete details, see the Spring Data JPA reference documentation . |
spring.jpa.hibernate.ddl-auto=create-drop
Note | |
---|---|
Hibernate’s own internal property name for this (if you happen to remember it
better) is
|
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
If you are running a web application, Spring Boot by default registers
OpenEntityManagerInViewInterceptor
to apply the "Open EntityManager in View" pattern, to allow for lazy loading in web
views. If you do not want this behavior, you should set
spring.jpa.open-in-view
to
false
in your
application.properties
.
The H2 database provides a browser-based console that Spring Boot can auto-configure for you. The console is auto-configured when the following conditions are met:
com.h2database:h2
is on the classpath.
Tip | |
---|---|
If you are not using Spring Boot’s developer tools but would still like to make use
of H2’s console, you can configure the
|
Java Object Oriented Querying ( jOOQ ) is a popular product from Data Geekery which generates Java code from your database and lets you build type-safe SQL queries through its fluent API. Both the commercial and open source editions can be used with Spring Boot.
In order to use jOOQ type-safe queries, you need to generate Java classes from your
database schema. You can follow the instructions in the
jOOQ user manual
.
If you use the
jooq-codegen-maven
plugin and you also use the
spring-boot-starter-parent
“parent POM”, you can safely omit the plugin’s
<version>
tag. You can also use Spring Boot-defined version variables (such as
h2.version
) to
declare the plugin’s database dependency. The following listing shows an example:
<plugin> <groupId>org.jooq</groupId> <artifactId>jooq-codegen-maven</artifactId> <executions> </executions> <dependencies> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>${h2.version}</version> </dependency> </dependencies> <configuration> <driver>org.h2.Driver</driver> <url>jdbc:h2:~/yourdatabase</url> </jdbc> <generator> </generator> </configuration> </plugin>
@Component public class JooqExample implements CommandLineRunner { private final DSLContext create; @Autowired public JooqExample(DSLContext dslContext) { this.create = dslContext; }
Tip | |
---|---|
The jOOQ manual tends to use a variable named
|
You can then use the
DSLContext
to construct your queries, as shown in the following
example:
public List<GregorianCalendar> authorsBornAfter1980() { return this.create.selectFrom(AUTHOR) .where(AUTHOR.DATE_OF_BIRTH.greaterThan(new GregorianCalendar(1980, 0, 1))) .fetch(AUTHOR.DATE_OF_BIRTH); }
Note | |
---|---|
Spring Boot can only auto-configure dialects supported by the open source version of jOOQ. |
Spring Data provides additional projects that help you access a variety of NoSQL technologies, including: MongoDB , Neo4J , Elasticsearch , Solr , Redis , Gemfire , Cassandra , Couchbase and LDAP . Spring Boot provides auto-configuration for Redis, MongoDB, Neo4j, Elasticsearch, Solr Cassandra, Couchbase, and LDAP. You can make use of the other projects, but you must configure them yourself. Refer to the appropriate reference documentation at projects.spring.io/spring-data .
Redis is a cache, message broker, and richly-featured key-value store. Spring Boot offers basic auto-configuration for the Lettuce and Jedis client libraries and the abstractions on top of them provided by Spring Data Redis .
There is a
spring-boot-starter-data-redis
‘Starter’ for collecting the dependencies
in a convenient way. By default, it uses
Lettuce
. That starter handles both
traditional and reactive applications.
Tip | |
---|---|
we also provide a
|
@Component public class MyBean { private StringRedisTemplate template; @Autowired public MyBean(StringRedisTemplate template) { this.template = template; // ... }
Tip | |
---|---|
You can also register an arbitrary number of beans that implement
|
MongoDB
is an open-source NoSQL document database that uses a
JSON-like schema instead of traditional table-based relational data. Spring Boot offers
several conveniences for working with MongoDB, including the
spring-boot-starter-data-mongodb
and
spring-boot-starter-data-mongodb-reactive
‘Starters’.
import org.springframework.data.mongodb.MongoDbFactory; import com.mongodb.DB; @Component public class MyBean { private final MongoDbFactory mongo; @Autowired public MyBean(MongoDbFactory mongo) { this.mongo = mongo; // ... public void example() { DB db = mongo.getDb(); // ... }
spring.data.mongodb.uri=mongodb://user:[email protected]:12345,mongo2.example.com:23456/test
Alternatively, as long as you use Mongo 2.x, you can specify a
host
/
port
. For
example, you might declare the following settings in your
application.properties
:
spring.data.mongodb.host=mongoserver spring.data.mongodb.port=27017
Note | |
---|---|
If you use the Mongo 3.0 Java driver,
|
Tip | |
---|---|
If
|
Tip | |
---|---|
If you do not use Spring Data Mongo, you can inject
|
Spring Data Mongo provides a
MongoTemplate
class that is very
similar in its design to Spring’s
JdbcTemplate
. As with
JdbcTemplate
, Spring Boot
auto-configures a bean for you to inject the template, as follows:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.stereotype.Component; @Component public class MyBean { private final MongoTemplate mongoTemplate; @Autowired public MyBean(MongoTemplate mongoTemplate) { this.mongoTemplate = mongoTemplate; // ... }
See the
MongoOperations
Javadoc
for complete details.
package com.example.myapp.domain; import org.springframework.data.domain.*; import org.springframework.data.repository.*; public interface CityRepository extends Repository<City, Long> { Page<City> findAll(Pageable pageable); City findByNameAndCountryAllIgnoringCase(String name, String country); }
Tip | |
---|---|
You can customize document scanning locations using the
|
Tip | |
---|---|
For complete details of Spring Data MongoDB, including its rich object mapping technologies, refer to the reference documentation . |
Spring Boot offers auto-configuration for
Embedded Mongo
. To use it in
your Spring Boot application, add a dependency on
de.flapdoodle.embed:de.flapdoodle.embed.mongo
.
The port that Mongo listens on can be configured by setting the
spring.data.mongodb.port
property. To use a randomly allocated free port, use a value of 0. The
MongoClient
created by
MongoAutoConfiguration
is automatically configured to use the randomly
allocated port.
Note | |
---|---|
If you do not configure a custom port, the embedded support uses a random port (rather than 27017) by default. |
If you have SLF4J on the classpath, the output produced by Mongo is automatically routed
to a logger named
org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongo
.
You can declare your own
IMongodConfig
and
IRuntimeConfig
beans to take control of
the Mongo instance’s configuration and logging routing.
Neo4j
is an open-source NoSQL graph database that uses a rich data
model of nodes related by first class relationships, which is better suited for connected
big data than traditional rdbms approaches. Spring Boot offers several conveniences for
working with Neo4j, including the
spring-boot-starter-data-neo4j
‘Starter’.
@Component public class MyBean { private final Neo4jTemplate neo4jTemplate; @Autowired public MyBean(Neo4jTemplate neo4jTemplate) { this.neo4jTemplate = neo4jTemplate; // ... }
spring.data.neo4j.uri=http://my-server:7474 spring.data.neo4j.username=neo4j spring.data.neo4j.password=secret
spring.data.neo4j.uri=file://var/tmp/graph.db
Note | |
---|---|
The Neo4j OGM embedded driver does not provide the Neo4j kernel. Users are expected to provide this dependency manually. See documentation for more details. |
Spring Data includes repository support for Neo4j.
Tip | |
---|---|
You can customize entity scanning locations by using the
|
@EnableNeo4jRepositories(basePackages = "com.example.myapp.repository") @EnableTransactionManagement
The following examples shows an interface definition for a Neo4j repository:
package com.example.myapp.domain; import org.springframework.data.domain.*; import org.springframework.data.repository.*; public interface CityRepository extends GraphRepository<City> { Page<City> findAll(Pageable pageable); City findByNameAndCountry(String name, String country); }
Tip | |
---|---|
For complete details of Spring Data Neo4j, including its rich object mapping technologies, refer to the reference documentation . |
Spring Data Gemfire
provides
convenient Spring-friendly tools for accessing the
Pivotal Gemfire
data management
platform. There is a
spring-boot-starter-data-gemfire
‘Starter’ for collecting the
dependencies in a convenient way. There is currently no auto-configuration support for
Gemfire, but you can enable Spring Data Repositories with a
single annotation:
@EnableGemfireRepositories
.
Apache Solr
is a search engine. Spring Boot offers basic
auto-configuration for the Solr 5 client library and the abstractions on top of it
provided by
Spring Data Solr
. There
is a
spring-boot-starter-data-solr
‘Starter’ for collecting the dependencies in a
convenient way.
You can inject an auto-configured
SolrClient
instance as you would any other Spring
bean. By default, the instance tries to connect to a server at
localhost:8983/solr
. The following example shows how to inject a Solr bean:
@Component public class MyBean { private SolrClient solr; @Autowired public MyBean(SolrClient solr) { this.solr = solr; // ... }
If you add your own
@Bean
of type
SolrClient
, it replaces the default.
Tip | |
---|---|
For complete details of Spring Data Solr, refer to the reference documentation . |
Elasticsearch
is an open source, distributed, real-time
search and analytics engine. Spring Boot offers basic auto-configuration for
Elasticsearch and the abstractions on top of it provided by
Spring Data Elasticsearch
.
There is a
spring-boot-starter-data-elasticsearch
‘Starter’ for collecting the
dependencies in a convenient way. Spring Boot also supports
Jest
.
If you have
Jest
on the classpath, you can inject an auto-configured
JestClient
targeting
localhost:9200
by default. You can further tune how the client is
configured, as shown in the following example:
spring.elasticsearch.jest.uris=http://search.example.com:9200 spring.elasticsearch.jest.read-timeout=10000 spring.elasticsearch.jest.username=user spring.elasticsearch.jest.password=secret
You can also register an arbitrary number of beans that implement
HttpClientConfigBuilderCustomizer
for more advanced customizations. The following
example tunes additional HTTP settings:
static class HttpSettingsCustomizer implements HttpClientConfigBuilderCustomizer { @Override public void customize(HttpClientConfig.Builder builder) { builder.maxTotalConnection(100).defaultMaxTotalConnectionPerRoute(5); }
To take full control over the registration, define a
JestClient
bean.
spring.data.elasticsearch.cluster-nodes=localhost:9300
@Component public class MyBean { private final ElasticsearchTemplate template; public MyBean(ElasticsearchTemplate template) { this.template = template; // ... }
If you add your own
ElasticsearchTemplate
or
TransportClient
@Bean
, it replaces the
default.
Tip | |
---|---|
For complete details of Spring Data Elasticsearch, refer to the reference documentation . |
Cassandra
is an open source, distributed database
management system designed to handle large amounts of data across many commodity servers.
Spring Boot offers auto-configuration for Cassandra and the abstractions on top of it
provided by
Spring Data
Cassandra
. There is a
spring-boot-starter-data-cassandra
‘Starter’ for collecting
the dependencies in a convenient way.
spring.data.cassandra.keyspace-name=mykeyspace spring.data.cassandra.contact-points=cassandrahost1,cassandrahost2
The following code listing shows how to inject a Cassandra bean:
@Component public class MyBean { private CassandraTemplate template; @Autowired public MyBean(CassandraTemplate template) { this.template = template; // ... }
If you add your own
@Bean
of type
CassandraTemplate
, it replaces the default.
Tip | |
---|---|
For complete details of Spring Data Cassandra, refer to the reference documentation . |
Couchbase
is an open-source, distributed multi-model NoSQL
document-oriented database that is optimized for interactive applications. Spring Boot
offers auto-configuration for Couchbase and the abstractions on top of it provided by
Spring Data Couchbase
. There are
a
spring-boot-starter-data-couchbase
and
spring-boot-starter-data-couchbase-reactive
‘Starters’ for collecting the dependencies in a convenient way.
spring.couchbase.bootstrap-hosts=my-host-1,192.168.1.123 spring.couchbase.bucket.name=my-bucket spring.couchbase.bucket.password=secret
Tip | |
---|---|
You need to provide
at least
the bootstrap host(s), in which case the bucket name is
|
spring.couchbase.env.timeouts.connect=3000 spring.couchbase.env.ssl.key-store=/location/of/keystore.jks spring.couchbase.env.ssl.key-store-password=secret
Check the
spring.couchbase.env.*
properties for more details.
Spring Data includes repository support for Couchbase. For complete details of Spring Data Couchbase, refer to the reference documentation .
You can inject an auto-configured
CouchbaseTemplate
instance as you would with any
other Spring Bean, provided a
default
CouchbaseConfigurer
is available (which
happens when you enable Couchbase support, as explained earlier).
The following examples shows how to inject a Couchbase bean:
@Component public class MyBean { private final CouchbaseTemplate template; @Autowired public MyBean(CouchbaseTemplate template) { this.template = template; // ... }
There are a few beans that you can define in your own configuration to override those provided by the auto-configuration:
CouchbaseTemplate
@Bean
with a name of
couchbaseTemplate
.
IndexManager
@Bean
with a name of
couchbaseIndexManager
.
CustomConversions
@Bean
with a name of
couchbaseCustomConversions
.
To avoid hard-coding those names in your own config, you can reuse
BeanNames
provided
by Spring Data Couchbase. For instance, you can customize the converters to use as
follows:
@Configuration public class SomeConfiguration { @Bean(BeanNames.COUCHBASE_CUSTOM_CONVERSIONS) public CustomConversions myCustomConversions() { return new CustomConversions(...); // ... }
Tip | |
---|---|
If you want to fully bypass the auto-configuration for Spring Data Couchbase,
provide your own implementation of
|
LDAP (Lightweight Directory Access Protocol) is an open, vendor-neutral, industry standard application protocol for accessing and maintaining distributed directory information services over an IP network. Spring Boot offers auto-configuration for any compliant LDAP server as well as support for the embedded in-memory LDAP server from UnboundID .
LDAP abstractions are provided by
Spring Data LDAP
.
There is a
spring-boot-starter-data-ldap
‘Starter’ for collecting the dependencies in
a convenient way.
Spring Data includes repository support for LDAP. For complete details of Spring Data LDAP, refer to the reference documentation .
You can also inject an auto-configured
LdapTemplate
instance as you would with any
other Spring Bean, as shown in the following example:
@Component public class MyBean { private final LdapTemplate template; @Autowired public MyBean(LdapTemplate template) { this.template = template; // ... }
For testing purposes Spring Boot supports auto-configuration of an in-memory LDAP server
from
UnboundID
. To configure the server
add a dependency to
com.unboundid:unboundid-ldapsdk
and declare a
base-dn
property:
spring.ldap.embedded.base-dn=dc=spring,dc=io
By default, the server starts on a random port and triggers the regular LDAP support.
There is no need to specify a
spring.ldap.urls
property.
If there is a
schema.ldif
file on your classpath, it is used to initialize the server.
If you want to load the initialization script from a different resource, you can also use
the
spring.ldap.embedded.ldif
property.
By default, a standard schema is used to validate
LDIF
files, you can turn off
validation altogether using the
spring.ldap.embedded.validation.enabled
property. If
you have custom attributes, you can use
spring.ldap.embedded.validation.schema
to
define your custom attribute types or object classes.
InfluxDB is an open-source time series database optimized for fast, high-availability storage and retrieval of time series data in fields such as operations monitoring, application metrics, Internet-of-Things sensor data, and real-time analytics.
Note | |
---|---|
Check the relevant section of the Spring Framework reference for more details. |
import org.springframework.cache.annotation.Cacheable import org.springframework.stereotype.Component; @Component public class MathService { @Cacheable("piDecimals") public int computePiDecimal(int i) { // ... }
Caution | |
---|---|
You can also use the standard JSR-107 (JCache) annotations (such as
|
If you do not add any specific cache library, Spring Boot auto-configures a
simple provider
that uses concurrent maps in
memory. When a cache is required (such as
piDecimals
in the preceding example), this
provider creates it for you. The simple provider is not really recommended for
production usage, but it is great for getting started and making sure that you understand
the features. When you have made up your mind about the cache provider to use, please
make sure to read its documentation to figure out how to configure the caches that your
application uses. Nearly all providers require you to explicitly configure every cache
that you use in the application. Some offer a way to customize the default caches defined
by the
spring.cache.cache-names
property.
Note | |
---|---|
If you use the cache infrastructure with beans that are not interface-based, make
sure to enable the
|
Tip | |
---|---|
It is also possible to
force
a particular cache provider by setting the
|
Tip | |
---|---|
Use the
|
If the
CacheManager
is auto-configured by Spring Boot, you can further tune its
configuration before it is fully initialized by exposing a bean that implements the
CacheManagerCustomizer
interface. The following example sets a flag to say that null
values should be passed down to the underlying map:
@Bean public CacheManagerCustomizer<ConcurrentMapCacheManager> cacheManagerCustomizer() { return new CacheManagerCustomizer<ConcurrentMapCacheManager>() { @Override public void customize(ConcurrentMapCacheManager cacheManager) { cacheManager.setAllowNullValues(false); }
Note | |
---|---|
In the example above, an auto-configured
|
# Only necessary if more than one provider is present spring.cache.jcache.provider=com.acme.MyCachingProvider spring.cache.jcache.config=classpath:acme.xml
Note | |
---|---|
When a cache library offers both a native implementation and JSR-107 support, Spring Boot prefers the JSR-107 support, so that the same features are available if you switch to a different JSR-107 implementation. |
Tip | |
---|---|
Spring Boot has
general support for Hazelcast
. If a
single
|
There are two ways to customize the underlying
javax.cache.cacheManager
:
spring.cache.cache-names
property. If
a custom
javax.cache.configuration.Configuration
bean is defined, it is used to
customize them.
org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer
beans are
invoked with the reference of the
CacheManager
for full customization.
Tip | |
---|---|
If a standard
|
Spring Boot has
general support for Hazelcast
. If a
HazelcastInstance
has been auto-configured, it is automatically wrapped in a
CacheManager
.
spring.cache.infinispan.config=infinispan.xml
Note | |
---|---|
The support of Infinispan in Spring Boot is restricted to the embedded mode and is quite basic. If you want more options, you should use the official Infinispan Spring Boot starter instead. See Infinispan’s documentation for more details. |
If the Couchbase Java client and the
couchbase-spring-cache
implementation are
available and Couchbase is
configured
, a
CouchbaseCacheManager
is auto-configured. It is also possible to create additional
caches on startup by setting the
spring.cache.cache-names
property. These caches
operate on the
Bucket
that was auto-configured. You can
also
create additional caches
on another
Bucket
by using the customizer. Assume you need two caches (
cache1
and
cache2
) on the "main"
Bucket
and one
cache3
cache with a custom time to live of 2
seconds on the "another"
Bucket
. You can create the first two caches through
configuration, as follows:
spring.cache.cache-names=cache1,cache2
Then you can define a
@Configuration
class to configure the extra
Bucket
and the
cache3
cache, as follows:
@Configuration public class CouchbaseCacheConfiguration { private final Cluster cluster; public CouchbaseCacheConfiguration(Cluster cluster) { this.cluster = cluster; @Bean public Bucket anotherBucket() { return this.cluster.openBucket("another", "secret"); @Bean public CacheManagerCustomizer<CouchbaseCacheManager> cacheManagerCustomizer() { return c -> { c.prepareCache("cache3", CacheBuilder.newInstance(anotherBucket()) .withExpiration(2)); }
This sample configuration reuses the
Cluster
that was created via auto-configuration.
spring.cache.cache-names=cache1,cache2 spring.cache.redis.time-to-live=600000
Note | |
---|---|
By default, a key prefix is added so that, if two separate caches use the same
key, Redis does not have overlapping keys and cannot return invalid values. We strongly
recommend keeping this setting enabled if you create your own
|
The
javax.jms.ConnectionFactory
interface provides a standard method of creating a
javax.jms.Connection
for interacting with a JMS broker. Although Spring needs a
ConnectionFactory
to work with JMS, you generally need not use it directly yourself and
can instead rely on higher level messaging abstractions. (See the
relevant section
of the Spring Framework
reference documentation for details.) Spring Boot also auto-configures the necessary
infrastructure to send and receive messages.
Note | |
---|---|
If you use
|
spring.activemq.broker-url=tcp://192.168.1.210:9876 spring.activemq.user=admin spring.activemq.password=secret
spring.activemq.pool.enabled=true spring.activemq.pool.max-connections=50
Tip | |
---|---|
See
|
Note | |
---|---|
If you are using
|
spring.artemis.mode=native spring.artemis.host=192.168.1.210 spring.artemis.port=9876 spring.artemis.user=admin spring.artemis.password=secret
See
ArtemisProperties
for more supported options.
No JNDI lookup is involved, and destinations are resolved against their names, using either the ‘name’ attribute in the Artemis configuration or the names provided through configuration.
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsTemplate; import org.springframework.stereotype.Component; @Component public class MyBean { private final JmsTemplate jmsTemplate; @Autowired public MyBean(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; // ... }
Note | |
---|---|
|
The following component creates a listener endpoint on the
someQueue
destination:
@Component public class MyBean { @JmsListener(destination = "someQueue") public void processMessage(String content) { // ... }
Tip | |
---|---|
See
the Javadoc of
|
For instance, the following example exposes another factory that uses a specific
MessageConverter
:
@Configuration static class JmsConfiguration { @Bean public DefaultJmsListenerContainerFactory myFactory( DefaultJmsListenerContainerFactoryConfigurer configurer) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); configurer.configure(factory, connectionFactory()); factory.setMessageConverter(myMessageConverter()); return factory; }
Then you can use the factory in any
@JmsListener
-annotated method as follows:
@Component public class MyBean { @JmsListener(destination = "someQueue", containerFactory="myFactory") public void processMessage(String content) { // ... }
spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=admin spring.rabbitmq.password=secret
See
RabbitProperties
for more of the supported options.
Tip | |
---|---|
See Understanding AMQP, the protocol used by RabbitMQ for more details. |
import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MyBean { private final AmqpAdmin amqpAdmin; private final AmqpTemplate amqpTemplate; @Autowired public MyBean(AmqpAdmin amqpAdmin, AmqpTemplate amqpTemplate) { this.amqpAdmin = amqpAdmin; this.amqpTemplate = amqpTemplate; // ... }
Note | |
---|---|
|
The following sample component creates a listener endpoint on the
someQueue
queue:
@Component public class MyBean { @RabbitListener(queues = "someQueue") public void processMessage(String content) { // ... }
Tip | |
---|---|
See
the Javadoc of
|
Tip | |
---|---|
It does not matter which container type you chose. Those two beans are exposed by the auto-configuration. |
@Configuration static class RabbitConfiguration { @Bean public SimpleRabbitListenerContainerFactory myFactory( SimpleRabbitListenerContainerFactoryConfigurer configurer) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); configurer.configure(factory, connectionFactory); factory.setMessageConverter(myMessageConverter()); return factory; }
Then you can use the factory in any
@RabbitListener
-annotated method as follows:
@Component public class MyBean { @RabbitListener(queues = "someQueue", containerFactory="myFactory") public void processMessage(String content) { // ... }
Important | |
---|---|
By default, if retries are disabled and the listener throws an exception, the
delivery is retried indefinitely. You can modify this behavior in two ways: Set the
|
Apache Kafka
is supported by providing auto-configuration of
the
spring-kafka
project.
Kafka configuration is controlled by external configuration properties in
spring.kafka.*
. For example, you might declare the following section in
application.properties
:
spring.kafka.bootstrap-servers=localhost:9092 spring.kafka.consumer.group-id=myGroup
Tip | |
---|---|
To create a topic on startup, add a bean of type
|
See
KafkaProperties
for more supported options.
@Component public class MyBean { private final KafkaTemplate kafkaTemplate; @Autowired public MyBean(KafkaTemplate kafkaTemplate) { this.kafkaTemplate = kafkaTemplate; // ... }
Note | |
---|---|
If a
|
The following component creates a listener endpoint on the
someTopic
topic:
@Component public class MyBean { @KafkaListener(topics = "someTopic") public void processMessage(String content) { // ... }
The properties supported by auto configuration are shown in Appendix A, Common application properties . Note that, for the most part, these properties (hyphenated or camelCase) map directly to the Apache Kafka dotted properties. Refer to the Apache Kafka documentation for details.
The first few of these properties apply to both producers and consumers but can be specified at the producer or consumer level if you wish to use different values for each. Apache Kafka designates properties with an importance of HIGH, MEDIUM, or LOW. Spring Boot auto-configuration supports all HIGH importance properties, some selected MEDIUM and LOW properties, and any properties that do not have a default value.
Only a subset of the properties supported by Kafka are available through the
KafkaProperties
class. If you wish to configure the producer or consumer with additional
properties that are not directly supported, use the following properties:
spring.kafka.properties.foo.bar=baz spring.kafka.consumer.properties.fiz.buz=qux spring,kafka.producer.properties.baz.qux=fiz
This sets the common
foo.bar
Kafka property to
baz
(applies to both producers and
consumers), the consumer
fiz.buz
property to
qux
and the
baz.qux
producer property
to
fiz
.
Important | |
---|---|
Properties set in this way override any configuration item that Spring Boot explicitly supports. |
The following code shows a typical example:
@Service public class MyService { private final RestTemplate restTemplate; public MyBean(RestTemplateBuilder restTemplateBuilder) { this.restTemplate = restTemplateBuilder.build(); public Details someRestCall(String name) { return this.restTemplate.getForObject("/{name}/details", Details.class, name); }
Tip | |
---|---|
|
If you have Spring WebFlux on your classpath, you can also choose to use
WebClient
to
call remote REST services, Compared to
RestTemplate
, this client has a more functional
feel and is fully reactive. You can create your own client instance with the builder,
WebClient.create()
. See the
relevant
section on WebClient
.
Spring Boot creates and pre-configures such a builder for you. For example, client HTTP codecs are configured in the same fashion as the server ones (see WebFlux HTTP codecs auto-configuration ).
The following code shows a typical example:
@Service public class MyService { private final WebClient webClient; public MyBean(WebClient.Builder webClientBuilder) { this.webClient = webClientBuilder.baseUrl("http://example.org").build(); public Mono<Details> someRestCall(String name) { return this.webClient.get().url("/{name}/details", name) .retrieve().bodyToMono(Details.class); }
Tip | |
---|---|
See the
reference documentation
for a
detailed explanation of how you can use
|
If
spring.mail.host
and the relevant libraries (as defined by
spring-boot-starter-mail
) are available, a default
JavaMailSender
is created if none
exists. The sender can be further customized by configuration items from the
spring.mail
namespace, see
MailProperties
for more
details.
In particular, certain default timeout values are infinite, and you may want to change that to avoid having a thread blocked by an unresponsive mail server, as shown in the following example:
spring.mail.properties.mail.smtp.connectiontimeout=5000 spring.mail.properties.mail.smtp.timeout=3000 spring.mail.properties.mail.smtp.writetimeout=5000
Spring Boot supports distributed JTA transactions across multiple XA resources by using either an Atomikos or Bitronix embedded transaction manager. JTA transactions are also supported when deploying to a suitable Java EE Application Server.
When a JTA environment is detected, Spring’s
JtaTransactionManager
is used to manage
transactions. Auto-configured JMS, DataSource, and JPA beans are upgraded to support XA
transactions. You can use standard Spring idioms, such as
@Transactional
, to participate
in a distributed transaction. If you are within a JTA environment and still want to use
local transactions, you can set the
spring.jta.enabled
property to
false
to disable
the JTA auto-configuration.
By default Atomikos transaction logs are written to a
transaction-logs
directory in
your application home directory (the directory in which your application jar file
resides). You can customize this directory by setting a
spring.jta.log-dir
property in
your
application.properties
file. Properties starting with
spring.jta.atomikos.properties
can also be used to customize the Atomikos
UserTransactionServiceImp
. See the
AtomikosProperties
Javadoc
for complete details.
Note | |
---|---|
To ensure that multiple transaction managers can safely coordinate the same
resource managers, each Atomikos instance must be configured with a unique ID. By default,
this ID is the IP address of the machine on which Atomikos is running. To ensure
uniqueness in production, you should configure the
|
By default, Bitronix transaction log files (
part1.btm
and
part2.btm
) are written to
a
transaction-logs
directory in your application home directory. You can customize this
directory by setting the
spring.jta.log-dir
property. Properties starting with
spring.jta.bitronix.properties
are also bound to the
bitronix.tm.Configuration
bean,
allowing for complete customization. See the
Bitronix
documentation
for details.
Note | |
---|---|
To ensure that multiple transaction managers can safely coordinate the same
resource managers, each Bitronix instance must be configured with a unique ID. By default,
this ID is the IP address of the machine on which Bitronix is running. To ensure
uniqueness in production, you should configure the
|
By default, Narayana transaction logs are written to a
transaction-logs
directory in
your application home directory (the directory in which your application jar file
resides). You can customize this directory by setting a
spring.jta.log-dir
property in
your
application.properties
file. Properties starting with
spring.jta.narayana.properties
can also be used to customize the Narayana
configuration. See the
NarayanaProperties
Javadoc
for complete details.
Note | |
---|---|
To ensure that multiple transaction managers can safely coordinate the same
resource managers, each Narayana instance must be configured with a unique ID. By
default, this ID is set to
|
If you package your Spring Boot application as a
war
or
ear
file and deploy it to a
Java EE application server, you can use your application server’s built-in transaction
manager. Spring Boot tries to auto-configure a transaction manager by looking at common
JNDI locations (
java:comp/UserTransaction
,
java:comp/TransactionManager
, and so on).
If you use a transaction service provided by your application server, you generally also
want to ensure that all resources are managed by the server and exposed over JNDI. Spring
Boot tries to auto-configure JMS by looking for a
ConnectionFactory
at the JNDI path
(
java:/JmsXA
or
java:/XAConnectionFactory
), and you can use the
spring.datasource.jndi-name
property
to configure your
DataSource
.
The following example shows how to inject
ConnectionFactory
instances:
// Inject the primary (XA aware) ConnectionFactory @Autowired private ConnectionFactory defaultConnectionFactory; // Inject the XA aware ConnectionFactory (uses the alias and injects the same as above) @Autowired @Qualifier("xaJmsConnectionFactory") private ConnectionFactory xaConnectionFactory; // Inject the non-XA aware ConnectionFactory @Autowired @Qualifier("nonXaJmsConnectionFactory") private ConnectionFactory nonXaConnectionFactory;
The
XAConnectionFactoryWrapper
and
XADataSourceWrapper
interfaces
can be used to support alternative embedded transaction managers. The interfaces are
responsible for wrapping
XAConnectionFactory
and
XADataSource
beans and exposing them
as regular
ConnectionFactory
and
DataSource
beans, which transparently enroll in the
distributed transaction. DataSource and JMS auto-configuration use JTA variants, provided
you have a
JtaTransactionManager
bean and appropriate XA wrapper beans registered
within your
ApplicationContext
.
The BitronixXAConnectionFactoryWrapper and BitronixXADataSourceWrapper provide good examples of how to write XA wrappers.
spring.hazelcast.config=classpath:config/my-hazelcast.xml
Otherwise, Spring Boot tries to find the Hazelcast configuration from the default
locations:
hazelcast.xml
in the working directory or at the root of the classpath. We
also check if the
hazelcast.config
system property is set. See the
Hazelcast documentation
for
more details.
If
hazelcast-client
is present on the classpath, Spring Boot first attempts to create a
client by checking the following configuration options:
com.hazelcast.client.config.ClientConfig
bean.
spring.hazelcast.config
property.
hazelcast.client.config
system property.
hazelcast-client.xml
in the working directory or at the root of the classpath.
Note | |
---|---|
Spring Boot also has
explicit caching support for Hazelcast
. If
caching is enabled, the
|
Beans of the following types are automatically picked up and associated with the
Scheduler
:
spring.quartz.job-store-type=jdbc
spring.quartz.jdbc.initialize-schema=true
Note | |
---|---|
By default, the database is detected and initialized by using the standard scripts
provided with the Quartz library. It is also possible to provide a custom script by
setting the
|
public class SampleJob extends QuartzJobBean { private MyService myService; private String name; // Inject "MyService" bean public void setMyService(MyService myService) { ... } // Inject the "name" job data property public void setName(String name) { ... } @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { }
spring.integration.jdbc.initialize-schema=always
See the
IntegrationAutoConfiguration
and
IntegrationProperties
classes for more details.
When building a reactive web application, the following stores can be auto-configured:
If Spring Session is available, you must choose the
StoreType
that you wish to
use to store the sessions. For instance, to use JDBC as the back-end store, you can
configure your application as follows:
spring.session.store-type=jdbc
Tip | |
---|---|
You can disable Spring Session by setting the
|
Each store has specific additional settings. For instance, it is possible to customize the name of the table for the JDBC store, as shown in the following example:
spring.session.jdbc.table-name=SESSIONS
See the
JmxAutoConfiguration
class for more details.
We generally find these common libraries to be useful when writing tests. If these libraries do not suit your needs, you can add additional test dependencies of your own.
If you have not used the
spring-test
module before, you should start by reading the
relevant section
of the Spring Framework
reference documentation.
You can use the
webEnvironment
attribute of
@SpringBootTest
to further refine how
your tests run:
MOCK
: Loads a
WebApplicationContext
and provides a mock servlet environment.
Embedded servlet containers are not started when using this annotation. If servlet APIs
are not on your classpath, this mode transparently falls back to creating a regular
non-web
ApplicationContext
. It can be used in conjunction with
@AutoConfigureMockMvc
for
MockMvc
-based testing of your application.
RANDOM_PORT
: Loads an
ServletWebServerApplicationContext
and provides a real
servlet environment. Embedded servlet containers are started and listen on a random
port.
DEFINED_PORT
: Loads a
ServletWebServerApplicationContext
and provides a real
servlet environment. Embedded servlet containers are started and listen on a defined port
(from your
application.properties
or on the default port of
8080
).
NONE
: Loads an
ApplicationContext
by using
SpringApplication
but does not provide
any
servlet environment (mock or otherwise).
Note | |
---|---|
If your test is
|
Note | |
---|---|
In addition to
|
Tip | |
---|---|
Do not forget to add
|
The search algorithm works up from the package that contains the test until it finds a
class annotated with
@SpringBootApplication
or
@SpringBootConfiguration
. As long as
you
structured your code
in a sensible way, your
main configuration is usually found.
Note | |
---|---|
If you use a annotation to test a more specific slice of your application, you should avoid adding configuration settings that are specific to a particular area on the method’s application class. |
If you want to customize the primary configuration, you can use a nested
@TestConfiguration
class. Unlike a nested
@Configuration
class, which would be used
instead of your application’s primary configuration, a nested
@TestConfiguration
class
is used in addition to your application’s primary configuration.
Note | |
---|---|
Spring’s test framework caches application contexts between tests. Therefore, as long as your tests share the same configuration (no matter how it’s discovered), the potentially time-consuming process of loading the context happens only once. |
As we
have seen
earlier
,
@TestConfiguration
can be used on an inner class of a test to customize the
primary configuration. When placed on a top-level class,
@TestConfiguration
indicates
that classes in
src/test/java
should not be picked up by scanning. You can then import
that class explicitly where it is required, as shown in the following example:
@RunWith(SpringRunner.class) @SpringBootTest @Import(MyTestsConfiguration.class) public class MyTests { @Test public void exampleTest() { }
Note | |
---|---|
If you directly use
|
The
@LocalServerPort
annotation can be used to
inject the actual port used
into your test.
For convenience, tests that need to make REST calls to the started server can
additionally
@Autowire
a
TestRestTemplate
, which resolves relative links to the
running server, as shown in the following example:
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.test.context.junit4.SpringRunner; import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) public class RandomPortExampleTests { @Autowired private TestRestTemplate restTemplate; @Test public void exampleTest() { String body = this.restTemplate.getForObject("/", String.class); assertThat(body).isEqualTo("Hello World"); }
Note | |
---|---|
If your test uses one of Spring Boot’s test annotations (such as
@TestExecutionListeners(MockitoTestExecutionListener.class)
|
The following example replaces an existing
RemoteService
bean with a mock
implementation:
import org.junit.*; import org.junit.runner.*; import org.springframework.beans.factory.annotation.*; import org.springframework.boot.test.context.*; import org.springframework.boot.test.mock.mockito.*; import org.springframework.test.context.junit4.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.BDDMockito.*; @RunWith(SpringRunner.class) @SpringBootTest public class MyTests { @MockBean private RemoteService remoteService; @Autowired private Reverser reverser; @Test public void exampleTest() { // RemoteService has been injected into the reverser bean given(this.remoteService.someCall()).willReturn("mock"); String reverse = reverser.reverseSomeCall(); assertThat(reverse).isEqualTo("kcom"); }
Additionally, you can use
@SpyBean
to wrap any existing bean with a Mockito
spy
. See
the
Javadoc
for full details.
Note | |
---|---|
Each slice loads a very restricted set of auto-configuration classes. If you need
to exclude one of them, most
|
Tip | |
---|---|
It is also possible to use the
|
import org.junit.*; import org.junit.runner.*; import org.springframework.beans.factory.annotation.*; import org.springframework.boot.test.autoconfigure.json.*; import org.springframework.boot.test.context.*; import org.springframework.boot.test.json.*; import org.springframework.test.context.junit4.*; import static org.assertj.core.api.Assertions.*; @RunWith(SpringRunner.class) @JsonTest public class MyJsonTests { @Autowired private JacksonTester<VehicleDetails> json; @Test public void testSerialize() throws Exception { VehicleDetails details = new VehicleDetails("Honda", "Civic"); // Assert against a `.json` file in the same package as the test assertThat(this.json.write(details)).isEqualToJson("expected.json"); // Or use JSON path based assertions assertThat(this.json.write(details)).hasJsonPathStringValue("@.make"); assertThat(this.json.write(details)).extractingJsonPathStringValue("@.make") .isEqualTo("Honda"); @Test public void testDeserialize() throws Exception { String content = "{\"make\":\"Ford\",\"model\":\"Focus\"}"; assertThat(this.json.parse(content)) .isEqualTo(new VehicleDetails("Ford", "Focus")); assertThat(this.json.parseObject(content).getMake()).isEqualTo("Ford"); }
Note | |
---|---|
JSON helper classes can also be used directly in standard unit tests. Simply
call the
|
A list of the auto-configuration that is enabled by
@JsonTest
can be
found in the appendix
.
Tip | |
---|---|
If you need to register extra components such as Jackson
|
Tip | |
---|---|
You can also auto-configure
|
import org.junit.*; import org.junit.runner.*; import org.springframework.beans.factory.annotation.*; import org.springframework.boot.test.autoconfigure.web.servlet.*; import org.springframework.boot.test.mock.mockito.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.BDDMockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @RunWith(SpringRunner.class) @WebMvcTest(UserVehicleController.class) public class MyControllerTests { @Autowired private MockMvc mvc; @MockBean private UserVehicleService userVehicleService; @Test public void testExample() throws Exception { given(this.userVehicleService.getVehicleDetails("sboot")) .willReturn(new VehicleDetails("Honda", "Civic")); this.mvc.perform(get("/sboot/vehicle").accept(MediaType.TEXT_PLAIN)) .andExpect(status().isOk()).andExpect(content().string("Honda Civic")); }
Tip | |
---|---|
If you need to configure elements of the auto-configuration (for example, when
servlet filters should be applied) you can use attributes in the
|
import com.gargoylesoftware.htmlunit.*; import org.junit.*; import org.junit.runner.*; import org.springframework.beans.factory.annotation.*; import org.springframework.boot.test.autoconfigure.web.servlet.*; import org.springframework.boot.test.mock.mockito.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.BDDMockito.*; @RunWith(SpringRunner.class) @WebMvcTest(UserVehicleController.class) public class MyHtmlUnitTests { @Autowired private WebClient webClient; @MockBean private UserVehicleService userVehicleService; @Test public void testExample() throws Exception { given(this.userVehicleService.getVehicleDetails("sboot")) .willReturn(new VehicleDetails("Honda", "Civic")); HtmlPage page = this.webClient.getPage("/sboot/vehicle.html"); assertThat(page.getBody().getTextContent()).isEqualTo("Honda Civic"); }
Note | |
---|---|
By default, Spring Boot puts
|
A list of the auto-configuration settings that are enabled by
@WebMvcTest
can be
found in the appendix
.
Tip | |
---|---|
If you need to register extra components such as Jackson
|
Tip | |
---|---|
You can also auto-configure
|
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest; import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; @RunWith(SpringRunner.class) @WebFluxTest(UserVehicleController.class) public class MyControllerTests { @Autowired private WebTestClient webClient; @MockBean private UserVehicleService userVehicleService; @Test public void testExample() throws Exception { given(this.userVehicleService.getVehicleDetails("sboot")) .willReturn(new VehicleDetails("Honda", "Civic")); this.webClient.get().uri("/sboot/vehicle").accept(MediaType.TEXT_PLAIN) .exchange() .expectStatus().isOk() .expectBody(String.class).isEqualTo("Honda Civic"); }
A list of the auto-configuration that is enabled by
@WebFluxTest
can be
found in the appendix
.
By default, data JPA tests are transactional and roll back at the end of each test. See the relevant section in the Spring Framework Reference Documentation for more details. If that is not what you want, you can disable transaction management for a test or for the whole class as follows:
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @RunWith(SpringRunner.class) @DataJpaTest @Transactional(propagation = Propagation.NOT_SUPPORTED) public class ExampleNonTransactionalTests { }
Data JPA tests may also inject a
TestEntityManager
bean, which provides an alternative to the standard JPA
EntityManager
that is
specifically designed for tests. If you want to use
TestEntityManager
outside of
@DataJpaTest
instances, you can also use the
@AutoConfigureTestEntityManager
annotation. A
JdbcTemplate
is also available if you need that. The following example
shows the
@DataJpaTest
annotation in use:
import org.junit.*; import org.junit.runner.*; import org.springframework.boot.test.autoconfigure.orm.jpa.*; import static org.assertj.core.api.Assertions.*; @RunWith(SpringRunner.class) @DataJpaTest public class ExampleRepositoryTests { @Autowired private TestEntityManager entityManager; @Autowired private UserRepository repository; @Test public void testExample() throws Exception { this.entityManager.persist(new User("sboot", "1234")); User user = this.repository.findByUsername("sboot"); assertThat(user.getUsername()).isEqualTo("sboot"); assertThat(user.getVin()).isEqualTo("1234"); }
In-memory embedded databases generally work well for tests, since they are fast and do
not require any installation. If, however, you prefer to run tests against a real
database you can use the
@AutoConfigureTestDatabase
annotation, as shown in the
following example:
@RunWith(SpringRunner.class) @DataJpaTest @AutoConfigureTestDatabase(replace=Replace.NONE) public class ExampleRepositoryTests { // ... }
A list of the auto-configuration settings that are enabled by
@DataJpaTest
can be
found in the appendix
.
By default, JDBC tests are transactional and roll back at the end of each test. See the relevant section in the Spring Framework Reference Documentation for more details. If that is not what you want, you can disable transaction management for a test or for the whole class as follows:
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @RunWith(SpringRunner.class) @JdbcTest @Transactional(propagation = Propagation.NOT_SUPPORTED) public class ExampleNonTransactionalTests { }
If you prefer your test to run against a real database, you can use the
@AutoConfigureTestDatabase
annotation in the same way as for
DataJpaTest
. (See
Section 43.3.9, “Auto-configured Data JPA Tests”
.)
A list of the auto-configuration that is enabled by
@JdbcTest
can be
found in the appendix
.
import org.jooq.DSLContext; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.autoconfigure.jooq.JooqTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @JooqTest public class ExampleJooqTests { @Autowired private DSLContext dslContext; }
JOOQ tests are transactional and roll back at the end of each test by default. If that is not what you want, you can disable transaction management for a test or for the whole test class as shown in the JDBC example .
A list of the auto-configuration that is enabled by
@JooqTest
can be
found in the appendix
.
import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @DataMongoTest public class ExampleDataMongoTests { @Autowired private MongoTemplate mongoTemplate; }
import org.junit.runner.RunWith; import org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration; import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @DataMongoTest(excludeAutoConfiguration = EmbeddedMongoAutoConfiguration.class) public class ExampleDataMongoNonEmbeddedTests { }
A list of the auto-configuration settings that are enabled by
@DataMongoTest
can be
found in the appendix
.
import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.neo4j.DataNeo4jTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @DataNeo4jTest public class ExampleDataNeo4jTests { @Autowired private YourRepository repository; }
By default, Data Neo4j tests are transactional and roll back at the end of each test. See the relevant section in the Spring Framework Reference Documentation for more details. If that is not what you want, you can disable transaction management for a test or for the whole class as follows:
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.autoconfigure.data.neo4j.DataNeo4jTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @RunWith(SpringRunner.class) @DataNeo4jTest @Transactional(propagation = Propagation.NOT_SUPPORTED) public class ExampleNonTransactionalTests { }
A list of the auto-configuration settings that are enabled by
@DataNeo4jTest
can be
found in the appendix
.
import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.redis.DataRedisTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @DataRedisTest public class ExampleDataRedisTests { @Autowired private YourRepository repository; }
A list of the auto-configuration settings that are enabled by
@DataRedisTest
can be
found in the appendix
.
import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.ldap.DataLdapTest; import org.springframework.ldap.core.LdapTemplate; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @DataLdapTest public class ExampleDataLdapTests { @Autowired private LdapTemplate ldapTemplate; }
import org.junit.runner.RunWith; import org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration; import org.springframework.boot.test.autoconfigure.data.ldap.DataLdapTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @DataLdapTest(excludeAutoConfiguration = EmbeddedLdapAutoConfiguration.class) public class ExampleDataLdapNonEmbeddedTests { }
A list of the auto-configuration settings that are enabled by
@DataLdapTest
can be
found in the appendix
.
@RunWith(SpringRunner.class) @RestClientTest(RemoteVehicleDetailsService.class) public class ExampleRestClientTest { @Autowired private RemoteVehicleDetailsService service; @Autowired private MockRestServiceServer server; @Test public void getVehicleDetailsWhenResultIsSuccessShouldReturnDetails() throws Exception { this.server.expect(requestTo("/greet/details")) .andRespond(withSuccess("hello", MediaType.TEXT_PLAIN)); String greeting = this.service.callRestService(); assertThat(greeting).isEqualTo("hello"); }
A list of the auto-configuration settings that are enabled by
@RestClientTest
can be
found in the appendix
.
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @RunWith(SpringRunner.class) @WebMvcTest(UserController.class) @AutoConfigureRestDocs public class UserDocumentationTests { @Autowired private MockMvc mvc; @Test public void listUsers() throws Exception { this.mvc.perform(get("/users").accept(MediaType.TEXT_PLAIN)) .andExpect(status().isOk()) .andDo(document("list-users")); }
@TestConfiguration static class CustomizationConfiguration implements RestDocsMockMvcConfigurationCustomizer { @Override public void customize(MockMvcRestDocumentationConfigurer configurer) { configurer.snippets().withTemplateFormat(TemplateFormats.markdown()); }
@TestConfiguration static class ResultHandlerConfiguration { @Bean public RestDocumentationResultHandler restDocumentation() { return MockMvcRestDocumentation.document("{method-name}"); }
import io.restassured.specification.RequestSpecification; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.web.server.LocalServerPort; import org.springframework.test.context.junit4.SpringRunner; import static io.restassured.RestAssured.given; import static org.hamcrest.CoreMatchers.is; import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.document; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) @AutoConfigureRestDocs public class UserDocumentationTests { @LocalServerPort private int port; @Autowired private RequestSpecification documentationSpec; @Test public void listUsers() throws Exception { given(this.documentationSpec).filter(document("list-users")).when() .port(this.port).get("/").then().assertThat().statusCode(is(200)); }
@TestConfiguration public static class CustomizationConfiguration implements RestDocsRestAssuredConfigurationCustomizer { @Override public void customize(RestAssuredRestDocumentationConfigurer configurer) { configurer.snippets().withTemplateFormat(TemplateFormats.markdown()); }
If you
structure your code
in a sensible way, your
@SpringBootApplication
class is
used by default
as
the configuration of your tests.
It then becomes important not to litter the application’s main class with configuration settings that are specific to a particular area of its functionality.
Assume that you are using Spring Batch and you rely on the auto-configuration for it.
You could define your
@SpringBootApplication
as follows:
@SpringBootApplication @EnableBatchProcessing public class SampleApplication { ... }
Because this class is the source configuration for the test, any slice test actually
tries to start Spring Batch, which is definitely not what you want to do. A recommended
approach is to move that area-specific configuration to a separate
@Configuration
class
at the same level as your application, as shown in the following example:
@Configuration @EnableBatchProcessing public class BatchConfiguration { ... }
Note | |
---|---|
Depending on the complexity of your application, you may either have a single
|
Another source of confusion is classpath scanning. Assume that, while you structured your code in a sensible way, you need to scan an additional package. Your application may resemble the following code:
@SpringBootApplication @ComponentScan({ "com.example.app", "org.acme.another" }) public class SampleApplication { ... }
This effectively overrides the default component scan directive with the side effect of
scanning those two packages regardless of the slice that you chose. For instance, a
@DataJpaTest
seems to suddenly scan components and user configurations of your
application. Again, moving the custom directive to a separate class is a good way to fix
this issue.
Tip | |
---|---|
If this is not an option for you, you can create a
|
If you wish to use Spock to test a Spring Boot application, you should add a dependency
on Spock’s
spock-spring
module to your application’s build.
spock-spring
integrates
Spring’s test framework into Spock. It is recommended that you use Spock 1.1 or later to
benefit from a number of improvements to Spock’s Spring Framework and Spring Boot
integration. See
the documentation
for Spock’s Spring module
for further details.
@ContextConfiguration(classes = Config.class, initializers = ConfigFileApplicationContextInitializer.class)
Note | |
---|---|
Using
|
public class MyTest { private TestRestTemplate template = new TestRestTemplate(); @Test public void testRequest() throws Exception { HttpHeaders headers = template.getForEntity("http://myhost.com/example", String.class).getHeaders(); assertThat(headers.getLocation().toString(), containsString("myotherhost")); }
@RunWith(SpringRunner.class) @SpringBootTest public class MyTest { @Autowired private TestRestTemplate template; @Test public void testRequest() throws Exception { HttpHeaders headers = template.getForEntity("/example", String.class).getHeaders(); assertThat(headers.getLocation().toString(), containsString("myotherhost")); @TestConfiguration static class Config { @Bean public RestTemplateBuilder restTemplateBuilder() { return new RestTemplateBuilder() .additionalMessageConverters(...) .customizers(...); }
Spring Framework provides
rich WebSocket support
that can be easily accessed through the
spring-boot-starter-websocket
module.
The
Spring Web Services features
can be easily accessed
with the
spring-boot-starter-webservices
module.
SimpleWsdl11Definition
and
SimpleXsdSchema
beans can be automatically created for
your WSDLs and XSDs respectively. To do so, configure their location, as shown in the
following example:
spring.webservices.wsdl-locations=classpath:/wsdl
Auto-configuration can be associated to a "starter" that provides the auto-configuration code as well as the typical libraries that you would use with it. We first cover what you need to know to build your own auto-configuration and then we move on to the typical steps required to create a custom starter .
Tip | |
---|---|
A demo project is available to showcase how you can create a starter step-by-step. |
You can browse the source code of
spring-boot-autoconfigure
to see the
@Configuration
classes that we provide (see the
META-INF/spring.factories
file).
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.mycorp.libx.autoconfigure.LibXAutoConfiguration,\ com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration
You can use the
@AutoConfigureAfter
or
@AutoConfigureBefore
annotations if your configuration needs to be applied in a specific order. For example,
if you provide web-specific configuration, your class may need to be applied after
WebMvcAutoConfiguration
.
If you want to order certain auto-configurations that should not have any direct
knowledge of each other, you can also use
@AutoConfigureOrder
. That annotation has the
same semantic as the regular
@Order
annotation but provides a dedicated order for
auto-configuration classes.
Note | |
---|---|
Auto-configurations must be loaded that way only . Make sure that they are defined in a specific package space and that, in particular, they are never the target of component scanning. |
The
@ConditionalOnClass
and
@ConditionalOnMissingClass
annotations let configuration
be included based on the presence or absence of specific classes. Due to the fact that
annotation metadata is parsed by using
ASM
, you can use the
value
attribute to refer to the real class, even though that class might not actually appear on
the running application classpath. You can also use the
name
attribute if you prefer to
specify the class name by using a
String
value.
Tip | |
---|---|
If you use
|
@Configuration public class MyAutoConfiguration { @Bean @ConditionalOnMissingBean public MyService myService() { ... } }
Tip | |
---|---|
You need to be very careful about the order that bean definitions are added as these
conditions are evaluated based on what has been processed so far. For this reason, we
recommend only using
|
Note | |
---|---|
|
A full Spring Boot starter for a library may contain the following components:
autoconfigure
module that contains the auto-configuration code.
starter
module that provides a dependency to the
autoconfigure
module as well
as the library and any additional dependencies that are typically useful. In a nutshell,
adding the starter should provide everything needed to start using that library.
Tip | |
---|---|
You may combine the auto-configuration code and the dependency management in a single module if you do not need to separate those two concerns. |
Make sure to
trigger
meta-data generation
so that IDE assistance is available for your keys as well. You may
want to review the generated meta-data (
META-INF/spring-configuration-metadata.json
) to
make sure your keys are properly documented.
Tip | |
---|---|
You should mark the dependencies to the library as optional so that you can include
the
|
If you want to learn more about any of the classes discussed in this section, you can check out the Spring Boot API documentation or you can browse the source code directly . If you have specific questions, take a look at the how-to section.
If you are comfortable with Spring Boot’s core features, you can continue on and read about production-ready features .
The
spring-boot-actuator
module
provides all of Spring Boot’s production-ready features. The simplest way to enable the
features is to add a dependency to the
spring-boot-starter-actuator
‘Starter’.
Definition of Actuator
An actuator is a manufacturing term, referring to a mechanical device for moving or controlling something. Actuators can generate a large amount of motion from a small change.
To add the actuator to a Maven based project, add the following ‘Starter’ dependency:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>
For Gradle, use the following declaration:
dependencies {
compile("org.springframework.boot:spring-boot-starter-actuator")
}
The following technology-agnostic endpoints are available:
ID | Description |
---|---|
|
Exposes audit events information for the current application. |
|
Showing the conditions that were evaluated on configuration and auto-configuration classes and the reasons why they did or did not match. |
|
Displays a complete list of all the Spring beans in your application. |
|
Displays a collated list of all
|
|
Exposes properties from Spring’s
|
|
Shows any Flyway database migrations that have been applied. |
|
Shows application health information. |
|
Displays arbitrary application info. |
|
Shows and modifies the configuration of loggers in the application. |
|
Shows any Liquibase database migrations that have been applied. |
|
Shows ‘metrics’ information for the current application. |
|
Displays a collated list of all
|
|
Displays the scheduled tasks in your application. |
|
Allows retrieval and deletion of user sessions from a Spring Session-backed session store. Not available when using Spring Session’s support for reactive web applications. |
|
Lets the application be gracefully shutdown (not enabled by default). |
|
Performs a thread dump. |
|
Displays trace information (by default, the last 100 HTTP requests). |
ID | Description |
---|---|
|
Returns a GZip compressed
|
|
Returns the contents of the logfile (if
|
|
Exposes metrics in a format that can be scraped by a Prometheus server. |
management.endpoints.jmx.expose=health
management.endpoints.web.expose=* management.endpoints.web.exclude=env
Note | |
---|---|
If your application is exposed publicly we strongly recommend that you also secure your endpoints . |
Tip | |
---|---|
If you want to implement your own strategy for when endpoints are exposed you can
register an
|
A typical Spring Security configuration could look something like this:
@Configuration public class ActuatorSecurity extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests() .anyRequest().hasRole("ENDPOINT_ADMIN") .and() .httpBasic(); }
management.endpoints.web.expose=*
management.endpoint.beans.cache.time-to-live=10s management.endpoint.shutdown.enabled=true
Note | |
---|---|
The prefix
|
management.endpoints.enabled-by-default=false management.endpoint.info.enabled=true
Note | |
---|---|
Disabled endpoints are removed entirely from the
|
Here’s an example that remaps
/actuator/health
to
/healthcheck
:
management.endpoints.web.base-path=/ management.endpoints.path-mapping.health=healthcheck
Cross-origin resource sharing (CORS) is a W3C specification that allows you to specify in a flexible way what kind of cross domain requests are authorized. If you use Spring MVC or Spring WebFlux, Actuator’s web endpoints can be configured to support such scenarios.
CORS support is disabled by default and is only enabled once the
management.endpoints.web.cors.allowed-origins
property has been set. The following
configuration permits
GET
and
POST
calls from the
example.com
domain:
management.endpoints.web.cors.allowed-origins=http://example.com management.endpoints.web.cors.allowed-methods=GET,POST
Tip | |
---|---|
See CorsEndpointProperties for a complete list of options. |
Tip | |
---|---|
If you add endpoints as a library feature, consider adding a configuration class
annotated with
|
Health information is collected from all
HealthIndicator
beans
defined in your
ApplicationContext
. Spring Boot includes a number of auto-configured
HealthIndicators
, and you can also write your own. By default, the final system state
is derived by the
HealthAggregator
, which sorts the statuses from each
HealthIndicator
based on an ordered list of statuses. The first status in the sorted
list is used as the overall health status. If no
HealthIndicator
returns a status that
is known to the
HealthAggregator
, an
UNKNOWN
status is used.
The following
HealthIndicators
are auto-configured by Spring Boot when appropriate:
Name | Description |
---|---|
Checks that a Cassandra database is up. |
|
Checks for low disk space. |
|
Checks that a connection to
|
|
Checks that an Elasticsearch cluster is up. |
|
Checks that a JMS broker is up. |
|
Checks that a mail server is up. |
|
Checks that a Mongo database is up. |
|
Checks that a Neo4j server is up. |
|
Checks that a Rabbit server is up. |
|
Checks that a Redis server is up. |
|
Checks that a Solr server is up. |
Tip | |
---|---|
It is possible to disable them all using the
|
To provide custom health information, you can register Spring beans that implement the
HealthIndicator
interface.
You need to provide an implementation of the
health()
method and return a
Health
response. The
Health
response should include a status and can optionally include
additional details to be displayed. The following code shows a sample
HealthIndicator
implementation:
import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.stereotype.Component; @Component public class MyHealthIndicator implements HealthIndicator { @Override public Health health() { int errorCode = check(); // perform some specific health check if (errorCode != 0) { return Health.down().withDetail("Error Code", errorCode).build(); return Health.up().build(); }
Note | |
---|---|
The identifier for a given
|
In addition to Spring Boot’s predefined
Status
types, it is also possible for
Health
to return a custom
Status
that represents a new system state. In such cases, a
custom implementation of the
HealthAggregator
interface
also needs to be provided, or the default implementation has to be configured by using
the
management.health.status.order
configuration property.
For example, assume a new
Status
with code
FATAL
is being used in one of your
HealthIndicator
implementations. To configure the severity order, add the following
to your application properties:
management.health.status.order=FATAL, DOWN, OUT_OF_SERVICE, UNKNOWN, UP
The HTTP status code in the response reflects the overall health status (for example,
UP
maps to 200, while
OUT_OF_SERVICE
and
DOWN
map to 503). You might also want to
register custom status mappings if you access the health endpoint over HTTP. For example,
the following property maps
FATAL
to 503 (service unavailable):
management.health.status.http-mapping.FATAL=503
Tip | |
---|---|
If you need more control, you can define your own
|
The following table shows the default status mappings for the built-in statuses:
Status | Mapping |
---|---|
DOWN |
SERVICE_UNAVAILABLE (503) |
OUT_OF_SERVICE |
SERVICE_UNAVAILABLE (503) |
UP |
No mapping by default, so http status is 200 |
UNKNOWN |
No mapping by default, so http status is 200 |
For reactive applications, such as those using Spring WebFlux, ReactiveHealthIndicators
provide a non-blocking contract for getting application health. Similar to a traditional
HealthIndicator
, health information is collected from all
ReactiveHealthIndicator
beans defined in your
ApplicationContext
. Regular HealthIndicators that do not check
against a reactive API are included and executed on the elastic scheduler.
To provide custom health information from a reactive API, you can register Spring beans
that implement the
ReactiveHealthIndicator
interface.
The following code shows a sample
ReactiveHealthIndicator
implementation:
@Component public class MyReactiveHealthIndicator implements ReactiveHealthIndicator { @Override public Mono<Health> health() { return doHealthCheck() //perform some specific health check that returns a Mono<Health> .onErrorResume(ex -> Mono.just(new Health.Builder().down(ex).build()))); }
Tip | |
---|---|
To handle the error automatically, consider extending from
|
The following
ReactiveHealthIndicators
are auto-configured by Spring Boot when
appropriate:
Name | Description |
---|---|
Checks that a Redis server is up. |
Tip | |
---|---|
Those reactive indicators replace the regular ones if necessary. Also, any
|
Application information exposes various information collected from all
InfoContributor
beans defined
in your
ApplicationContext
. Spring Boot includes a number of auto-configured
InfoContributors
, and you can write your own.
The following
InfoContributors
are auto-configured by Spring Boot, when appropriate:
Name | Description |
---|---|
Expose any key from the
|
|
Expose git information if a
|
|
Expose build information if a
|
Tip | |
---|---|
It is possible to disable them all using the
|
info.app.encoding=UTF-8 info.app.java.source=1.8 info.app.java.target=1.8
Tip | |
---|---|
Rather than hardcoding those values, you could also expand info properties at build time . Assuming you use Maven, you could rewrite the preceding example as follows: info.app.encoding[email protected]@ info.app.java.source[email protected]@ info.app.java.target[email protected]@ |
Tip | |
---|---|
A
|
management.info.git.mode=full
Tip | |
---|---|
The Maven and Gradle plugins can both generate that file. See " Generate build information " for more details. |
To provide custom application information, you can register Spring beans that implement
the
InfoContributor
interface.
The following example contributes an
example
entry with a single value:
import java.util.Collections; import org.springframework.boot.actuate.info.Info; import org.springframework.boot.actuate.info.InfoContributor; import org.springframework.stereotype.Component; @Component public class ExampleInfoContributor implements InfoContributor { @Override public void contribute(Info.Builder builder) { builder.withDetail("example", Collections.singletonMap("key", "value")); }
If you reach the
info
endpoint, you should see a response that contains the following
additional entry:
{ "example": { "key" : "value" }
Tip | |
---|---|
Actuator is supported natively with Spring MVC, Spring WebFlux and Jersey. |
management.endpoints.web.base-path=/manage
Note | |
---|---|
Unless the management port has been configured to
expose endpoints using a different
HTTP port
,
|
server.port=8443 server.ssl.enabled=true server.ssl.key-store=classpath:store.jks server.ssl.key-password=secret management.server.port=8080 management.server.ssl.enabled=false
server.port=8443 server.ssl.enabled=true server.ssl.key-store=classpath:main.jks server.ssl.key-password=secret management.server.port=8080 management.server.ssl.enabled=true management.server.ssl.key-store=classpath:management.jks management.server.ssl.key-password=secret
Note | |
---|---|
You can only listen on a different address if the port is different from the main server port. |
The following example
application.properties
does not allow remote management
connections:
management.server.port=8081 management.server.address=127.0.0.1
null
indicates that there is no explicit configuration.
{ "configuredLevel": "DEBUG" }
Tip | |
---|---|
To "reset" the specific level of the logger (and use the default configuration
instead), you can pass a value of
|
Spring Boot Actuator provides dependency management and auto-configuration for Micrometer , an application metrics facade that supports numerous monitoring systems:
Micrometer provides a separate module for each supported monitoring system. Depending on one (or more) of these modules is sufficient to get started with Micrometer in your Spring Boot application. To learn more about Micrometer’s capabilities, please refer to its reference documentation .
Auto-configuration enables binding of a number of Spring Integration-related metrics:
Table 53.2. Channel metrics
Metric | Description |
---|---|
|
Number of receives |
|
Number of failed sends |
|
Number of successful sends |
Table 53.3. Handler metrics
Metric | Description |
---|---|
|
Maximum handler duration in milliseconds |
|
Minimum handler duration in milliseconds |
|
Mean handler duration in milliseconds |
|
Number of active handlers |
Table 53.4. Source metrics
Metric | Description |
---|---|
|
Number of successful source calls |
[{ "timestamp": 1394343677415, "info": { "method": "GET", "path": "/trace", "headers": { "request": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Connection": "keep-alive", "Accept-Encoding": "gzip, deflate", "User-Agent": "Mozilla/5.0 Gecko/Firefox", "Accept-Language": "en-US,en;q=0.5", "Cookie": "_ga=GA1.1.827067509.1390890128; ..." "Authorization": "Basic ...", "Host": "localhost:8080" "response": { "Strict-Transport-Security": "max-age=31536000 ; includeSubDomains", "X-Application-Context": "application:8080", "Content-Type": "application/json;charset=UTF-8", "status": "200" "timestamp": 1394343684465, }]
By default, the trace includes the following information:
Name | Description |
---|---|
Request Headers |
Headers from the request. |
Response Headers |
Headers from the response. |
Cookies |
|
Errors |
The error attributes (if any). |
Time Taken |
The time taken to service the request in milliseconds. |
If you need to trace additional events, you can inject a
TraceRepository
into your
Spring beans. The
add
method accepts a single
Map
structure that is converted to JSON
and logged.
By default, an
InMemoryTraceRepository
that stores the last 100 events is used. If you
need to expand the capacity, you can define your own instance of the
InMemoryTraceRepository
bean. You can also create your own alternative
TraceRepository
implementation.
ApplicationPidFileWriter
creates a file containing the application PID (by default,
in the application directory with the file name,
application.pid
).
EmbeddedServerPortFileWriter
creates a file (or files) containing the ports of the
embedded server (by default, in the application directory with the file name
application.port
).
Note | |
---|---|
The
|
If you want to explore some of the concepts discussed in this chapter, you can take a look at the actuator sample applications . You also might want to read about graphing tools such as Graphite .
Otherwise, you can continue on, to read about ‘deployment options’ or jump ahead for some in-depth information about Spring Boot’s build tool plugins .
In this section, we look at what it takes to get the simple application that we developed in the “Getting Started” section up and running in the Cloud.
Cloud Foundry provides default buildpacks that come into play if no other buildpack is
specified. The Cloud Foundry
Java
buildpack
has excellent support for Spring applications, including Spring Boot. You can
deploy stand-alone executable jar applications as well as traditional
.war
packaged
applications.
Once you have built your application (by using, for example,
mvn clean package
) and have
installed the
cf
command line tool
, deploy your application by using the
cf push
command, substituting
the path to your compiled
.jar
. Be sure to have
logged in with
your
cf
command line client
before pushing an application. The following line shows
using the
cf push
command to deploy an application:
$ cf push acloudyspringtime -p target/demo-0.0.1-SNAPSHOT.jar
Note | |
---|---|
In the preceding example, we substitute
|
See the
cf push
documentation
for more options. If there is a Cloud Foundry
manifest.yml
file present in the same directory, it is considered.
At this point,
cf
starts uploading your application, producing output similar to the
following example:
Uploading acloudyspringtime... OK Preparing to start acloudyspringtime... OK -----> Downloaded app package (8.9M) -----> Java Buildpack Version: v3.12 (offline) | https://github.com/cloudfoundry/java-buildpack.git#6f25b7e -----> Downloading Open Jdk JRE 1.8.0_121 from https://java-buildpack.cloudfoundry.org/openjdk/trusty/x86_64/openjdk-1.8.0_121.tar.gz (found in cache) Expanding Open Jdk JRE to .java-buildpack/open_jdk_jre (1.6s) -----> Downloading Open JDK Like Memory Calculator 2.0.2_RELEASE from https://java-buildpack.cloudfoundry.org/memory-calculator/trusty/x86_64/memory-calculator-2.0.2_RELEASE.tar.gz (found in cache) Memory Settings: -Xss349K -Xmx681574K -XX:MaxMetaspaceSize=104857K -Xms681574K -XX:MetaspaceSize=104857K -----> Downloading Container Certificate Trust Store 1.0.0_RELEASE from https://java-buildpack.cloudfoundry.org/container-certificate-trust-store/container-certificate-trust-store-1.0.0_RELEASE.jar (found in cache) Adding certificates to .java-buildpack/container_certificate_trust_store/truststore.jks (0.6s) -----> Downloading Spring Auto Reconfiguration 1.10.0_RELEASE from https://java-buildpack.cloudfoundry.org/auto-reconfiguration/auto-reconfiguration-1.10.0_RELEASE.jar (found in cache) Checking status of app 'acloudyspringtime'... 0 of 1 instances running (1 starting) 0 of 1 instances running (1 starting) 0 of 1 instances running (1 starting) 1 of 1 instances running (1 running) App started
Congratulations! The application is now live!
Once your application is live, you can verify the status of the deployed application by
using the
cf apps
command, as shown in the following example:
$ cf apps Getting applications in ... name requested state instances memory disk urls acloudyspringtime started 1/1 512M 1G acloudyspringtime.cfapps.io ...
Once Cloud Foundry acknowledges that your application has been deployed, you should be
able to find the application at the URI given. In the preceding example, you could find
it at
http://acloudyspringtime.cfapps.io/
.
@Component class MyBean implements EnvironmentAware { private String instanceId; @Override public void setEnvironment(Environment environment) { this.instanceId = environment.getProperty("vcap.application.instance_id"); // ... }
All Cloud Foundry properties are prefixed with
vcap
. You can use
vcap
properties to
access application information (such as the public URL of the application) and service
information (such as database credentials). See
‘CloudFoundryVcapEnvironmentPostProcessor’
Javadoc for complete details.
Tip | |
---|---|
The
Spring Cloud Connectors
project
is a better fit for tasks such as configuring a DataSource. Spring Boot includes
auto-configuration support and a
|
web: java -Dserver.port=$PORT -jar target/demo-0.0.1-SNAPSHOT.jar
$ git push heroku master Initializing repository, done. Counting objects: 95, done. Delta compression using up to 8 threads. Compressing objects: 100% (78/78), done. Writing objects: 100% (95/95), 8.66 MiB | 606.00 KiB/s, done. Total 95 (delta 31), reused 0 (delta 0) -----> Java app detected -----> Installing OpenJDK 1.8... done -----> Installing Maven 3.3.1... done -----> Installing settings.xml... done -----> Executing: mvn -B -DskipTests=true clean install [INFO] Scanning for projects... Downloading: http://repo.spring.io/... Downloaded: http://repo.spring.io/... (818 B at 1.8 KB/sec) Downloaded: http://s3pository.heroku.com/jvm/... (152 KB at 595.3 KB/sec) [INFO] Installing /tmp/build_0c35a5d2-a067-4abc-a232-14b1fb7a8229/target/... [INFO] Installing /tmp/build_0c35a5d2-a067-4abc-a232-14b1fb7a8229/pom.xml ... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 59.358s [INFO] Finished at: Fri Mar 07 07:28:25 UTC 2014 [INFO] Final Memory: 20M/493M [INFO] ------------------------------------------------------------------------ -----> Discovering process types Procfile declares types -> web -----> Compressing... done, 70.4MB -----> Launching... done, v6 http://agile-sierra-1405.herokuapp.com/ deployed to Heroku To [email protected]:agile-sierra-1405.git * [new branch] master -> master
Your application should now be up and running on Heroku.
OpenShift is the Red Hat public (and enterprise) extension of the Kubernetes container orchestration platform. Similarly to Kubernetes, OpenShift has many options for installing Spring Boot based applications.
OpenShift has many resources describing how to deploy Spring Boot applications, which include:
As described in the official Elastic Beanstalk Java guide , there are two main options to deploy a Java application. You can either use the “Tomcat Platform” or the “Java SE platform”.
server.port=5000
Upload binaries instead of sources | |
---|---|
By default, Elastic Beanstalk uploads sources and compiles them in AWS. However, it is
best to upload the binaries instead. To do so, add the following lines to your
deploy: artifact: target/demo-0.0.1-SNAPSHOT.jar |
Reduce costs by setting the environment type | |
---|---|
By default an Elastic Beanstalk environment is load balanced. The load balancer has a significant cost. To avoid that cost, set the environment type to “Single instance”, as described in Amazon documentation. You can also create single instance environments by using the CLI and the following command: eb create -s |
This is one of the easiest ways to get to AWS, but there are more things to cover, such as how to integrate Elastic Beanstalk into any CI / CD tool, use the Elastic Beanstalk Maven plugin instead of the CLI, and others. There is a exampledriven.wordpress.com/2017/01/09/spring-boot-aws-elastic-beanstalk-example/ [blog post] covering these topics more in detail.
Boxfuse works by turning your Spring Boot executable jar or war into a minimal VM image that can be deployed unchanged either on VirtualBox or on AWS. Boxfuse comes with deep integration for Spring Boot and uses the information from your Spring Boot configuration file to automatically configure ports and health check URLs. Boxfuse leverages this information both for the images it produces as well as for all the resources it provisions (instances, security groups, elastic load balancers, and so on).
Once you have created a
Boxfuse account
, connected it to
your AWS account, installed the latest version of the Boxfuse Client, and ensured that
the application has been built by Maven or Gradle (by using, for example,
mvn clean
package
), you can deploy your Spring Boot application to AWS with a command similar to
the following:
$ boxfuse run myapp-1.0.jar -env=prod
See the
boxfuse run
documentation
for
more options. If there is a
boxfuse.com/docs/commandline/#configuration
[
boxfuse.conf
] file present in the current directory, it is considered.
Tip | |
---|---|
By default, Boxfuse activates a Spring profile named
|
At this point,
boxfuse
creates an image for your application, uploads it, and configures
and starts the necessary resources on AWS resulting in output similar to the following
example:
Fusing Image for myapp-1.0.jar ... Image fused in 00:06.838s (53937 K) -> axelfontaine/myapp:1.0 Creating axelfontaine/myapp ... Pushing axelfontaine/myapp:1.0 ... Verifying axelfontaine/myapp:1.0 ... Creating Elastic IP ... Mapping myapp-axelfontaine.boxfuse.io to 52.28.233.167 ... Waiting for AWS to create an AMI for axelfontaine/myapp:1.0 in eu-central-1 (this may take up to 50 seconds) ... AMI created in 00:23.557s -> ami-d23f38cf Creating security group boxfuse-sg_axelfontaine/myapp:1.0 ... Launching t2.micro instance of axelfontaine/myapp:1.0 (ami-d23f38cf) in eu-central-1 ... Instance launched in 00:30.306s -> i-92ef9f53 Waiting for AWS to boot Instance i-92ef9f53 and Payload to start at http://52.28.235.61/ ... Payload started in 00:29.266s -> http://52.28.235.61/ Remapping Elastic IP 52.28.233.167 to i-92ef9f53 ... Waiting 15s for AWS to complete Elastic IP Zero Downtime transition ... Deployment completed successfully. axelfontaine/myapp:1.0 is up and running at http://myapp-axelfontaine.boxfuse.io/
Your application should now be up and running on AWS.
See the blog post on deploying Spring Boot apps on EC2 as well as the documentation for the Boxfuse Spring Boot integration to get started with a Maven build to run the app.
To run in App Engine, you can create a project in the UI first, which sets up a unique identifier for you and also sets up HTTP routes. Add a Java app to the project and leave it empty and then use the Google Cloud SDK to push your Spring Boot app into that slot from the command line or CI build.
App Engine needs you to create an
app.yaml
file to describe the resources your app
requires. Normally you put this file in
src/main/appengine
, and it should resemble the
following file:
service: default runtime: java env: flex runtime_config: jdk: openjdk8 handlers: - url: /.* script: this field is required, but ignored manual_scaling: instances: 1 health_check: enable_health_check: False env_variables: ENCRYPT_KEY: your_encryption_key_here
You can deploy the app (for example, with a Maven plugin) by adding the project ID to the build configuration, as shown in the following example:
<plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>appengine-maven-plugin</artifactId> <version>1.3.0</version> <configuration> <project>myproject</project> </configuration> </plugin>
Then deploy with
mvn appengine:deploy
(if you need to authenticate first, the build
fails).
Note | |
---|---|
Google App Engine Classic is tied to the Servlet 2.5 API, so you cannot deploy a Spring Application there without some modifications. See the Servlet 2.5 section of this guide. |
In additional to running Spring Boot applications by using
java -jar
, it is also
possible to make fully executable applications for Unix systems. A fully executable jar
can be executed like any other executable binary or it can be
registered with
init.d
or
systemd
. This makes it very easy to
install and manage Spring Boot applications in common production environments.
Warning | |
---|---|
Fully executable jars work by embedding an extra script at the front of the file.
Currently, some tools do not accept this format, so you may not always be able to use this
technique. For example,
|
To create a ‘fully executable’ jar with Maven, use the following plugin configuration:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> </configuration> </plugin>
The following example shows the equivalent Gradle configuration:
bootJar { launchScript() }
You can then run your application by typing
./my-application.jar
(where
my-application
is the name of your artifact). The directory containing the jar is used as your
application’s working directory.
If you configured Spring Boot’s Maven or Gradle plugin to generate a
fully executable jar
, and you do not use a custom
embeddedLaunchScript
, your
application can be used as an
init.d
service. To do so, symlink the jar to
init.d
to
support the standard
start
,
stop
,
restart
and
status
commands.
The script supports the following features:
/var/run/<appname>/<appname>.pid
/var/log/<appname>.log
Assuming that you have a Spring Boot application installed in
/var/myapp
, to install a
Spring Boot application as an
init.d
service, create a symlink, as follows:
$ sudo ln -s /var/myapp/myapp.jar /etc/init.d/myapp
Once installed, you can start and stop the service in the usual way. For example, on a Debian based system, you could start it with the following command:
$ service myapp start
Tip | |
---|---|
If your application fails to start, check the log file written to
|
You can also flag the application to start automatically by using your standard operating system tools. For example, on Debian, you could use the following command:
$ update-rc.d myapp defaults <priority>
Note | |
---|---|
The following is a set of guidelines on how to secure a Spring Boot application that runs as an init.d service. It is not intended to be an exhaustive list of everything that should be done to harden an application and the environment in which it runs. |
$ chown bootapp:bootapp your-app.jar
In this case, the default executable script runs the application as the
bootapp
user.
Tip | |
---|---|
To reduce the chances of the application’s user account being compromised, you should
consider preventing it from using a login shell. For example, you can set the account’s
shell to
|
$ chmod 500 your-app.jar
$ sudo chattr +i your-app.jar
This will prevent any user, including root, from modifying the jar.
If root is used to control the application’s service and you
use a
.conf
file
to customize its
startup, the
.conf
file is read and evaluated by the root user. It should be secured
accordingly. Use
chmod
so that the file can only be read by the owner and use
chown
to
make root the owner, as shown in the following example:
$ chmod 400 your-app.conf $ sudo chown root:root your-app.conf
[Unit] Description=myapp After=syslog.target [Service] User=myapp ExecStart=/var/myapp/myapp.jar SuccessExitStatus=143 [Install] WantedBy=multi-user.target
Important | |
---|---|
Remember to change the
|
Note | |
---|---|
The
|
Note that, unlike when running as an
init.d
service, the user that runs the application,
the PID file, and the console log file are managed by
systemd
itself and therefore must
be configured by using appropriate fields in the ‘service’ script. Consult the
service unit
configuration man page
for more details.
To flag the application to start automatically on system boot, use the following command:
$ systemctl enable myapp.service
Refer to
man systemctl
for more details.
The following property substitutions are supported with the default script:
Name | Description |
---|---|
|
The script mode. Defaults to
|
|
The
|
|
The
|
|
The
|
|
The
|
|
The
|
|
The
|
|
The
|
|
The
|
|
The default value for
|
|
Reference to a file script that should be inlined in the default launch script.
This can be used to set environmental variables such as
|
|
The default value for
|
|
The default value for
|
|
The default value for
|
|
The default value for the name of the PID file in
|
|
Whether the
|
|
The default value for
|
For items of the script that need to be customized after the jar has been written, you can use environment variables or a config file .
The following environment properties are supported with the default script:
Variable | Description |
---|---|
|
The “mode” of operation. The default depends on the way the jar was built but is
usually
|
|
Whether the
|
|
The root name of the pid folder (
|
|
The name of the folder in which to put log files (
|
|
The name of the folder from which to read .conf files (same folder as jar-file by default). |
|
The name of the log file in the
|
|
The name of the app. If the jar is run from a symlink, the script guesses the app name if it is not a symlink or you want to explicitly set the app name, this can be useful. |
|
The arguments to pass to the program (the Spring Boot app). |
|
The location of the
|
|
Options that are passed to the JVM when it is launched. |
|
The explicit location of the jar file, in case the script is being used to launch a jar that it is not actually embedded. |
|
If not empty, sets the
|
|
The time in seconds to wait when stopping the application before forcing a shutdown (
|
Note | |
---|---|
The
|
JAVA_OPTS=-Xmx1024M LOG_FOLDER=/custom/log/folder
Tip | |
---|---|
If you do not like having the config file next to the jar file, you can set a
|
To learn about securing this file appropriately, see the guidelines for securing an init.d service .
A Spring Boot application can be started as a Windows service by using
winsw
.
A sample ( maintained separately ) describes step-by-step how you can create a Windows service for your Spring Boot application.
Check out the Cloud Foundry , Heroku , OpenShift , and Boxfuse web sites for more information about the kinds of features that a PaaS can offer. These are just four of the most popular Java PaaS providers. Since Spring Boot is so amenable to cloud-based deployment, you can freely consider other providers as well.
The next section goes on to cover the Spring Boot CLI , or you can jump ahead to read about build tool plugins .
The Spring Boot CLI (Command-Line Interface) can be installed manually by using SDKMAN! (the SDK Manager) or by using Homebrew or MacPorts if you are an OSX user. See Section 10.2, “Installing the Spring Boot CLI” in the “Getting started” section for comprehensive installation instructions.
$ spring usage: spring [--help] [--version] <command> [<args>] Available commands are: run [options] <files> [--] [args] Run a spring groovy script ... more command help is shown here
$ spring help run spring run - Run a spring groovy script usage: spring run [options] <files> [--] [args] Option Description ------ ----------- --autoconfigure [Boolean] Add autoconfigure compiler transformations (default: true) --classpath, -cp Additional classpath entries -e, --edit Open the file with the default system editor --no-guess-dependencies Do not attempt to guess dependencies --no-guess-imports Do not attempt to guess imports -q, --quiet Quiet logging -v, --verbose Verbose logging of dependency resolution --watch Watch the specified file for changes
$ spring version Spring CLI v2.0.0.M7
The following example shows a “hello world” web application written in Groovy:
@RestController class WebApplication { @RequestMapping("/") String home() { "Hello World!"To compile and run the application type the following command:
$ spring run hello.groovyTo pass command-line arguments to the application, use a
--
to separate the commands from the “spring” command arguments, as shown in the following example:$ spring run hello.groovy -- --server.port=9000To set JVM command line arguments, you can use the
JAVA_OPTS
environment variable, as shown in the following example:$ JAVA_OPTS=-Xmx1024m spring run hello.groovy
Note When setting
JAVA_OPTS
on Microsoft Windows, make sure to quote the entire instruction, such asset "JAVA_OPTS=-Xms256m -Xmx2048m"
. Doing so ensures the values are properly passed to the process.The following items are used as “grab hints”:
Items Grabs
JdbcTemplate
,NamedParameterJdbcTemplate
,DataSource
JDBC Application.
@EnableJms
JMS Application.
@EnableCaching
Caching abstraction.
@Test
JUnit.
@EnableRabbit
RabbitMQ.
@EnableReactor
Project Reactor.
extends
Specification
Spock test.
@EnableBatchProcessing
Spring Batch.
@MessageEndpoint
@EnableIntegrationPatterns
Spring Integration.
@Controller
@RestController
@EnableWebMvc
Spring MVC + Embedded Tomcat.
@EnableWebSecurity
Spring Security.
@EnableTransactionManagement
Spring Transaction Management.
Tip See subclasses of
CompilerAutoConfiguration
in the Spring Boot CLI source code to understand exactly how customizations are applied.Spring Boot extends Groovy’s standard
@Grab
support by letting you specify a dependency without a group or version (for example,@Grab('freemarker')
). Doing so consults Spring Boot’s default dependency metadata to deduce the artifact’s group and version. Note that the default metadata is tied to the version of the CLI that you use – it changes only when you move to a new version of the CLI, putting you in control of when the versions of your dependencies may change. A table showing the dependencies and their versions that are included in the default metadata can be found in the appendix.
Tip Many Spring annotations work without using
import
statements. Try running your application to see what fails before adding imports.For example, consider the following declaration:
@DependencyManagementBom("com.example.custom-bom:1.0.0")@DependencyManagementBom(["com.example.custom-bom:1.0.0", "com.example.another-bom:1.0.0"])You can use
@DependencyManagementBom
anywhere that you can use@Grab
. However, to ensure consistent ordering of the dependency management, you can use@DependencyManagementBom
at most once in your application. A useful source of dependency management (which is a superset of Spring Boot’s dependency management) is the Spring IO Platform, which you might include with the following line:@DependencyManagementBom('io.spring.platform:platform-bom:1.1.2.RELEASE')
$ spring jar my-app.jar *.groovy
public/**, resources/**, static/**, templates/**, META-INF/**, *
The default excludes are as follows:
.*, repository/**, build/**, target/**, **/*.jar, **/*.groovy
Type
spring help jar
on the command line for more information.
The
init
command lets you create a new project by using
start.spring.io
without
leaving the shell, as shown in the following example:
$ spring init --dependencies=web,data-jpa my-project Using service at https://start.spring.io Project extracted to '/Users/developer/example/my-project'
The preceding example creates a
my-project
directory with a Maven-based project that
uses
spring-boot-starter-web
and
spring-boot-starter-data-jpa
. You can list the
capabilities of the service by using the
--list
flag, as shown in the following example:
$ spring init --list ======================================= Capabilities of https://start.spring.io ======================================= Available dependencies: ----------------------- actuator - Actuator: Production ready features to help you monitor and manage your application web - Web: Support for full-stack web development, including Tomcat and spring-webmvc websocket - Websocket: Support for WebSocket development ws - WS: Support for Spring Web Services Available project types: ------------------------ gradle-build - Gradle Config [format:build, build:gradle] gradle-project - Gradle Project [format:project, build:gradle] maven-build - Maven POM [format:build, build:maven] maven-project - Maven Project [format:project, build:maven] (default) ...
The
init
command supports many options. See the
help
output for more details. For
instance, the following command creates a Gradle project that uses Java 8 and
war
packaging:
$ spring init --build=gradle --java-version=1.8 --dependencies=websocket --packaging=war sample-app.zip Using service at https://start.spring.io Content saved to 'sample-app.zip'
$ spring shell Spring Boot (v2.0.0.M7) Hit TAB to complete. Type \'help' and hit RETURN for help, and \'exit' to quit.
From inside the embedded shell, you can run other commands directly:
$ version Spring CLI v2.0.0.M7
Spring Framework 4.0 has native support for a
beans{}
“DSL” (borrowed from
Grails
), and you can embed bean definitions in your Groovy application
scripts by using the same format. This is sometimes a good way to include external
features like middleware declarations, as shown in the following example:
@Configuration class Application implements CommandLineRunner { @Autowired SharedService service @Override void run(String... args) { println service.message import my.company.SharedService beans { service(SharedService) { message = "Hello World" }
You can mix class declarations with
beans{}
in the same file as long as they stay at
the top level, or, if you prefer, you can put the beans DSL in a separate file.
See Maven’s settings documentation for further information.
There are some sample groovy scripts available from the GitHub repository that you can use to try out the Spring Boot CLI. There is also extensive Javadoc throughout the source code .
If you find that you reach the limit of the CLI tool, you probably want to look at converting your application to a full Gradle or Maven built “Groovy project”. The next section covers Spring Boot’s " Build tool plugins ", which you can use with Gradle or Maven.
Spring Boot provides build tool plugins for Maven and Gradle. The plugins offer a variety of features, including the packaging of executable jars. This section provides more details on both plugins as well as some help should you need to extend an unsupported build system. If you are just getting started, you might want to read “ Chapter 13, Build Systems ” from the “ Part III, “Using Spring Boot” ” section first.
The Spring Boot Maven Plugin provides Spring Boot support in Maven, letting you package executable jar or war archives and run an application “in-place”. To use it, you must use Maven 3.2 (or later).
Note | |
---|---|
See the Spring Boot Maven Plugin Site for complete plugin documentation. |
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- ... --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.0.0.M7</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
$ mvn package $ ls target/*.jar target/myproject-1.0.0.jar target/myproject-1.0.0.jar.original
$ mvn package spring-boot:repackage $ ls target/*.jar target/myproject-1.0.0.jar target/myproject-1.0.0.jar.original
<pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <url>http://repo.spring.io/snapshot</url> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <url>http://repo.spring.io/milestone</url> </pluginRepository> </pluginRepositories>
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <!-- ... --> <packaging>jar</packaging> <!-- ... --> </project>
To build and run a project artifact, you can type the following:
$ mvn package $ java -jar target/mymodule-0.0.1-SNAPSHOT.jar
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <!-- ... --> <packaging>war</packaging> <!-- ... --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <!-- ... --> </dependencies> </project>
Tip | |
---|---|
See the “ Section 86.1, “Create a Deployable War File” ” section for more details on how to create a deployable war file. |
Advanced configuration options and examples are available in the plugin info page .
<project xmlns:ivy="antlib:org.apache.ivy.ant" xmlns:spring-boot="antlib:org.springframework.boot.ant" name="myapp" default="build"> </project>
You need to remember to start Ant using the
-lib
option, as shown in the following
example:
$ ant -lib <folder containing spring-boot-antlib-2.0.0.M7.jar>
Tip | |
---|---|
The “Using Spring Boot” section includes a more complete example of
using Apache Ant with
|
Attribute | Description | Required |
---|---|---|
|
The destination jar file to create |
Yes |
|
The root directory of Java class files |
Yes |
|
The main application class to run |
No
(default is first class found declaring a
|
The following nested elements can be used with the task:
Element | Description |
---|---|
|
One or more Resource Collections describing a set of Resources that should be added to the content of the created jar file. |
|
One or more Resource Collections that should be added to the set of jar libraries that make up the runtime dependency classpath of the application. |
<spring-boot:exejar destfile="target/my-application.jar" classes="target/classes" start-class="com.foo.MyApplication"> <resources> <fileset dir="src/main/resources" /> </resources> <fileset dir="lib" /> </spring-boot:exejar>
<exejar destfile="target/my-application.jar" classes="target/classes"> <fileset dir="lib" /> </exejar>
Attribute | Description | Required |
---|---|---|
|
The root directory of Java class files |
Yes
(unless
|
|
Can be used to short-circuit the
|
No |
|
The Ant property that should be set with the result |
No (result will be logged if unspecified) |
If you want to use a build tool other than Maven, Gradle, or Ant, you likely need to develop your own plugin. Executable jars need to follow a specific format and certain entries need to be written in an uncompressed form (see the “ executable jar format ” section in the appendix for details).
The Spring Boot Maven and Gradle plugins both make use of
spring-boot-loader-tools
to
actually generate jars. If you need to, you may use this library directly.
If you do not use
Repackager.setMainClass()
to specify a main class, the repackager
uses
ASM
to read class files and tries to find a suitable class with
a
public static void main(String[] args)
method. An exception is thrown if more than one
candidate is found.
The following listing shows a typical example repackage:
Repackager repackager = new Repackager(sourceJarFile); repackager.setBackupSource(false); repackager.repackage(new Libraries() { @Override public void doWithLibraries(LibraryCallback callback) throws IOException { // Build system specific implementation, callback for each dependency // callback.library(new Library(nestedFile, LibraryScope.COMPILE)); });
If you are interested in how the build tool plugins work, you can
look at the
spring-boot-tools
module on GitHub. More technical details of the executable jar format are covered in
the appendix
.
If you have specific build-related questions, you can check out the “ how-to ” guides.
If you have a specific problem that we do not cover here, you might want to check out
stackoverflow.com
to see if someone has
already provided an answer. This is also a great place to ask new questions (please use
the
spring-boot
tag).
We are also more than happy to extend this section. If you want to add a ‘how-to’, send us a pull request .
FailureAnalyzer
is a great way
to intercept an exception on startup and turn it into a human-readable message, wrapped
in a
FailureAnalysis
. Spring
Boot provides such an analyzer for application-context-related exceptions, JSR-303
validations, and more. You can also create your own.
AbstractFailureAnalyzer
is a convenient extension of
FailureAnalyzer
that checks the
presence of a specified exception type in the exception to handle. You can extend from
that so that your implementation gets a chance to handle the exception only when it is
actually present. If, for whatever reason, you cannot handle the exception, return
null
to give another implementation a chance to handle the exception.
FailureAnalyzer
implementations must be registered in
META-INF/spring.factories
.
The following example registers
ProjectConstraintViolationFailureAnalyzer
:
org.springframework.boot.diagnostics.FailureAnalyzer=\
com.example.ProjectConstraintViolationFailureAnalyzer
*AutoConfiguration
and read their sources. Pay special attention to the
@Conditional*
annotations to find out what features they enable and when. Add
--debug
to the command line or a System property
-Ddebug
to get a log on the
console of all the auto-configuration decisions that were made in your app. In a running
Actuator app, look at the
conditions
endpoint (
/actuator/conditions
or the JMX
equivalent) for the same information.
@ConfigurationProperties
(such as
ServerProperties
)
and read from there the available external configuration options. The
@ConfigurationProperties
has a
name
attribute that acts as a prefix to external
properties. Thus,
ServerProperties
has
prefix="server"
and its configuration properties
are
server.port
,
server.address
, and others. In a running Actuator app, look at the
configprops
endpoint.
bind
method on the
Binder
to pull configuration values explicitly out of the
Environment
in a relaxed manner. It is often used with a prefix.
@Value
annotations that bind directly to the
Environment
.
@ConditionalOnExpression
annotations that switch features on and off in
response to SpEL expressions, normally evaluated with placeholders resolved from the
Environment
.
addListeners
and
addInitializers
methods on
SpringApplication
before you run it.
context.initializer.classes
or
context.listener.classes
properties.
META-INF/spring.factories
and packaging
a jar file that the applications all use as a library.
The
SpringApplication
sends some special
ApplicationEvents
to the listeners (some
even before the context is created) and then registers the listeners for events published
by the
ApplicationContext
as well. See
“
Section 23.5, “Application Events and Listeners”
” in the
‘Spring Boot features’ section for a complete list.
It is also possible to customize the
Environment
before the application context is
refreshed by using
EnvironmentPostProcessor
. Each implementation should be registered in
META-INF/spring.factories
, as shown in the following example:
org.springframework.boot.env.EnvironmentPostProcessor=com.example.YourEnvironmentPostProcessor
The implementation can load arbitrary files and add them to the
Environment
. For
instance, the following example loads a YAML configuration file from the classpath:
public class EnvironmentPostProcessorExample implements EnvironmentPostProcessor { private final YamlPropertySourceLoader loader = new YamlPropertySourceLoader(); @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { Resource path = new ClassPathResource("com/example/myapp/config.yml"); PropertySource<?> propertySource = loadYaml(path); environment.getPropertySources().addLast(propertySource); private PropertySource<?> loadYaml(Resource path) { if (!path.exists()) { throw new IllegalArgumentException("Resource " + path + " does not exist"); try { return this.loader.load("custom-resource", path, null); catch (IOException ex) { throw new IllegalStateException( "Failed to load yaml configuration from " + path, ex); }
Tip | |
---|---|
The
|
Caution | |
---|---|
While using
|
You can use the
ApplicationBuilder
class to create parent/child
ApplicationContext
hierarchies. See “
Section 23.4, “Fluent Builder API”
”
in the ‘Spring Boot features’ section for more information.
app.encoding[email protected]@ app.java.version[email protected]@
Note | |
---|---|
Only production configuration is filtered that way (in other words, no filtering is
applied on
|
Tip | |
---|---|
If you enable the
|
If you do not use the starter parent, you need to include the following element inside
the
<build/>
element of your
pom.xml
:
<resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources>
You also need to include the following element inside
<plugins/>
:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.7</version> <configuration> <delimiters> <delimiter>@</delimiter> </delimiters> <useDefaultDelimiters>false</useDefaultDelimiters> </configuration> </plugin>
Note | |
---|---|
The
|
processResources { expand(project.properties) }
app.name=${name} app.description=${description}
Note | |
---|---|
Gradle’s
|
spring.main.web-environment=false spring.main.banner-mode=off
Then the Spring Boot banner is not printed on startup, and the application is not a web application.
Note | |
---|---|
The preceding example also demonstrates how flexible binding allows the use of
underscores (
|
new SpringApplicationBuilder() .bannerMode(Banner.Mode.OFF) .sources(demo.MyApp.class) .run(args);
Now consider the following configuration:
spring.main.sources=com.acme.Config,com.acme.ExtraConfig spring.main.banner-mode=console
By default, properties from different sources are added to the Spring
Environment
in a
defined order (see “
Chapter 24,
Externalized Configuration
” in
the ‘Spring Boot features’ section for the exact order).
A nice way to augment and modify this ordering is to add
@PropertySource
annotations to your
application sources. Classes passed to the
SpringApplication
static convenience
methods and those added using
setSources()
are inspected to see if they have
@PropertySources
. If they do, those properties are added to the
Environment
early
enough to be used in all phases of the
ApplicationContext
lifecycle. Properties added
in this way have lower priority than any added by using the default locations (such as
application.properties
), system properties, environment variables, or the command line.
You can also provide the following System properties (or environment variables) to change the behavior:
spring.config.name
(
SPRING_CONFIG_NAME
): Defaults to
application
as the root of
the file name.
spring.config.location
(
SPRING_CONFIG_LOCATION
): The file to load (such as a classpath
resource or a URL). A separate
Environment
property source is set up for this document
and it can be overridden by system properties, environment variables, or the
command line.
No matter what you set in the environment, Spring Boot always loads
application.properties
as described above. By default, if YAML is used, then files with
the ‘.yml’ extension are also added to the list.
Spring Boot logs the configuration files that are loaded at the
DEBUG
level and the
candidates it has not found at
TRACE
level.
See
ConfigFileApplicationListener
for more detail.
server.port=${port:8080}
Tip | |
---|---|
If you inherit from the
|
Note | |
---|---|
In this specific case, the port binding works in a PaaS environment such as Heroku
or Cloud Foundry In those two platforms, the
|
spring: application: name: cruncher datasource: driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://localhost/test server: port: 9000
The example YAML above corresponds to an
application.properties
file as follows:
spring.application.name=cruncher spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost/test server.port=9000
See “ Section 24.6, “Using YAML Instead of Properties” ” in the ‘Spring Boot features’ section for more information about YAML.
$ java -jar -Dspring.profiles.active=production demo-0.0.1-SNAPSHOT.jar
spring.profiles.active=production
See “ Chapter 25, Profiles ” in the “Spring Boot features” section for more information.
The appendix includes an
application.properties
example with a list of the most common properties supported by
Spring Boot. The definitive list comes from searching the source code for
@ConfigurationProperties
and
@Value
annotations as well as the occasional use of
Binder
.
Note | |
---|---|
Many starters support only Spring MVC, so they transitively bring
|
The following Maven example shows how to exclude Tomcat and include Jetty for Spring MVC:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!-- Exclude the Tomcat dependency --> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- Use Jetty instead --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>
The following Gradle example shows how to exclude Netty and include Undertow for Spring WebFlux:
configurations { // exclude Reactor Netty compile.exclude module: 'spring-boot-starter-reactor-netty' dependencies { compile 'org.springframework.boot:spring-boot-starter-webflux' // Use Undertow instead compile 'org.springframework.boot:spring-boot-starter-undertow' // ... }
Note | |
---|---|
|
Generally, you can follow the advice from
“
Section 73.8, “Discover Built-in Options for External Properties”
” about
@ConfigurationProperties
(
ServerProperties
is the main one here). However, you should
also look at
ServletWebServerFactoryCustomizer
. The Jetty APIs are quite rich, so, once
you have access to the
JettyServletWebServerFactory
, you can modify it in a number of
ways. Alternatively, if you need more control and customization, you can add your own
JettyServletWebServerFactory
.
Note | |
---|---|
If no
|
As
described above
, any
Servlet
or
Filter
beans are registered with the servlet container automatically. To disable
registration of a particular
Filter
or
Servlet
bean, create a registration bean for it
and mark it as disabled, as shown in the following example:
@Bean public FilterRegistrationBean registration(MyFilter filter) { FilterRegistrationBean registration = new FilterRegistrationBean(filter); registration.setEnabled(false); return registration; }
For more details, see “
Section 27.4.4, “Customizing Embedded Servlet Containers”
”
in the ‘Spring Boot features’ section, or the
ServerProperties
source
code.
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT) public class MyWebIntegrationTests { @Autowired ServletWebServerApplicationContext server; @LocalServerPort int port; // ... }
Note | |
---|---|
|
server.port=8443 server.ssl.key-store=classpath:keystore.jks server.ssl.key-store-password=secret server.ssl.key-password=another-secret
See
Ssl
for details of all of the
supported properties.
Using configuration such as the preceding example means the application no longer supports
a plain HTTP connector at port 8080. Spring Boot does not support the configuration of both
an HTTP connector and an HTTPS connector through
application.properties
. If you want to
have both, you need to configure one of them programmatically. We recommend
using
application.properties
to configure HTTPS, as the HTTP connector is the easier of
the two to configure programmatically. See the
spring-boot-sample-tomcat-multi-connectors
sample project for an example.
Note | |
---|---|
Spring Boot does not support
|
Currently, only Undertow and Tomcat are supported with this configuration key.
The library folder must be made available, if not already, to the JVM library path; this
can be done with a JVM argument such as
-Djava.library.path=/usr/local/opt/tomcat-native/lib
. More on this in the
official Tomcat documentation
.
Starting Tomcat 8.5.x without that native support will log the following error:
ERROR 8787 --- [ main] o.a.coyote.http11.Http11NioProtocol : The upgrade handler [org.apache.coyote.http2.Http2Protocol] for [h2] only supports upgrade via ALPN but has been configured for the ["https-jsse-nio-8443"] connector that does not support ALPN.
This error is not fatal, and the application starts with HTTP/1.1 SSL support still.
Running your application with Tomcat 9.0.x and JDK9 doesn’t require any native library
installed. To use Tomcat 9, you can override the
tomcat.version
build property with the
version of your choice.
Access logs can be configured for Tomcat, Undertow, and Jetty through their respective namespaces.
For instance, the following settings log access on Tomcat with a custom pattern .
server.tomcat.basedir=my-tomcat server.tomcat.accesslog.enabled=true server.tomcat.accesslog.pattern=%t %a "%r" %s (%D ms)
Note | |
---|---|
The default location for logs is a
|
Access logging for undertow can be configured in a similar fashion, as shown in the following example:
server.undertow.accesslog.enabled=true server.undertow.accesslog.pattern=%t %a "%r" %s (%D ms)
Logs are stored in a
logs
directory relative to the working directory of the
application. You can customize this location by setting the
server.undertow.accesslog.directory
property.
Finally, access logging for Jetty can also be configured as follows:
server.jetty.accesslog.enabled=true server.jetty.accesslog.filename=/var/log/jetty-access.log
By default, logs are redirected to
System.err
. For more details, see
the documentation
.
Note | |
---|---|
If your application runs in Cloud Foundry or Heroku, the
|
server.tomcat.remote-ip-header=x-your-remote-ip-header server.tomcat.protocol-header=x-your-protocol-header
server.tomcat.internal-proxies=192\\.168\\.\\d{1,3}\\.\\d{1,3}
Note | |
---|---|
The double backslashes are required only when you use a properties file for
configuration. If you use YAML, single backslashes are sufficient, and a value
equivalent to that shown in the preceding example would be
|
Note | |
---|---|
You can trust all proxies by setting the
|
Generally, you can follow the advice from
“
Section 73.8, “Discover Built-in Options for External Properties”
” about
@ConfigurationProperties
(
ServerProperties
is the main one here). However, you should
also look at
ServletWebServerFactoryCustomizer
and various Tomcat-specific
*Customizers
that you can add. The Tomcat APIs are quite rich, so, once you have
access to the
TomcatServletWebServerFactory
, you can modify it in a number of ways.
Alternatively, if you need more control and customization, you can add your own
TomcatServletWebServerFactory
.
java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value
@Bean public WebServerFactoryCustomizer<TomcatServletWebServerFactory> cookieProcessorCustomizer() { return (serverFactory) -> serverFactory.addContextCustomizers( (context) -> context.setCookieProcessor(new LegacyCookieProcessor())); }
Generally you can follow the advice from
“
Section 73.8, “Discover Built-in Options for External Properties”
” about
@ConfigurationProperties
(
ServerProperties
and
ServerProperties.Undertow
are the
main ones here). However, you should also look at
ServletWebServerFactoryCustomizer
.
Once you have access to the
UndertowServletWebServerFactory
, you can use an
UndertowBuilderCustomizer
to modify Undertow’s configuration to meet your needs.
Alternatively, if you need more control and customization, you can add your own
UndertowServletWebServerFactory
.
@RestController public class MyController { @RequestMapping("/thing") public MyThing thing() { return new MyThing(); }
As long as
MyThing
can be serialized by Jackson2 (true for a normal POJO or Groovy
object), then
localhost:8080/thing
serves a JSON representation of it by
default. Note that, in a browser, you might sometimes see XML responses, because browsers
tend to send accept headers that prefer XML.
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency>
<dependency> <groupId>org.codehaus.woodstox</groupId> <artifactId>woodstox-core-asl</artifactId> </dependency>
@XmlRootElement public class MyThing { private String name; // .. getters and setters }
Spring Boot has also some features to make it easier to customize this behavior.
Jackson enum | Environment property |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
For example, to enable pretty print, set
spring.jackson.serialization.indent_output=true
.
Note that, thanks to the use of
relaxed binding
, the case of
indent_output
does not have to match the case of the
corresponding enum constant, which is
INDENT_OUTPUT
.
This environment-based configuration is applied to the auto-configured
Jackson2ObjectMapperBuilder
bean and applies to any mappers created by
using the builder, including the auto-configured
ObjectMapper
bean.
The context’s
Jackson2ObjectMapperBuilder
can be customized by one or more
Jackson2ObjectMapperBuilderCustomizer
beans. Such customizer beans can be ordered
(Boot’s own customizer has an order of 0), letting additional customization be applied
both before and after Boot’s customization.
Any beans of type
com.fasterxml.jackson.databind.Module
are automatically registered
with the auto-configured
Jackson2ObjectMapperBuilder
and are applied to any
ObjectMapper
instances that it creates. This provides a global mechanism for contributing custom
modules when you add new features to your application.
If you want to replace the default
ObjectMapper
completely, either define a
@Bean
of
that type and mark it as
@Primary
or, if you prefer the builder-based
approach, define a
Jackson2ObjectMapperBuilder
@Bean
. Note that, in either case,
doing so disables all auto-configuration of the
ObjectMapper
.
If you provide any
@Beans
of type
MappingJackson2HttpMessageConverter
,
they replace the default value in the MVC configuration. Also, a convenience bean of type
HttpMessageConverters
is provided (always available if you use the default MVC
configuration). It has some useful methods to access the default and user-enhanced
message converters.
See the “
Section 75.4, “Customize the @ResponseBody Rendering”
” section and the
WebMvcAutoConfiguration
source code for more details.
See the
WebMvcAutoConfiguration
source code for more details.
See the
MultipartAutoConfiguration
source for more details.
WebMvcAutoConfiguration
adds the following
ViewResolvers
to your context:
InternalResourceViewResolver
named ‘defaultViewResolver’. This one locates
physical resources that can be rendered by using the
DefaultServlet
(including static
resources and JSP pages, if you use those). It applies a prefix and a suffix to the
view name and then looks for a physical resource with that path in the servlet context
(the defaults are both empty but are accessible for external configuration through
spring.mvc.view.prefix
and
spring.mvc.view.suffix
). You can override it by
providing a bean of the same type.
BeanNameViewResolver
named ‘beanNameViewResolver’. This is a useful member of the
view resolver chain and picks up any beans with the same name as the
View
being
resolved. It should not be necessary to override or replace it.
ContentNegotiatingViewResolver
named ‘viewResolver’ is added only if there
are
actually beans of type
View
present. This is a ‘master’ resolver, delegating to all
the others and attempting to find a match to the ‘Accept’ HTTP header sent by the
client. There is a useful
blog about
ContentNegotiatingViewResolver
that you might like to study to learn more, and you might also look at the source code
for detail. You can switch off the auto-configured
ContentNegotiatingViewResolver
by
defining a bean named ‘viewResolver’.
ThymeleafViewResolver
named
‘thymeleafViewResolver’. It looks for resources by surrounding the view name with a
prefix and suffix. The prefix is
spring.thymeleaf.prefix
, and the suffix is
spring.thymeleaf.suffix
. The values of the prefix and suffix default to
‘classpath:/templates/’ and ‘.html’, respectively. You can override
ThymeleafViewResolver
by providing a bean of the same name.
FreeMarkerViewResolver
named
‘freeMarkerViewResolver’. It looks for resources in a loader path (which is
externalized to
spring.freemarker.templateLoaderPath
and has a default value of
‘classpath:/templates/’) by surrounding the view name with a prefix and suffix. The
prefix is externalized to
spring.freemarker.prefix
, and the suffix is externalized to
spring.freemarker.suffix
. The default values of the prefix and suffix are empty and
‘.ftl’, respectively. You can override
FreeMarkerViewResolver
by providing a bean
of the same name.
groovy-templates
is on your classpath), you
also have a
GroovyMarkupViewResolver
named ‘groovyMarkupViewResolver’. It looks for
resources in a loader path by surrounding the view name with a prefix and suffix
(externalized to
spring.groovy.template.prefix
and
spring.groovy.template.suffix
).
The prefix and suffix have default values of ‘classpath:/templates/’ and ‘.tpl’,
respectively. You can override
GroovyMarkupViewResolver
by providing a bean of the
same name.
For more detail, see the following sections:
As described in
Section 33.1, “RestTemplate Customization”
,
you can use a
RestTemplateCustomizer
with
RestTemplateBuilder
to build a customized
RestTemplate
. This is the recommended approach for creating a
RestTemplate
configured
to use a proxy.
The exact details of the proxy configuration depend on the underlying client request
factory that is being used. The following example configures
HttpComponentsClientRequestFactory
with an
HttpClient
that uses a proxy for all hosts
except
192.168.0.5
:
static class ProxyCustomizer implements RestTemplateCustomizer { @Override public void customize(RestTemplate restTemplate) { HttpHost proxy = new HttpHost("proxy.example.com"); HttpClient httpClient = HttpClientBuilder.create() .setRoutePlanner(new DefaultProxyRoutePlanner(proxy) { @Override public HttpHost determineProxy(HttpHost target, HttpRequest request, HttpContext context) throws HttpException { if (target.getHostName().equals("192.168.0.5")) { return null; return super.determineProxy(target, request, context); }).build(); restTemplate.setRequestFactory( new HttpComponentsClientHttpRequestFactory(httpClient)); }
Spring Boot has no mandatory logging dependency, except for the Commons Logging API, of
which there are many implementations to choose from. To use
Logback
,
you need to include it and
jcl-over-slf4j
(which implements the Commons Logging API) on
the classpath. The simplest way to do that is through the starters, which all depend on
spring-boot-starter-logging
. For a web application, you need only
spring-boot-starter-web
, since it depends transitively on the logging starter. If you
use Maven, the following dependency adds logging for you:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
Spring Boot has a
LoggingSystem
abstraction that attempts to configure logging based on
the content of the classpath. If Logback is available, it is the first choice.
If the only change you need to make to logging is to set the levels of various loggers,
you can do so in
application.properties
by using the "logging.level" prefix, as shown
in the following example:
logging.level.org.springframework.web=DEBUG logging.level.org.hibernate=ERROR
You can also set the location of a file to which to write the log (in addition to the console) by using "logging.file".
To configure the more fine-grained settings of a logging system, you need to use the native
configuration format supported by the
LoggingSystem
in question. By default, Spring Boot
picks up the native configuration from its default location for the system (such as
classpath:logback.xml
for Logback), but you can set the location of the config file by
using the "logging.config" property.
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml"/> <logger name="org.springframework.web" level="DEBUG"/> </configuration>
${PID}
: The current process ID.
${LOG_FILE}
: Whether
logging.file
was set in Boot’s external configuration.
${LOG_PATH}
: Whether
logging.path
(representing a directory for
log files to live in) was set in Boot’s external configuration.
${LOG_EXCEPTION_CONVERSION_WORD}
: Whether
logging.exception-conversion-word
was set
in Boot’s external configuration.
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/defaults.xml" /> <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/> <include resource="org/springframework/boot/logging/logback/file-appender.xml" /> <root level="INFO"> <appender-ref ref="FILE" /> </root> </configuration>
logging.file=myapplication.log
Spring Boot supports
Log4j 2
for logging
configuration if it is on the classpath. If you use the starters for
assembling dependencies, you have to exclude Logback and then include log4j 2
instead. If you do not use the starters, you need to provide (at least)
jcl-over-slf4j
in addition to Log4j 2.
The simplest path is probably through the starters, even though it requires some jiggling with excludes. The following example shows how to set up the starters in Maven:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
Note | |
---|---|
The Log4j starters gather together the dependencies for common logging
requirements (such as having Tomcat use
|
Format | Dependencies | File names |
---|---|---|
YAML |
|
|
JSON |
|
|
To configure your own
DataSource
, define a
@Bean
of that type in your configuration.
Spring Boot reuses your
DataSource
anywhere one is required, including database
initialization. If you need to externalize some settings, you can bind your
DataSource
to the environment (see
“
Section 24.7.1, “Third-party Configuration”
”).
The following example shows how to define a data source in a bean:
@Bean @ConfigurationProperties(prefix="app.datasource") public DataSource dataSource() { return new FancyDataSource(); }
The following example shows how to define a data source by setting properties:
app.datasource.url=jdbc:h2:mem:mydb app.datasource.username=sa app.datasource.pool-size=30
Assuming that your
FancyDataSource
has regular JavaBean properties for the URL, the
username, and the pool size, these settings are bound automatically before the
DataSource
is made available to other components. The regular
database initialization
also happens
(so the relevant sub-set of
spring.datasource.*
can still be used with your custom
configuration).
You can apply the same principle if you configure a custom JNDI
DataSource
, as shown in
the following example:
@Bean(destroyMethod="") @ConfigurationProperties(prefix="app.datasource") public DataSource dataSource() throws Exception { JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup(); return dataSourceLookup.getDataSource("java:comp/env/jdbc/YourDS"); }
Spring Boot also provides a utility builder class, called
DataSourceBuilder
, that can
be used to create one of the standard data sources (if it is on the classpath). The
builder can detect the one to use based on what’s available on the classpath. It also
auto-detects the driver based on the JDBC URL.
The following example shows how to create a data source by using a
DataSourceBuilder
:
@Bean @ConfigurationProperties("app.datasource") public DataSource dataSource() { return DataSourceBuilder.create().build(); }
To run an app with that
DataSource
, all you need is the connection
information. Pool-specific settings can also be provided. Check the implementation that
is going to be used at runtime for more details.
The following example shows how to define a JDBC data source by setting properties:
app.datasource.url=jdbc:mysql://localhost/test app.datasource.username=dbuser app.datasource.password=dbpass app.datasource.pool-size=30
However, there is a catch. Because the actual type of the connection pool is not exposed,
no keys are generated in the metadata for your custom
DataSource
and no completion is
available in your IDE (because the
DataSource
interface exposes no properties). Also, if
you happen to have Hikari on the classpath, this basic setup does not work, because Hikari
has no
url
property (but does have a
jdbcUrl
property). In that case, you must rewrite your
configuration as follows:
app.datasource.jdbc-url=jdbc:mysql://localhost/test app.datasource.username=dbuser app.datasource.password=dbpass app.datasource.maximum-pool-size=30
You can fix that by forcing the connection pool to use and return a dedicated
implementation rather than
DataSource
. You cannot change the implementation
at runtime, but the list of options will be explicit.
The following example shows how create a
HikariDataSource
with
DataSourceBuilder
:
@Bean @ConfigurationProperties("app.datasource") public HikariDataSource dataSource() { return DataSourceBuilder.create().type(HikariDataSource.class).build(); }
You can even go further by leveraging what
DataSourceProperties
does for you — that is,
by providing a default embedded database with a sensible username and
password if no URL is provided. You can easily initialize a
DataSourceBuilder
from the state of any
DataSourceProperties
object, so you could also inject the one Spring Boot creates
automatically. However, that would split your configuration into two namespaces:
url
,
username
,
password
,
type
, and
driver
on
spring.datasource
and the rest on your custom
namespace (
app.datasource
). To avoid that, you can redefine a custom
DataSourceProperties
on your custom namespace, as shown in the following example:
@Bean @Primary @ConfigurationProperties("app.datasource") public DataSourceProperties dataSourceProperties() { return new DataSourceProperties(); @Bean @ConfigurationProperties("app.datasource") public HikariDataSource dataSource(DataSourceProperties properties) { return properties.initializeDataSourceBuilder().type(HikariDataSource.class) .build(); }
This setup puts you
in sync
with what Spring Boot does for you by default, except that
a dedicated connection pool is chosen (in code) and its settings are exposed in the same
namespace. Because
DataSourceProperties
is taking care of the
url
/
jdbcUrl
translation for you, you can configure it as follows:
app.datasource.url=jdbc:mysql://localhost/test app.datasource.username=dbuser app.datasource.password=dbpass app.datasource.maximum-pool-size=30
Note | |
---|---|
Because your custom configuration chooses to go with Hikari,
|
See “
Section 29.1, “Configure a DataSource”
” in the
‘Spring Boot features’ section and the
DataSourceAutoConfiguration
class for more details.
@Bean @Primary @ConfigurationProperties("app.datasource.foo") public DataSourceProperties fooDataSourceProperties() { return new DataSourceProperties(); @Bean @Primary @ConfigurationProperties("app.datasource.foo") public DataSource fooDataSource() { return fooDataSourceProperties().initializeDataSourceBuilder().build(); @Bean @ConfigurationProperties("app.datasource.bar") public BasicDataSource barDataSource() { return DataSourceBuilder.create().type(BasicDataSource.class).build(); }
Tip | |
---|---|
|
app.datasource.foo.type=com.zaxxer.hikari.HikariDataSource app.datasource.foo.maximum-pool-size=30 app.datasource.bar.url=jdbc:mysql://localhost/test app.datasource.bar.username=dbuser app.datasource.bar.password=dbpass app.datasource.bar.max-total=30
@Bean @Primary @ConfigurationProperties("app.datasource.foo") public DataSourceProperties fooDataSourceProperties() { return new DataSourceProperties(); @Bean @Primary @ConfigurationProperties("app.datasource.foo") public DataSource fooDataSource() { return fooDataSourceProperties().initializeDataSourceBuilder().build(); @Bean @ConfigurationProperties("app.datasource.bar") public DataSourceProperties barDataSourceProperties() { return new DataSourceProperties(); @Bean @ConfigurationProperties("app.datasource.bar") public DataSource barDataSource() { return barDataSourceProperties().initializeDataSourceBuilder().build(); }
For many applications, all you need is to put the right Spring Data dependencies on
your classpath (there is a
spring-boot-starter-data-jpa
for JPA and a
spring-boot-starter-data-mongodb
for Mongodb) and create some repository interfaces to handle your
@Entity
objects. Examples are in the
JPA sample
and the
Mongodb sample
.
Spring Boot tries to guess the location of your
@Repository
definitions, based on the
@EnableAutoConfiguration
it finds. To get more control, use the
@EnableJpaRepositories
annotation (from Spring Data JPA).
Note | |
---|---|
Specifying a
|
The most common options to set are shown in the following example:
spring.jpa.hibernate.naming.physical-strategy=com.example.MyPhysicalNamingStrategy spring.jpa.show-sql=true
Hibernate uses
two different naming strategies
to map
names from the object model to the corresponding database names. The fully qualified
class name of the physical and the implicit strategy implementations can be configured by
setting the
spring.jpa.hibernate.naming.physical-strategy
and
spring.jpa.hibernate.naming.implicit-strategy
properties, respectively. Alternatively,
if
ImplicitNamingStrategy
or
PhysicalNamingStrategy
beans are available in the
application context, Hibernate will be automatically configured to use them.
By default, Spring Boot configures the physical naming strategy with
SpringPhysicalNamingStrategy
. This implementation provides the same table structure as
Hibernate 4: all dots are replaced by underscores and camel casing is replaced by
underscores as well. By default, all table names are generated in lower case, but it is
possible to override that flag if your schema requires it.
For example, a
TelephoneNumber
entity is mapped to the
telephone_number
table.
If you prefer to use Hibernate 5’s default instead, set the following property:
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
Alternatively, configure the following bean:
@Bean public PhysicalNamingStrategy physicalNamingStrategy() { return new PhysicalNamingStrategyStandardImpl(); }
See
HibernateJpaAutoConfiguration
and
JpaBaseConfiguration
for more details.
// add two data sources configured as above @Bean public LocalContainerEntityManagerFactoryBean customerEntityManagerFactory( EntityManagerFactoryBuilder builder) { return builder .dataSource(customerDataSource()) .packages(Customer.class) .persistenceUnit("customers") .build(); @Bean public LocalContainerEntityManagerFactoryBean orderEntityManagerFactory( EntityManagerFactoryBuilder builder) { return builder .dataSource(orderDataSource()) .packages(Order.class) .persistenceUnit("orders") .build(); }
@Configuration @EnableJpaRepositories(basePackageClasses = Customer.class, entityManagerFactoryRef = "customerEntityManagerFactory") public class CustomerConfiguration { @Configuration @EnableJpaRepositories(basePackageClasses = Order.class, entityManagerFactoryRef = "orderEntityManagerFactory") public class OrderConfiguration { }
See
JpaBaseConfiguration
for the default settings.
Spring Boot exposes a set of useful properties (from the
spring.data.rest
namespace) that
customize the
RepositoryRestConfiguration
.
If you need to provide additional customization, you should use a
RepositoryRestConfigurer
bean.
Note | |
---|---|
If you do not specify any order on your custom
|
Note | |
---|---|
You can output the schema creation by enabling the
|
Note | |
---|---|
In a JPA-based app, you can choose to let Hibernate create the schema or use
|
Spring Boot supports two higher-level migration tools: Flyway and Liquibase .
spring.flyway.locations=db/migration/{vendor}
Rather than using
db/migration
, the preceding configuration sets the folder to use according
to the type of the database (such as
db/migration/mysql
for MySQL). The list of supported
database are available in
DatabaseDriver
.
See the Flyway class from flyway-core for details of available settings such as schemas
and others. In addition, Spring Boot provides a small set of properties (in
FlywayProperties
)
that can be used to disable the migrations or switch off the location checking. Spring
Boot calls
Flyway.migrate()
to perform the database migration. If you would like
more control, provide a
@Bean
that implements
FlywayMigrationStrategy
.
Flyway supports SQL and Java
callbacks
.
To use SQL-based callbacks, place the callback scripts in the
classpath:db/migration
folder. To use Java-based callbacks, create one or more beans that implement
FlywayCallback
or, preferably, extend
BaseFlywayCallback
. Any such beans are
automatically registered with
Flyway
. They can be ordered by using
@Order
or by
implementing
Ordered
.
By default, Flyway autowires the (
@Primary
)
DataSource
in your context and
uses that for migrations. If you like to use a different
DataSource
, you can create
one and mark its
@Bean
as
@FlywayDataSource
. If you do so and want two data sources,
remember to create another one and mark it as
@Primary
. Alternatively, you can use
Flyway’s native
DataSource
by setting
spring.flyway.[url,user,password]
in external properties.
There is a Flyway sample so that you can see how to set things up.
You can also use Flyway to provide data for specific scenarios. For example, you can
place test-specific migrations in
src/test/resources
and they are run only when your
application starts for testing. If you want to be more sophisticated, you can use
profile-specific configuration to customize
spring.flyway.locations
so that certain
migrations run only when a particular profile is active. For example, in
application-dev.properties
, you might specify the following setting:
spring.flyway.locations=classpath:/db/migration,classpath:/dev/db/migration
With that setup, migrations in
dev/db/migration
run only when the
dev
profile is
active.
See
LiquibaseProperties
for details about available settings such as contexts, the default schema, and others.
There is a Liquibase sample so that you can see how to set things up.
Note | |
---|---|
By default, batch applications require a
|
By default, it executes
all
Jobs
in the application context on startup (see
JobLauncherCommandLineRunner
for details). You can narrow down to a specific job or jobs by specifying
spring.batch.job.names
(comma-separated job name patterns).
If the application context includes a
JobRegistry
, the jobs in
spring.batch.job.names
are looked up in the registry instead of being autowired from the
context. This is a common pattern with more complex systems, where multiple jobs are
defined in child contexts and registered centrally.
See BatchAutoConfiguration @EnableBatchProcessing for more details.
For more detail, see the
ManagementServerProperties
source code and
“
Section 50.2, “Customizing the Management Server Port”
”
in the ‘Production-ready features’ section.
Note | |
---|---|
Set
|
Overriding the error page with your own depends on the templating technology that you
use. For example, if you use Thymeleaf, you can add an
error.html
template.
If you use FreeMarker, you can add an
error.ftl
template. In general, you
need a
View
that resolves with a name of
error
or a
@Controller
that handles
the
/error
path. Unless you replaced some of the default configuration, you should find
a
BeanNameViewResolver
in your
ApplicationContext
, so a
@Bean
named
error
would
be a simple way of doing that. See
ErrorMvcAutoConfiguration
for more options.
See also the section on “ Error Handling ” for details of how to register handlers in the servlet container.
If you define a
@Configuration
with
@EnableWebSecurity
anywhere in your application,
it switches off the default webapp security settings in Spring Boot (but leaves the
Actuator’s security enabled). To tweak the defaults try setting properties in
security.*
(see
SecurityProperties
for details of available settings) and the
SECURITY
section of
“
Common Application Properties
”.
If you provide a
@Bean
of type
AuthenticationManager
, the default one is not
created, so you have the full feature set of Spring Security available (such as
various authentication options
).
Spring Security also provides a convenient
AuthenticationManagerBuilder
, which can be
used to build an
AuthenticationManager
with common options. The recommended way to
use this in a webapp is to inject it into a void method in a
WebSecurityConfigurerAdapter
, as shown in the following example:
@Configuration public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("barry").password("password").roles("USER"); // ... etc. // ... other stuff for application security }
You get the best results if you put this in a nested class or a standalone class
(that is, not mixed in with a lot of other
@Beans
that might be allowed to influence the
order of instantiation). The
secure web sample
is a useful template to follow.
If you experience instantiation issues (for example, when using JDBC or JPA for the user detail store),
it might be worth extracting the
AuthenticationManagerBuilder
callback into a
GlobalAuthenticationConfigurerAdapter
(in the
init()
method so that it happens before the
authentication manager is needed elsewhere), as shown in the following example:
@Configuration public class AuthenticationManagerConfiguration extends GlobalAuthenticationConfigurerAdapter { @Override public void init(AuthenticationManagerBuilder auth) { auth.inMemoryAuthentication() // ... etc. }
Spring Boot supports hot swapping. This section answers questions about how it works.
There are several options for hot reloading. The recommended approach is to use
spring-boot-devtools
, as it provides
additional development-time features, such as support for fast application restarts
and LiveReload as well as sensible development-time configuration (such as template caching).
Devtools works by monitoring the classpath for changes. This means that static resource
changes must be "built" for the change to take affect. By default, this happens
automatically in Eclipse when you save your changes. In IntelliJ IDEA, Make Project
triggers the necessary build. Due to the
default restart
exclusions
, changes to static resources do not trigger a restart of your application.
They do, however, trigger a live reload.
Alternatively, running in an IDE (especially with debugging on) is a good way to do development (all modern IDEs allow reloading of static resources and usually also hot-swapping of Java class changes).
Finally, the
Maven and Gradle plugins
can
be configured (see the
addResources
property) to support running from the command line
with reloading of static files directly from source. You can use that with an external
css/js compiler process if you are writing that code with higher-level tools.
Most of the templating technologies supported by Spring Boot include a configuration
option to disable caching (described later in this document). If you use the
spring-boot-devtools
module, these properties are
automatically configured
for you at development time.
If you use Thymeleaf, set
spring.thymeleaf.cache
to
false
. See
ThymeleafAutoConfiguration
for other Thymeleaf customization options.
If you use FreeMarker, set
spring.freemarker.cache
to
false
. See
FreeMarkerAutoConfiguration
for other FreeMarker customization options.
If you use Groovy templates, set
spring.groovy.template.cache
to
false
. See
GroovyTemplateAutoConfiguration
for other Groovy customization options.
The
spring-boot-devtools
module includes support for automatic application restarts.
While not as fast as technologies such as
JRebel
it is usually significantly faster than a “cold start”. You should probably give it a try
before investigating some of the more complex reload options discussed later in this document.
For more details, see the Chapter 20, Developer Tools section.
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.0.0.M7</version> <executions> <execution> <goals> <goal>build-info</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
Tip | |
---|---|
See the Spring Boot Maven Plugin documentation for more details. |
The following example does the same with Gradle:
springBoot { buildInfo() }
Additional properties can be added by using the DSL, as shown in the following example:
springBoot { buildInfo { additionalProperties = [ 'foo': 'bar' }
<build> <plugins> <plugin> <groupId>pl.project13.maven</groupId> <artifactId>git-commit-id-plugin</artifactId> </plugin> </plugins> </build>
Gradle users can achieve the same result by using the
gradle-git-properties
plugin, as shown in the following example:
plugins { id "com.gorylenko.gradle-git-properties" version "1.4.17" }
Tip | |
---|---|
The commit time in
|
If you use a Maven build that inherits directly or indirectly from
spring-boot-dependencies
(for instance
spring-boot-starter-parent
) but you want to override a specific
third-party dependency, you can add appropriate
<properties>
elements. Browse
the
spring-boot-dependencies
POM for a complete list of properties. For example, to pick a different
slf4j
version
you would add the following property:
<properties> <slf4j.version>1.7.5<slf4j.version> </properties>
Note | |
---|---|
Doing so only works if your Maven project inherits (directly or indirectly) from
|
Warning | |
---|---|
Each Spring Boot release is designed and tested against a specific set of third-party dependencies. Overriding versions may cause compatibility issues. |
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.0.0.M7</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
See the plugin documentation for full usage details.
If you cannot rearrange your code as recommended above, Spring Boot’s Maven and Gradle
plugins must be configured to produce a separate artifact that is suitable for use as a
dependency. The executable archive cannot be used as a dependency as the
executable jar
format
packages application classes in
BOOT-INF/classes
. This means
that they cannot be found when the executable jar is used as a dependency.
To produce the two artifacts, one that can be used as a dependency and one that is executable, a classifier must be specified. This classifier is applied to the name of the executable archive, leaving the default archive for use as a dependency.
To configure a classifier of
exec
in Maven, the following configuration can be used:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <classifier>exec</classifier> </configuration> </plugin> </plugins> </build>
To attach a remote debugger to a Spring Boot application that was started with Maven, you can use
the
jvmArguments
property of the
maven plugin
.
See this example for more details.
BOOT-INF/classes
directory. If you are building a war, package the application’s
classes in a nested
WEB-INF/classes
directory as usual.
BOOT-INF/lib
directory for a jar or
WEB-INF/lib
for a war. Remember
not
to compress the entries in the archive.
provided
(embedded container) dependencies in a nested
BOOT-INF/lib
directory for a jar or
WEB-INF/lib-provided
for a war. Remember
not
to compress the
entries in the archive.
spring-boot-loader
classes at the root of the archive (so that the
Main-Class
is available).
JarLauncher
for a jar file) as a
Main-Class
attribute in the manifest and specify the other properties it needs as manifest entries — principally, by setting a
Start-Class
property.
The following example shows how to build an executable archive with Ant:
<target name="build" depends="compile"> <jar destfile="target/${ant.project.name}-${spring-boot.version}.jar" compress="false"> <mappedresources> <fileset dir="target/classes" /> <globmapper from="*" to="BOOT-INF/classes/*"/> </mappedresources> <mappedresources> <fileset dir="src/main/resources" erroronmissingdir="false"/> <globmapper from="*" to="BOOT-INF/classes/*"/> </mappedresources> <mappedresources> <fileset dir="${lib.dir}/runtime" /> <globmapper from="*" to="BOOT-INF/lib/*"/> </mappedresources> <zipfileset src="${lib.dir}/loader/spring-boot-loader-jar-${spring-boot.version}.jar" /> <manifest> <attribute name="Main-Class" value="org.springframework.boot.loader.JarLauncher" /> <attribute name="Start-Class" value="${start-class}" /> </manifest> </target>
The
Ant Sample
has a
build.xml
file with a
manual
task that should work if you run it with the following command:
$ ant -lib <folder containing ivy-2.2.jar> clean manual
Then you can run the application with the following command:
$ java -jar target/*.jar
@SpringBootApplication public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); }
<packaging>war</packaging>
apply plugin: 'war'
<dependencies> <!-- … --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <!-- … --> </dependencies>
dependencies { providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' }
Note | |
---|---|
|
If you use the
Spring Boot build tools
,
marking the embedded servlet container dependency as provided produces an executable war
file with the provided dependencies packaged in a
lib-provided
directory. This means
that, in addition to being deployable to a servlet container, you can also run your
application by using
java -jar
on the command line.
Tip | |
---|---|
Take a look at Spring Boot’s sample applications for a Maven-based example of the previously described configuration. |
For a non-web application, it should be easy to convert an existing Spring application to
a Spring Boot application. To do so, throw away the code that creates your
ApplicationContext
and replace it with calls to
SpringApplication
or
SpringApplicationBuilder
. Spring MVC web applications are generally amenable to first
creating a deployable war application and then migrating it later to an executable war
or jar. See the
Getting
Started Guide on Converting a jar to a war
.
To create a deployable war by extending
SpringBootServletInitializer
(for example, in a class
called
Application
) and add the Spring Boot
@SpringBootApplication
annotation, use
code similar to that shown in the following example:
@SpringBootApplication public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { // Customize the application or call application.sources(...) to add sources // Since our example is itself a @Configuration class (via @SpringBootApplication) // we actually don't need to override this method. return application; }
Remember that, whatever you put in the
sources
is merely a Spring
ApplicationContext
.
Normally, anything that already works should work here. There might be some beans you can
remove later and let Spring Boot provide its own defaults for them, but it should be
possible to get something working before you need to do that.
Static resources can be moved to
/public
(or
/static
or
/resources
or
/META-INF/resources
) in the classpath root. The same applies to
messages.properties
(which Spring Boot automatically detects in the root of the classpath).
Vanilla usage of Spring
DispatcherServlet
and Spring Security should require no further
changes. If you have other features in your application (for instance, using other
servlets or filters), you may need to add some configuration to your
Application
context, by replacing those elements from the
web.xml
as follows:
@Bean
of type
Servlet
or
ServletRegistrationBean
installs that bean in the
container as if it were a
<servlet/>
and
<servlet-mapping/>
in
web.xml
.
@Bean
of type
Filter
or
FilterRegistrationBean
behaves similarly (as a
<filter/>
and
<filter-mapping/>
).
ApplicationContext
in an XML file can be added through an
@ImportResource
in
your
Application
. Alternatively, simple cases where annotation configuration is
heavily used already can be recreated in a few lines as
@Bean
definitions.
Once the war file is working, you can make it executable by adding a
main
method to
your
Application
, as shown in the following example:
public static void main(String[] args) { SpringApplication.run(Application.class, args); }
Note | |
---|---|
If you intend to start your application as a war or as an executable application, you
need to share the customizations of the builder in a method that is both available to the
@SpringBootApplication public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return configureApplication(builder); public static void main(String[] args) { configureApplication(new SpringApplicationBuilder()).run(args); private static SpringApplicationBuilder configureApplication(SpringApplicationBuilder builder) { return builder.sources(Application.class).bannerMode(Banner.Mode.OFF); } |
Applications can fall into more than one category:
web.xml
.
web.xml
.
All of these should be amenable to translation, but each might require slightly different techniques.
Servlet 3.0+ applications might translate pretty easily if they already use the Spring
Servlet 3.0+ initializer support classes. Normally, all the code from an existing
WebApplicationInitializer
can be moved into a
SpringBootServletInitializer
. If your
existing application has more than one
ApplicationContext
(for example, if it uses
AbstractDispatcherServletInitializer
) then you might be able to combine all your context
sources into a single
SpringApplication
. The main complication you might encounter is if
combining does not work and you need to maintain the context hierarchy. See the
entry on building a hierarchy
for
examples. An existing parent context that contains web-specific features usually
needs to be broken up so that all the
ServletContextAware
components are in the child
context.
Applications that are not already Spring applications might be convertible to Spring
Boot applications, and the previously mentioned guidance may help. However, you may yet
encounter problems. In that case, we suggest
asking questions on Stack Overflow
with a tag of
spring-boot
.
A typical initializer for WebLogic should resemble the following example:
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.web.SpringBootServletInitializer; import org.springframework.web.WebApplicationInitializer; @SpringBootApplication public class MyApplication extends SpringBootServletInitializer implements WebApplicationInitializer { }
<?xml version="1.0" encoding="UTF-8"?> <wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd"> <wls:container-descriptor> <wls:prefer-application-packages> <wls:package-name>org.slf4j</wls:package-name> </wls:prefer-application-packages> </wls:container-descriptor> </wls:weblogic-web-app>
Spring Boot uses Servlet 3.0 APIs to initialize the
ServletContext
(register
Servlets
and so on), so you cannot use the same application in a Servlet 2.5 container.
It
is
, however, possible to run a Spring Boot application on an older container with some
special tools. If you include
org.springframework.boot:spring-boot-legacy
as a
dependency (
maintained separately
to the
core of Spring Boot and currently available at 1.0.2.RELEASE), all you should need to do
is create a
web.xml
and declare a context listener to create the application context and
your filters and servlets. The context listener is a special purpose one for Spring Boot,
but the rest of it is normal for a Spring application in Servlet 2.5. The following Maven
example shows how to set up a Spring Boot project to run in a Servlet 2.5 container:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>demo.Application</param-value> </context-param> <listener> <listener-class>org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener</listener-class> </listener> <filter> <filter-name>metricsFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>metricsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextAttribute</param-name> <param-value>org.springframework.web.context.WebApplicationContext.ROOT</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>appServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
In the preceding example, we use a single application context (the one created by the context
listener) and attach it to the
DispatcherServlet
by using an
init
parameter. This is
normal in a Spring Boot application (you normally only have one application context).
By default, the Spring Boot starter (
spring-boot-starter-data-redis
) uses
Lettuce
. You need to exclude that
dependency and include the
Jedis
one instead. Spring
Boot manages these dependencies to help make this process as easy as possible.
The following example shows how to do so in Maven:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>
The following example shows how to do so in Gradle:
configurations { compile.exclude module: "lettuce" dependencies { compile("redis.clients:jedis") // ... }
Note | |
---|---|
Property contributions can come from additional jar files on your classpath, so you should not consider this an exhaustive list. Also, you can define your own properties. |
Warning | |
---|---|
This sample file is meant as a guide only. Do not copy and paste the entire content into your application. Rather, pick only the properties that you need. |
# =================================================================== # COMMON SPRING BOOT PROPERTIES # This sample file is provided as a guideline. Do NOT copy it in its # entirety to your own application. ^^^ # =================================================================== # ---------------------------------------- # CORE PROPERTIES # ---------------------------------------- # BANNER banner.charset=UTF-8 # Banner file encoding. banner.location=classpath:banner.txt # Banner file location. banner.image.location=classpath:banner.gif # Banner image file location (jpg or png can also be used). banner.image.width= # Width of the banner image in chars (default 76) banner.image.height= # Height of the banner image in chars (default based on image height) banner.image.margin= # Left hand image margin in chars (default 2) banner.image.invert= # Whether images should be inverted for dark terminal themes (default false) # LOGGING logging.config= # Location of the logging configuration file. For instance, `classpath:logback.xml` for Logback logging.exception-conversion-word=%wEx # Conversion word used when logging exceptions. logging.file= # Log file name. For instance, `myapp.log` logging.file.max-history= # Maximum of archive log files to keep. Only supported with the default logback setup. logging.file.max-size= # Maximum log file size. Only supported with the default logback setup. logging.level.*= # Log levels severity mapping. For instance, `logging.level.org.springframework=DEBUG` logging.path= # Location of the log file. For instance, `/var/log` logging.pattern.console= # Appender pattern for output to the console. Supported only with the default Logback setup. logging.pattern.file= # Appender pattern for output to a file. Supported only with the default Logback setup. logging.pattern.level= # Appender pattern for log level (default: %5p). Supported only with the default Logback setup. logging.pattern.dateformat= # Appender pattern for log dateformat (default yyyy-MM-dd HH:mm:ss.SSS). Only supported with the default logback setup. logging.register-shutdown-hook=false # Register a shutdown hook for the logging system when it is initialized. # AOP spring.aop.auto=true # Add @EnableAspectJAutoProxy. spring.aop.proxy-target-class=true # Whether subclass-based (CGLIB) proxies are to be created (true), as opposed to standard Java interface-based proxies (false). # IDENTITY (ContextIdApplicationContextInitializer) spring.application.index= # Application index. spring.application.name= # Application name. # ADMIN (SpringApplicationAdminJmxAutoConfiguration) spring.application.admin.enabled=false # Whether to enable admin features for the application. spring.application.admin.jmx-name=org.springframework.boot:type=Admin,name=SpringApplication # JMX name of the application admin MBean. # AUTO-CONFIGURATION spring.autoconfigure.exclude= # Auto-configuration classes to exclude. # SPRING CORE spring.beaninfo.ignore=true # Whether to skip search of BeanInfo classes. # SPRING CACHE (CacheProperties) spring.cache.cache-names= # Comma-separated list of cache names to create if supported by the underlying cache manager. spring.cache.caffeine.spec= # The spec to use to create caches. See CaffeineSpec for more details on the spec format. spring.cache.couchbase.expiration=0ms # Entry expiration in milliseconds. By default, the entries never expire. spring.cache.ehcache.config= # The location of the configuration file to use to initialize EhCache. spring.cache.infinispan.config= # The location of the configuration file to use to initialize Infinispan. spring.cache.jcache.config= # The location of the configuration file to use to initialize the cache manager. spring.cache.jcache.provider= # Fully qualified name of the CachingProvider implementation to use to retrieve the JSR-107 compliant cache manager. Needed only if more than one JSR-107 implementation is available on the classpath. spring.cache.redis.cache-null-values=true # Allow caching null values. spring.cache.redis.key-prefix= # Key prefix. spring.cache.redis.time-to-live=0ms # Entry expiration. By default the entries never expire. spring.cache.redis.use-key-prefix=true # Whether to use the key prefix when writing to Redis. spring.cache.type= # Cache type. By default, auto-detected according to the environment. # SPRING CONFIG - using environment property only (ConfigFileApplicationListener) spring.config.additional-location= # Config file locations used in addition to the defaults. spring.config.location= # Config file locations. spring.config.name=application # Config file name. # HAZELCAST (HazelcastProperties) spring.hazelcast.config= # The location of the configuration file to use to initialize Hazelcast. # PROJECT INFORMATION (ProjectInfoProperties) spring.info.build.location=classpath:META-INF/build-info.properties # Location of the generated build-info.properties file. spring.info.git.location=classpath:git.properties # Location of the generated git.properties file. # JMX spring.jmx.default-domain= # JMX domain name. spring.jmx.enabled=true # Expose management beans to the JMX domain. spring.jmx.server=mbeanServer # MBeanServer bean name. # Email (MailProperties) spring.mail.default-encoding=UTF-8 # Default MimeMessage encoding. spring.mail.host= # SMTP server host. For instance, `smtp.example.com` spring.mail.jndi-name= # Session JNDI name. When set, takes precedence over other mail settings. spring.mail.password= # Login password of the SMTP server. spring.mail.port= # SMTP server port. spring.mail.properties.*= # Additional JavaMail session properties. spring.mail.protocol=smtp # Protocol used by the SMTP server. spring.mail.test-connection=false # Whether to test that the mail server is available on startup. spring.mail.username= # Login user of the SMTP server. # APPLICATION SETTINGS (SpringApplication) spring.main.banner-mode=console # Mode used to display the banner when the application runs. spring.main.sources= # Sources (class names, package names, or XML resource locations) to include in the ApplicationContext. spring.main.web-application-type= # Flag to explicitly request a specific type of web application. If not set, auto-detected based on the classpath. # FILE ENCODING (FileEncodingApplicationListener) spring.mandatory-file-encoding= # Expected character encoding the application must use. # INTERNATIONALIZATION (MessageSourceProperties) spring.messages.always-use-message-format=false # Whether to always apply the MessageFormat rules, parsing even messages without arguments. spring.messages.basename=messages # Comma-separated list of basenames, each following the ResourceBundle convention. spring.messages.cache-duration=-1 # Loaded resource bundle files cache duration. When not set, bundles are cached forever. spring.messages.encoding=UTF-8 # Message bundles encoding. spring.messages.fallback-to-system-locale=true # Whether to fall back to the system Locale if no files for a specific Locale have been found. spring.messages.use-code-as-default-message=false # Whether to use the message code as the default message instead of throwing a "NoSuchMessageException". Recommended during development only. # OUTPUT spring.output.ansi.enabled=detect # Configures the ANSI output. # PID FILE (ApplicationPidFileWriter) spring.pid.fail-on-write-error= # Fails if ApplicationPidFileWriter is used but it cannot write the PID file. spring.pid.file= # Location of the PID file to write (if ApplicationPidFileWriter is used). # PROFILES spring.profiles.active= # Comma-separated list (or list if using YAML) of active profiles. spring.profiles.include= # Unconditionally activate the specified comma-separated list of profiles (or list of profiles if using YAML). # QUARTZ SCHEDULER (QuartzProperties) spring.quartz.job-store-type=memory # Quartz job store type. spring.quartz.properties.*= # Additional Quartz Scheduler properties. spring.quartz.jdbc.initialize-schema=embedded # Database schema initialization mode. spring.quartz.jdbc.schema=classpath:org/quartz/impl/jdbcjobstore/tables_@@platform@@.sql # Path to the SQL file to use to initialize the database schema. # REACTOR (ReactorCoreProperties) spring.reactor.stacktrace-mode.enabled=false # Whether Reactor should collect stacktrace information at runtime. # SENDGRID (SendGridAutoConfiguration) spring.sendgrid.api-key= # SendGrid API key. spring.sendgrid.proxy.host= # SendGrid proxy host. spring.sendgrid.proxy.port= # SendGrid proxy port. # ---------------------------------------- # WEB PROPERTIES # ---------------------------------------- # EMBEDDED SERVER CONFIGURATION (ServerProperties) server.address= # Network address to which the server should bind. server.compression.enabled=false # Whether response compression is enabled. server.compression.excluded-user-agents= # List of user-agents to exclude from compression. server.compression.mime-types=text/html,text/xml,text/plain,text/css,text/javascript,application/javascript # Comma-separated list of MIME types that should be compressed. server.compression.min-response-size=2048 # Minimum response size that is required for compression to be performed. server.connection-timeout= # Time that connectors wait for another HTTP request before closing the connection. When not set, the connector's container-specific default is used. Use a value of -1 to indicate no (that is, an infinite) timeout. server.display-name=application # Display name of the application. server.max-http-header-size=0 # Maximum size, in bytes, of the HTTP message header. server.error.include-exception=false # Include the "exception" attribute. server.error.include-stacktrace=never # When to include a "stacktrace" attribute. server.error.path=/error # Path of the error controller. server.error.whitelabel.enabled=true # Enable the default error page displayed in browsers in case of a server error. server.http2.enabled=true # Whether to enable HTTP/2 support, if the current environment supports it. server.jetty.acceptors= # Number of acceptor threads to use. server.jetty.accesslog.append=false # Append to log. server.jetty.accesslog.date-format=dd/MMM/yyyy:HH:mm:ss Z # Timestamp format of the request log. server.jetty.accesslog.enabled=false # Enable access log. server.jetty.accesslog.extended-format=false # Enable extended NCSA format. server.jetty.accesslog.file-date-format= # Date format to place in log file name. server.jetty.accesslog.filename= # Log filename. If not specified, logs redirect to "System.err". server.jetty.accesslog.locale= # Locale of the request log. server.jetty.accesslog.log-cookies=false # Enable logging of the request cookies. server.jetty.accesslog.log-latency=false # Enable logging of request processing time. server.jetty.accesslog.log-server=false # Enable logging of the request hostname. server.jetty.accesslog.retention-period=31 # Number of days before rotated log files are deleted. server.jetty.accesslog.time-zone=GMT # Timezone of the request log. server.jetty.max-http-post-size=0 # Maximum size, in bytes, of the HTTP post or put content. server.jetty.selectors= # Number of selector threads to use. server.port=8080 # Server HTTP port. server.server-header= # Value to use for the Server response header (if empty, no header is sent) server.use-forward-headers= # Whether X-Forwarded-* headers should be applied to the HttpRequest. server.servlet.context-parameters.*= # Servlet context init parameters server.servlet.context-path= # Context path of the application. server.servlet.jsp.class-name=org.apache.jasper.servlet.JspServlet # The class name of the JSP servlet. server.servlet.jsp.init-parameters.*= # Init parameters used to configure the JSP servlet. server.servlet.jsp.registered=true # Whether the JSP servlet is registered. server.servlet.path=/ # Path of the main dispatcher servlet. server.session.cookie.comment= # Comment for the session cookie. server.session.cookie.domain= # Domain for the session cookie. server.session.cookie.http-only= # "HttpOnly" flag for the session cookie. server.session.cookie.max-age= # Maximum age of the session cookie. If a duration suffix is not specified, seconds will be used. server.session.cookie.name= # Session cookie name. server.session.cookie.path= # Path of the session cookie. server.session.cookie.secure= # "Secure" flag for the session cookie. server.session.persistent=false # Whether to persist session data between restarts. server.session.store-dir= # Directory used to store session data. server.session.timeout= # Session timeout. If a duration suffix is not specified, seconds will be used. server.session.tracking-modes= # Session tracking modes (one or more of the following: "cookie", "url", "ssl"). server.ssl.ciphers= # Supported SSL ciphers. server.ssl.client-auth= # Whether client authentication is wanted ("want") or needed ("need"). Requires a trust store. server.ssl.enabled= # Enable SSL support. server.ssl.enabled-protocols= # Enabled SSL protocols. server.ssl.key-alias= # Alias that identifies the key in the key store. server.ssl.key-password= # Password used to access the key in the key store. server.ssl.key-store= # Path to the key store that holds the SSL certificate (typically a jks file). server.ssl.key-store-password= # Password used to access the key store. server.ssl.key-store-provider= # Provider for the key store. server.ssl.key-store-type= # Type of the key store. server.ssl.protocol=TLS # SSL protocol to use. server.ssl.trust-store= # Trust store that holds SSL certificates. server.ssl.trust-store-password= # Password used to access the trust store. server.ssl.trust-store-provider= # Provider for the trust store. server.ssl.trust-store-type= # Type of the trust store. server.tomcat.accept-count= # Maximum queue length for incoming connection requests when all possible request processing threads are in use. server.tomcat.accesslog.buffered=true # Whether to buffer output such that it is flushed only periodically. server.tomcat.accesslog.directory=logs # Directory in which log files are created. Can be absolute or relative to the Tomcat base dir. server.tomcat.accesslog.enabled=false # Enable access log. server.tomcat.accesslog.file-date-format=.yyyy-MM-dd # Date format to place in the log file name. server.tomcat.accesslog.pattern=common # Format pattern for access logs. server.tomcat.accesslog.prefix=access_log # Log file name prefix. server.tomcat.accesslog.rename-on-rotate=false # Whether to defer inclusion of the date stamp in the file name until rotate time. server.tomcat.accesslog.request-attributes-enabled=false # Set request attributes for the IP address, Hostname, protocol, and port used for the request. server.tomcat.accesslog.rotate=true # Whether to enable access log rotation. server.tomcat.accesslog.suffix=.log # Log file name suffix. server.tomcat.additional-tld-skip-patterns= # Comma-separated list of additional patterns that match jars to ignore for TLD scanning. server.tomcat.background-processor-delay=30s # Delay between the invocation of backgroundProcess methods. If a duration suffix is not specified, seconds will be used. server.tomcat.basedir= # Tomcat base directory. If not specified, a temporary directory is used. server.tomcat.internal-proxies=10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|\\ 192\\.168\\.\\d{1,3}\\.\\d{1,3}|\\ 169\\.254\\.\\d{1,3}\\.\\d{1,3}|\\ 127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|\\ 172\\.1[6-9]{1}\\.\\d{1,3}\\.\\d{1,3}|\\ 172\\.2[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}|\\ 172\\.3[0-1]{1}\\.\\d{1,3}\\.\\d{1,3} # regular expression matching trusted IP addresses. server.tomcat.max-connections= # Maximum number of connections that the server accepts and processes at any given time. server.tomcat.max-http-header-size=0 # Maximum size, in bytes, of the HTTP message header. server.tomcat.max-http-post-size=0 # Maximum size, in bytes, of the HTTP post content. server.tomcat.max-threads=0 # Maximum number of worker threads. server.tomcat.min-spare-threads=0 # Minimum number of worker threads. server.tomcat.port-header=X-Forwarded-Port # Name of the HTTP header used to override the original port value. server.tomcat.protocol-header= # Header that holds the incoming protocol, usually named "X-Forwarded-Proto". server.tomcat.protocol-header-https-value=https # Value of the protocol header indicating whether the incoming request uses SSL. server.tomcat.redirect-context-root= # Whether requests to the context root should be redirected by appending a / to the path. server.tomcat.remote-ip-header= # Name of the HTTP header from which the remote IP is extracted. For instance, `X-FORWARDED-FOR`. server.tomcat.resource.cache-ttl= # Time-to-live of the static resource cache. server.tomcat.uri-encoding=UTF-8 # Character encoding to use to decode the URI. server.undertow.accesslog.dir= # Undertow access log directory. server.undertow.accesslog.enabled=false # Whether to enable the access log. server.undertow.accesslog.pattern=common # Format pattern for access logs. server.undertow.accesslog.prefix=access_log. # Log file name prefix. server.undertow.accesslog.rotate=true # Whether to enable access log rotation. server.undertow.accesslog.suffix=log # Log file name suffix. server.undertow.buffer-size= # Size of each buffer, in bytes. server.undertow.direct-buffers= # Whether to allocate buffers outside the Java heap. server.undertow.io-threads= # Number of I/O threads to create for the worker. server.undertow.eager-filter-init=true # Whether servlet filters should be initialized on startup. server.undertow.max-http-post-size=0 # Maximum size, in bytes, of the HTTP post content. server.undertow.worker-threads= # Number of worker threads. # FREEMARKER (FreeMarkerProperties) spring.freemarker.allow-request-override=false # Whether HttpServletRequest attributes are allowed to override (hide) controller generated model attributes of the same name. spring.freemarker.allow-session-override=false # Whether HttpSession attributes are allowed to override (hide) controller generated model attributes of the same name. spring.freemarker.cache=false # Whether to enable template caching. spring.freemarker.charset=UTF-8 # Template encoding. spring.freemarker.check-template-location=true # Whether to check that the templates location exists. spring.freemarker.content-type=text/html # Content-Type value. spring.freemarker.enabled=true # Whether to enable MVC view resolution for this technology. spring.freemarker.expose-request-attributes=false # Whether all request attributes should be added to the model prior to merging with the template. spring.freemarker.expose-session-attributes=false # Whether all HttpSession attributes should be added to the model prior to merging with the template. spring.freemarker.expose-spring-macro-helpers=true # Whether to expose a RequestContext for use by Spring's macro library, under the name "springMacroRequestContext". spring.freemarker.prefer-file-system-access=true # Whether to prefer file system access for template loading. File system access enables hot detection of template changes. spring.freemarker.prefix= # Prefix that gets prepended to view names when building a URL. spring.freemarker.request-context-attribute= # Name of the RequestContext attribute for all views. spring.freemarker.settings.*= # Well-known FreeMarker keys which are passed to FreeMarker's Configuration. spring.freemarker.suffix=.ftl # Suffix that gets appended to view names when building a URL. spring.freemarker.template-loader-path=classpath:/templates/ # Comma-separated list of template paths. spring.freemarker.view-names= # White list of view names that can be resolved. # GROOVY TEMPLATES (GroovyTemplateProperties) spring.groovy.template.allow-request-override=false # Whether HttpServletRequest attributes are allowed to override (hide) controller generated model attributes of the same name. spring.groovy.template.allow-session-override=false # Whether HttpSession attributes are allowed to override (hide) controller generated model attributes of the same name. spring.groovy.template.cache= # Whether to enable template caching. spring.groovy.template.charset=UTF-8 # Template encoding. spring.groovy.template.check-template-location=true # Check that the templates location exists. spring.groovy.template.configuration.*= # See GroovyMarkupConfigurer spring.groovy.template.content-type=test/html # Content-Type value. spring.groovy.template.enabled=true # Whether to enable MVC view resolution for this technology. spring.groovy.template.expose-request-attributes=false # Whether all request attributes should be added to the model prior to merging with the template. spring.groovy.template.expose-session-attributes=false # Whether all HttpSession attributes should be added to the model prior to merging with the template. spring.groovy.template.expose-spring-macro-helpers=true # Whether to expose a RequestContext for use by Spring's macro library, under the name "springMacroRequestContext". spring.groovy.template.prefix= # Prefix that gets prepended to view names when building a URL. spring.groovy.template.request-context-attribute= # Name of the RequestContext attribute for all views. spring.groovy.template.resource-loader-path=classpath:/templates/ # Template path. spring.groovy.template.suffix=.tpl # Suffix that gets appended to view names when building a URL. spring.groovy.template.view-names= # White list of view names that can be resolved. # SPRING HATEOAS (HateoasProperties) spring.hateoas.use-hal-as-default-json-media-type=true # Whether application/hal+json responses should be sent to requests that accept application/json. # HTTP message conversion spring.http.converters.preferred-json-mapper= # Preferred JSON mapper to use for HTTP message conversion. By default, auto-detected according to the environment. # HTTP encoding (HttpEncodingProperties) spring.http.encoding.charset=UTF-8 # Charset of HTTP requests and responses. Added to the "Content-Type" header if not set explicitly. spring.http.encoding.enabled=true # Whether to enable http encoding support. spring.http.encoding.force= # Whether to force the encoding to the configured charset on HTTP requests and responses. spring.http.encoding.force-request= # Whether to force the encoding to the configured charset on HTTP requests. Defaults to true when "force" has not been specified. spring.http.encoding.force-response= # Whether to force the encoding to the configured charset on HTTP responses. spring.http.encoding.mapping= # Locale in which to encode mapping. # MULTIPART (MultipartProperties) spring.servlet.multipart.enabled=true # Whether to enable support of multipart uploads. spring.servlet.multipart.file-size-threshold=0 # Threshold after which files are written to disk. Values can use the suffixes "MB" or "KB" to indicate megabytes or kilobytes, respectively. spring.servlet.multipart.location= # Intermediate location of uploaded files. spring.servlet.multipart.max-file-size=1MB # Max file size. Values can use the suffixes "MB" or "KB" to indicate megabytes or kilobytes, respectively. spring.servlet.multipart.max-request-size=10MB # Max request size. Values can use the suffixes "MB" or "KB" to indicate megabytes or kilobytes, respectively. spring.servlet.multipart.resolve-lazily=false # Whether to resolve the multipart request lazily at the time of file or parameter access. # JACKSON (JacksonProperties) spring.jackson.date-format= # Date format string or a fully-qualified date format class name. For instance, `yyyy-MM-dd HH:mm:ss`. spring.jackson.default-property-inclusion= # Controls the inclusion of properties during serialization. Configured with one of the values in Jackson's JsonInclude.Include enumeration. spring.jackson.deserialization.*= # Jackson on/off features that affect the way Java objects are deserialized. spring.jackson.generator.*= # Jackson on/off features for generators. spring.jackson.joda-date-time-format= # Joda date time format string. If not configured, "date-format" is used as a fallback if it is configured with a format string. spring.jackson.locale= # Locale used for formatting. spring.jackson.mapper.*= # Jackson general purpose on/off features. spring.jackson.parser.*= # Jackson on/off features for parsers. spring.jackson.property-naming-strategy= # One of the constants on Jackson's PropertyNamingStrategy. Can also be a fully-qualified class name of a PropertyNamingStrategy subclass. spring.jackson.serialization.*= # Jackson on/off features that affect the way Java objects are serialized. spring.jackson.time-zone= # Time zone used when formatting dates. For instance, "America/Los_Angeles" or "GMT+10". # JERSEY (JerseyProperties) spring.jersey.application-path= # Path that serves as the base URI for the application. If specified, overrides the value of "@ApplicationPath". spring.jersey.filter.order=0 # Jersey filter chain order. spring.jersey.init.*= # Init parameters to pass to Jersey through the servlet or filter. spring.jersey.servlet.load-on-startup=-1 # Load on startup priority of the Jersey servlet. spring.jersey.type=servlet # Jersey integration type. # SPRING LDAP (LdapProperties) spring.ldap.urls= # LDAP URLs of the server. spring.ldap.base= # Base suffix from which all operations should originate. spring.ldap.username= # Login username of the server. spring.ldap.password= # Login password of the server. spring.ldap.base-environment.*= # LDAP specification settings. # EMBEDDED LDAP (EmbeddedLdapProperties) spring.ldap.embedded.base-dn= # The base DN spring.ldap.embedded.credential.username= # Embedded LDAP username. spring.ldap.embedded.credential.password= # Embedded LDAP password. spring.ldap.embedded.ldif=classpath:schema.ldif # Schema (LDIF) script resource reference. spring.ldap.embedded.port= # Embedded LDAP port. spring.ldap.embedded.validation.enabled=true # Whether to enable LDAP schema validation. spring.ldap.embedded.validation.schema= # Path to the custom schema. # MUSTACHE TEMPLATES (MustacheAutoConfiguration) spring.mustache.allow-request-override= # Whether HttpServletRequest attributes are allowed to override (hide) controller generated model attributes of the same name. spring.mustache.allow-session-override= # Whether HttpSession attributes are allowed to override (hide) controller generated model attributes of the same name. spring.mustache.cache= # Whether to enable template caching. spring.mustache.charset= # Template encoding. spring.mustache.check-template-location= # Whether to check that the templates location exists. spring.mustache.content-type= # Content-Type value. spring.mustache.enabled= # Whether to enable MVC view resolution for this technology. spring.mustache.expose-request-attributes= # Whether all request attributes should be added to the model prior to merging with the template. spring.mustache.expose-session-attributes= # Whether all HttpSession attributes should be added to the model prior to merging with the template. spring.mustache.expose-spring-macro-helpers= # Whether to expose a RequestContext for use by Spring's macro library under the name "springMacroRequestContext". spring.mustache.prefix=classpath:/templates/ # Prefix to apply to template names. spring.mustache.request-context-attribute= # Name of the RequestContext attribute for all views. spring.mustache.suffix=.mustache # Suffix to apply to template names. spring.mustache.view-names= # White list of view names that can be resolved. # SPRING MVC (WebMvcProperties) spring.mvc.async.request-timeout= # Amount of time before asynchronous request handling times out. spring.mvc.date-format= # Date format to use. For instance, `dd/MM/yyyy`. spring.mvc.dispatch-trace-request=false # Whether to dispatch TRACE requests to the FrameworkServlet doService method. spring.mvc.dispatch-options-request=true # Whether to dispatch OPTIONS requests to the FrameworkServlet doService method. spring.mvc.favicon.enabled=true # Whether to enable resolution of favicon.ico. spring.mvc.formcontent.putfilter.enabled=true # Whether to enable Spring's HttpPutFormContentFilter. spring.mvc.ignore-default-model-on-redirect=true # Whether the content of the "default" model should be ignored during redirect scenarios. spring.mvc.locale= # Locale to use. By default, this locale is overridden by the "Accept-Language" header. spring.mvc.locale-resolver=accept-header # Define how the locale should be resolved. spring.mvc.log-resolved-exception=false # Whether to enable warn logging of exceptions resolved by a "HandlerExceptionResolver". spring.mvc.media-types.*= # Maps file extensions to media types for content negotiation. spring.mvc.message-codes-resolver-format= # Formatting strategy for message codes. For instance, `PREFIX_ERROR_CODE`. spring.mvc.servlet.load-on-startup=-1 # Load on startup priority of the Spring Web Services servlet. spring.mvc.static-path-pattern=/** # Path pattern used for static resources. spring.mvc.throw-exception-if-no-handler-found=false # Whether a "NoHandlerFoundException" should be thrown if no Handler was found to process a request. spring.mvc.view.prefix= # Spring MVC view prefix. spring.mvc.view.suffix= # Spring MVC view suffix. # SPRING RESOURCES HANDLING (ResourceProperties) spring.resources.add-mappings=true # Whether to enable default resource handling. spring.resources.cache.cachecontrol.max-age= # Maximum time the response should be cached, in seconds if no duration suffix is not specified. spring.resources.cache.cachecontrol.no-cache= # Indicate that the cached response can be reused only if re-validated with the server. spring.resources.cache.cachecontrol.no-store= # Indicate to not cache the response in any case. spring.resources.cache.cachecontrol.must-revalidate= # Indicate that once it has become stale, a cache must not use the response without re-validating it with the server. spring.resources.cache.cachecontrol.no-transform= # Indicate intermediaries (caches and others) that they should not transform the response content. spring.resources.cache.cachecontrol.cache-public= # Indicate that any cache may store the response. spring.resources.cache.cachecontrol.cache-private= # Indicate that the response message is intended for a single user and must not be stored by a shared cache. spring.resources.cache.cachecontrol.proxy-revalidate= # Same meaning as the "must-revalidate" directive, except that it does not apply to private caches. spring.resources.cache.cachecontrol.stale-while-revalidate= # Maximum time the response can be served after it becomes stale, in seconds if no duration suffix is not specified. spring.resources.cache.cachecontrol.stale-if-error= # Maximum time the response may be used when errors are encountered, in seconds if no duration suffix is not specified. spring.resources.cache.cachecontrol.s-max-age= # Maximum time the response should be cached by shared caches, in seconds if no duration suffix is not specified. spring.resources.cache.period= # Cache period for the resources served by the resource handler. If a duration suffix is not specified, seconds will be used. spring.resources.chain.cache=true # Whether to enable caching in the Resource chain. spring.resources.chain.enabled= # Whether to enable the Spring Resource Handling chain. By default, disabled unless at least one strategy has been enabled. spring.resources.chain.gzipped=false # Whether to enable resolution of already gzipped resources. spring.resources.chain.html-application-cache=false # Whether to enable HTML5 application cache manifest rewriting. spring.resources.chain.strategy.content.enabled=false # Enable the content Version Strategy. spring.resources.chain.strategy.content.paths=/** # Comma-separated list of patterns to apply to the content Version Strategy. spring.resources.chain.strategy.content.enabled=false # Whether to enable the content Version Strategy. spring.resources.chain.strategy.fixed.enabled=false # Whether to enable the fixed Version Strategy. spring.resources.chain.strategy.fixed.paths=/** # Comma-separated list of patterns to apply to the fixed Version Strategy. spring.resources.chain.strategy.fixed.version= # Version string to use for the fixed Version Strategy. spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ # Locations of static resources. # SPRING SESSION (SessionProperties) spring.session.store-type= # Session store type. spring.session.servlet.filter-order=-2147483598 # Session repository filter order. spring.session.servlet.filter-dispatcher-types=ASYNC,ERROR,REQUEST # Session repository filter dispatcher types. # SPRING SESSION HAZELCAST (HazelcastSessionProperties) spring.session.hazelcast.flush-mode=on-save # Sessions flush mode. spring.session.hazelcast.map-name=spring:session:sessions # Name of the map used to store sessions. # SPRING SESSION JDBC (JdbcSessionProperties) spring.session.jdbc.cleanup-cron=0 * * * * * # Cron expression for expired session cleanup job. spring.session.jdbc.initialize-schema=embedded # Database schema initialization mode. spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-@@platform@@.sql # Path to the SQL file to use to initialize the database schema. spring.session.jdbc.table-name=SPRING_SESSION # Name of the database table used to store sessions. # SPRING SESSION MONGODB (MongoSessionProperties) spring.session.mongodb.collection-name=sessions # Collection name used to store sessions. # SPRING SESSION REDIS (RedisSessionProperties) spring.session.redis.cleanup-cron=0 * * * * * # Cron expression for expired session cleanup job. spring.session.redis.flush-mode=on-save # Sessions flush mode. spring.session.redis.namespace=spring:session # Namespace for keys used to store sessions. # THYMELEAF (ThymeleafAutoConfiguration) spring.thymeleaf.cache=true # Whether to enable template caching. spring.thymeleaf.check-template=true # Whether to check that the template exists before rendering it. spring.thymeleaf.check-template-location=true # Whether to check that the templates location exists. spring.thymeleaf.enabled=true # Whether to enable Thymeleaf view resolution for Web frameworks. spring.thymeleaf.enable-spring-el-compiler=false # Enable the SpringEL compiler in SpringEL expressions. spring.thymeleaf.encoding=UTF-8 # Template files encoding. spring.thymeleaf.excluded-view-names= # Comma-separated list of view names that should be excluded from resolution. spring.thymeleaf.mode=HTML5 # Template mode to be applied to templates. See also Thymeleaf's TemplateMode enum. spring.thymeleaf.prefix=classpath:/templates/ # Prefix that gets prepended to view names when building a URL. spring.thymeleaf.reactive.chunked-mode-view-names= # Comma-separated list of view names (patterns allowed) that should be the only ones executed in CHUNKED mode when a max chunk size is set. spring.thymeleaf.reactive.full-mode-view-names= # Comma-separated list of view names (patterns allowed) that should be executed in FULL mode even if a max chunk size is set. spring.thymeleaf.reactive.max-chunk-size= # Maximum size of data buffers used for writing to the response, in bytes. spring.thymeleaf.reactive.media-types= # Media types supported by the view technology. spring.thymeleaf.servlet.content-type=text/html # Content-Type value written to HTTP responses. spring.thymeleaf.suffix=.html # Suffix that gets appended to view names when building a URL. spring.thymeleaf.template-resolver-order= # Order of the template resolver in the chain. spring.thymeleaf.view-names= # Comma-separated list of view names that can be resolved. # SPRING WEB FLUX (WebFluxProperties) spring.webflux.static-path-pattern=/** # Path pattern used for static resources. # SPRING WEB SERVICES (WebServicesProperties) spring.webservices.path=/services # Path that serves as the base URI for the services. spring.webservices.servlet.init= # Servlet init parameters to pass to Spring Web Services. spring.webservices.servlet.load-on-startup=-1 # Load on startup priority of the Spring Web Services servlet. spring.webservices.wsdl-locations= # Comma-separated list of locations of WSDLs and accompanying XSDs to be exposed as beans. # ---------------------------------------- # SECURITY PROPERTIES # ---------------------------------------- # SECURITY (SecurityProperties) spring.security.filter.order=0 # Security filter chain order. spring.security.filter.dispatcher-types=ASYNC,ERROR,REQUEST # Security filter chain dispatcher types. # SECURITY OAUTH2 CLIENT (OAuth2ClientProperties) spring.security.oauth2.client.provider.*= # OAuth provider details. spring.security.oauth2.client.registration.*= # OAuth client registrations. # ---------------------------------------- # DATA PROPERTIES # ---------------------------------------- # FLYWAY (FlywayProperties) spring.flyway.allow-mixed-migrations= # spring.flyway.baseline-description= # spring.flyway.baseline-on-migrate= # spring.flyway.baseline-version=1 # Version to start migration spring.flyway.check-location=true # Whether to check that migration scripts location exists. spring.flyway.clean-disabled= # spring.flyway.clean-on-validation-error= # spring.flyway.enabled=true # Whether to enable flyway. spring.flyway.encoding= # spring.flyway.group= # spring.flyway.ignore-failed-future-migration= # spring.flyway.ignore-future-migrations= # spring.flyway.ignore-missing-migrations= # spring.flyway.init-sqls= # SQL statements to execute to initialize a connection immediately after obtaining it. spring.flyway.installed-by= # spring.flyway.locations=classpath:db/migration # The locations of migrations scripts. spring.flyway.mixed= # spring.flyway.out-of-order= # spring.flyway.password= # JDBC password to use if you want Flyway to create its own DataSource. spring.flyway.placeholder-prefix= # spring.flyway.placeholder-replacement= # spring.flyway.placeholder-suffix= # spring.flyway.placeholders.*= # spring.flyway.repeatable-sql-migration-prefix= # spring.flyway.schemas= # schemas to update spring.flyway.skip-default-callbacks= # spring.flyway.skip-default-resolvers= # spring.flyway.sql-migration-prefix=V # spring.flyway.sql-migration-separator= # spring.flyway.sql-migration-suffix=.sql # spring.flyway.table= # spring.flyway.target= # spring.flyway.url= # JDBC url of the database to migrate. If not set, the primary configured data source is used. spring.flyway.user= # Login user of the database to migrate. spring.flyway.validate-on-migrate= # # LIQUIBASE (LiquibaseProperties) spring.liquibase.change-log=classpath:/db/changelog/db.changelog-master.yaml # Change log configuration path. spring.liquibase.check-change-log-location=true # Whether to check that the change log location exists. spring.liquibase.contexts= # Comma-separated list of runtime contexts to use. spring.liquibase.default-schema= # Default database schema. spring.liquibase.drop-first=false # Whether to first drop the database schema. spring.liquibase.enabled=true # Whether to enable Liquibase support. spring.liquibase.labels= # Comma-separated list of runtime labels to use. spring.liquibase.parameters.*= # Change log parameters. spring.liquibase.password= # Login password of the database to migrate. spring.liquibase.rollback-file= # File to which rollback SQL is written when an update is performed. spring.liquibase.url= # JDBC URL of the database to migrate. If not set, the primary configured data source is used. spring.liquibase.user= # Login user of the database to migrate. # COUCHBASE (CouchbaseProperties) spring.couchbase.bootstrap-hosts= # Couchbase nodes (host or IP address) to bootstrap from. spring.couchbase.bucket.name=default # Name of the bucket to connect to. spring.couchbase.bucket.password= # Password of the bucket. spring.couchbase.env.endpoints.key-value=1 # Number of sockets per node against the Key/value service. spring.couchbase.env.endpoints.query=1 # Number of sockets per node against the Query (N1QL) service. spring.couchbase.env.endpoints.view=1 # Number of sockets per node against the view service. spring.couchbase.env.ssl.enabled= # Whether to enable SSL support. Enabled automatically if a "keyStore" is provided, unless specified otherwise. spring.couchbase.env.ssl.key-store= # Path to the JVM key store that holds the certificates. spring.couchbase.env.ssl.key-store-password= # Password used to access the key store. spring.couchbase.env.timeouts.connect=5000ms # Bucket connections timeouts. spring.couchbase.env.timeouts.key-value=2500ms # Blocking operations performed on a specific key timeout. spring.couchbase.env.timeouts.query=7500ms # N1QL query operations timeout. spring.couchbase.env.timeouts.socket-connect=1000ms # Socket connect connections timeout. spring.couchbase.env.timeouts.view=7500ms # Regular and geospatial view operations timeout. # DAO (PersistenceExceptionTranslationAutoConfiguration) spring.dao.exceptiontranslation.enabled=true # Whether to enable the PersistenceExceptionTranslationPostProcessor. # CASSANDRA (CassandraProperties) spring.data.cassandra.cluster-name= # Name of the Cassandra cluster. spring.data.cassandra.compression=none # Compression supported by the Cassandra binary protocol. spring.data.cassandra.connect-timeout= # Socket option: connection time out. spring.data.cassandra.consistency-level= # Queries consistency level. spring.data.cassandra.contact-points=localhost # Comma-separated list of cluster node addresses. spring.data.cassandra.fetch-size= # Queries default fetch size. spring.data.cassandra.keyspace-name= # Keyspace name to use. spring.data.cassandra.load-balancing-policy= # Class name of the load balancing policy. spring.data.cassandra.port= # Port of the Cassandra server. spring.data.cassandra.password= # Login password of the server. spring.data.cassandra.pool.heartbeat-interval=30 # Heartbeat interval after which a message is sent on an idle connection to make sure it's still alive. If a duration suffix is not specified, seconds will be used. spring.data.cassandra.pool.idle-timeout=120 # Idle timeout before an idle connection is removed. If a duration suffix is not specified, seconds will be used. spring.data.cassandra.pool.max-queue-size=256 # Maximum number of requests that get queued if no connection is available. spring.data.cassandra.pool.pool-timeout=5000ms # Pool timeout when trying to acquire a connection from a host's pool. spring.data.cassandra.read-timeout= # Socket option: read time out. spring.data.cassandra.reconnection-policy= # Reconnection policy class. spring.data.cassandra.repositories.type=auto # Type of Cassandra repositories to enable. spring.data.cassandra.retry-policy= # Class name of the retry policy. spring.data.cassandra.serial-consistency-level= # Queries serial consistency level. spring.data.cassandra.schema-action=none # Schema action to take at startup. spring.data.cassandra.ssl=false # Enable SSL support. spring.data.cassandra.username= # Login user of the server. # DATA COUCHBASE (CouchbaseDataProperties) spring.data.couchbase.auto-index=false # Automatically create views and indexes. spring.data.couchbase.consistency=read-your-own-writes # Consistency to apply by default on generated queries. spring.data.couchbase.repositories.type=auto # Type of Couchbase repositories to enable. # ELASTICSEARCH (ElasticsearchProperties) spring.data.elasticsearch.cluster-name=elasticsearch # Elasticsearch cluster name. spring.data.elasticsearch.cluster-nodes= # Comma-separated list of cluster node addresses. spring.data.elasticsearch.properties.*= # Additional properties used to configure the client. spring.data.elasticsearch.repositories.enabled=true # Whether to enable Elasticsearch repositories. # DATA LDAP spring.data.ldap.repositories.enabled=true # Enable LDAP repositories. # MONGODB (MongoProperties) spring.data.mongodb.authentication-database= # Authentication database name. spring.data.mongodb.database=test # Database name. spring.data.mongodb.field-naming-strategy= # Fully qualified name of the FieldNamingStrategy to use. spring.data.mongodb.grid-fs-database= # GridFS database name. spring.data.mongodb.host=localhost # Mongo server host. Cannot be set with URI. spring.data.mongodb.password= # Login password of the mongo server. Cannot be set with URI. spring.data.mongodb.port=27017 # Mongo server port. Cannot be set with URI. spring.data.mongodb.repositories.type=true # Type of Mongo repositories to enable. spring.data.mongodb.uri=mongodb://localhost/test # Mongo database URI. Cannot be set with host, port and credentials. spring.data.mongodb.username= # Login user of the mongo server. Cannot be set with URI. # DATA REDIS spring.data.redis.repositories.enabled=true # Whether to enable Redis repositories. # NEO4J (Neo4jProperties) spring.data.neo4j.auto-index=none # Auto index mode. spring.data.neo4j.embedded.enabled=true # Whether to enable embedded mode if the embedded driver is available. spring.data.neo4j.open-in-view=true # Register OpenSessionInViewInterceptor. Binds a Neo4j Session to the thread for the entire processing of the request. spring.data.neo4j.password= # Login password of the server. spring.data.neo4j.repositories.enabled=true # Whether to enable Neo4j repositories. spring.data.neo4j.uri= # URI used by the driver. Auto-detected by default. spring.data.neo4j.username= # Login user of the server. # DATA REST (RepositoryRestProperties) spring.data.rest.base-path= # Base path to be used by Spring Data REST to expose repository resources. spring.data.rest.default-page-size= # Default size of pages. spring.data.rest.detection-strategy=default # Strategy to use to determine which repositories get exposed. spring.data.rest.enable-enum-translation= # Whether to enable enum value translation through the Spring Data REST default resource bundle. spring.data.rest.limit-param-name= # Name of the URL query string parameter that indicates how many results to return at once. spring.data.rest.max-page-size= # Maximum size of pages. spring.data.rest.page-param-name= # Name of the URL query string parameter that indicates what page to return. spring.data.rest.return-body-on-create= # Whether to return a response body after creating an entity. spring.data.rest.return-body-on-update= # Whether to return a response body after updating an entity. spring.data.rest.sort-param-name= # Name of the URL query string parameter that indicates what direction to sort results. # SOLR (SolrProperties) spring.data.solr.host=http://127.0.0.1:8983/solr # Solr host. Ignored if "zk-host" is set. spring.data.solr.repositories.enabled=true # Whether to enable Solr repositories. spring.data.solr.zk-host= # ZooKeeper host address in the form HOST:PORT. # DATA WEB (SpringDataWebProperties) spring.data.web.pageable.default-page-size=20 # Default page size. spring.data.web.pageable.page-parameter=page # Page index parameter name. spring.data.web.pageable.size-parameter=size # Page size parameter name. spring.data.web.sort.sort-parameter=sort # Sort parameter name. # DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties) spring.datasource.continue-on-error=false # Whether to stop if an error occurs while initializing the database. spring.datasource.data= # Data (DML) script resource references. spring.datasource.data-username= # Username of the database to execute DML scripts (if different). spring.datasource.data-password= # Password of the database to execute DML scripts (if different). spring.datasource.dbcp2.*= # Commons DBCP2 specific settings spring.datasource.driver-class-name= # Fully qualified name of the JDBC driver. Auto-detected based on the URL by default. spring.datasource.generate-unique-name=false # Whether to generate a random datasource name. spring.datasource.hikari.*= # Hikari specific settings spring.datasource.initialization-mode=embedded # Initialize the datasource with available DDL and DML scripts. spring.datasource.jmx-enabled=false # Whether to enable JMX support (if provided by the underlying pool). spring.datasource.jndi-name= # JNDI location of the datasource. Class, url, username & password are ignored when set. spring.datasource.name=testdb # Name of the datasource. spring.datasource.password= # Login password of the database. spring.datasource.platform=all # Platform to use in the DDL or DML scripts (such as schema-${platform}.sql or data-${platform}.sql). spring.datasource.schema= # Schema (DDL) script resource references. spring.datasource.schema-username= # Username of the database to execute DDL scripts (if different). spring.datasource.schema-password= # Password of the database to execute DDL scripts (if different). spring.datasource.separator=; # Statement separator in SQL initialization scripts. spring.datasource.sql-script-encoding= # SQL scripts encoding. spring.datasource.tomcat.*= # Tomcat datasource specific settings spring.datasource.type= # Fully qualified name of the connection pool implementation to use. By default, it is auto-detected from the classpath. spring.datasource.url= # JDBC URL of the database. spring.datasource.username= # Login username of the database. spring.datasource.xa.data-source-class-name= # XA datasource fully qualified name. spring.datasource.xa.properties= # Properties to pass to the XA data source. # JEST (Elasticsearch HTTP client) (JestProperties) spring.elasticsearch.jest.connection-timeout=3s # Connection timeout. spring.elasticsearch.jest.multi-threaded=true # Whether to enable connection requests from multiple execution threads. spring.elasticsearch.jest.password= # Login password. spring.elasticsearch.jest.proxy.host= # Proxy host the HTTP client should use. spring.elasticsearch.jest.proxy.port= # Proxy port the HTTP client should use. spring.elasticsearch.jest.read-timeout=3s # Read timeout. spring.elasticsearch.jest.uris=http://localhost:9200 # Comma-separated list of the Elasticsearch instances to use. spring.elasticsearch.jest.username= # Login username. # H2 Web Console (H2ConsoleProperties) spring.h2.console.enabled=false # Whether to enable the console. spring.h2.console.path=/h2-console # Path at which the console is available. spring.h2.console.settings.trace=false # Whether to enable trace output. spring.h2.console.settings.web-allow-others=false # Whether to enable remote access. # InfluxDB (InfluxDbProperties) spring.influx.password= # Login password. spring.influx.url= # URL of the InfluxDB instance to which to connect. spring.influx.user= # Login user. # JOOQ (JooqAutoConfiguration) spring.jooq.sql-dialect= # SQL dialect to use. Auto-detected by default. # JDBC (JdbcProperties) spring.jdbc.template.fetch-size=-1 # Number of rows that should be fetched from the database when more rows are needed. spring.jdbc.template.max-rows=-1 # Maximum number of rows. spring.jdbc.template.query-timeout= # Query timeout. If a duration suffix is not specified, seconds will be used. # JPA (JpaBaseConfiguration, HibernateJpaAutoConfiguration) spring.data.jpa.repositories.enabled=true # Whether to enable JPA repositories. spring.jpa.database= # Target database to operate on, auto-detected by default. Can be alternatively set using the "databasePlatform" property. spring.jpa.database-platform= # Name of the target database to operate on, auto-detected by default. Can be alternatively set using the "Database" enum. spring.jpa.generate-ddl=false # Whether to initialize the schema on startup. spring.jpa.hibernate.ddl-auto= # DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto" property. Defaults to "create-drop" when using an embedded database and no schema manager was detected. Otherwise, defaults to "none". spring.jpa.hibernate.naming.implicit-strategy= # Hibernate 5 implicit naming strategy fully qualified name. spring.jpa.hibernate.naming.physical-strategy= # Hibernate 5 physical naming strategy fully qualified name. spring.jpa.hibernate.use-new-id-generator-mappings= # Whether to use Hibernate's newer IdentifierGenerator for AUTO, TABLE and SEQUENCE. spring.jpa.mapping-resources= # Mapping resources (equivalent to "mapping-file" entries in persistence.xml). spring.jpa.open-in-view=true # Register OpenEntityManagerInViewInterceptor. Binds a JPA EntityManager to the thread for the entire processing of the request. spring.jpa.properties.*= # Additional native properties to set on the JPA provider. spring.jpa.show-sql=false # Whether to enable logging of SQL statements. # JTA (JtaAutoConfiguration) spring.jta.enabled=true # Whether to enable JTA support. spring.jta.log-dir= # Transaction logs directory. spring.jta.transaction-manager-id= # Transaction manager unique identifier. # ATOMIKOS (AtomikosProperties) spring.jta.atomikos.connectionfactory.borrow-connection-timeout=30 # Timeout, in seconds, for borrowing connections from the pool. spring.jta.atomikos.connectionfactory.ignore-session-transacted-flag=true # Whether to ignore the transacted flag when creating session. spring.jta.atomikos.connectionfactory.local-transaction-mode=false # Whether local transactions are desired. spring.jta.atomikos.connectionfactory.maintenance-interval=60 # The time, in seconds, between runs of the pool's maintenance thread. spring.jta.atomikos.connectionfactory.max-idle-time=60 # The time, in seconds, after which connections are cleaned up from the pool. spring.jta.atomikos.connectionfactory.max-lifetime=0 # The time, in seconds, that a connection can be pooled for before being destroyed. 0 denotes no limit. spring.jta.atomikos.connectionfactory.max-pool-size=1 # The maximum size of the pool. spring.jta.atomikos.connectionfactory.min-pool-size=1 # The minimum size of the pool. spring.jta.atomikos.connectionfactory.reap-timeout=0 # The reap timeout, in seconds, for borrowed connections. 0 denotes no limit. spring.jta.atomikos.connectionfactory.unique-resource-name=jmsConnectionFactory # The unique name used to identify the resource during recovery. spring.jta.atomikos.datasource.borrow-connection-timeout=30 # Timeout, in seconds, for borrowing connections from the pool. spring.jta.atomikos.datasource.default-isolation-level= # Default isolation level of connections provided by the pool. spring.jta.atomikos.datasource.login-timeout= # Timeout, in seconds, for establishing a database connection. spring.jta.atomikos.datasource.maintenance-interval=60 # The time, in seconds, between runs of the pool's maintenance thread. spring.jta.atomikos.datasource.max-idle-time=60 # The time, in seconds, after which connections are cleaned up from the pool. spring.jta.atomikos.datasource.max-lifetime=0 # The time, in seconds, that a connection can be pooled for before being destroyed. 0 denotes no limit. spring.jta.atomikos.datasource.max-pool-size=1 # The maximum size of the pool. spring.jta.atomikos.datasource.min-pool-size=1 # The minimum size of the pool. spring.jta.atomikos.datasource.reap-timeout=0 # The reap timeout, in seconds, for borrowed connections. 0 denotes no limit. spring.jta.atomikos.datasource.test-query= # SQL query or statement used to validate a connection before returning it. spring.jta.atomikos.datasource.unique-resource-name=dataSource # The unique name used to identify the resource during recovery. spring.jta.atomikos.properties.allow-sub-transactions=true # Specify whether sub-transactions are allowed. spring.jta.atomikos.properties.checkpoint-interval=500 # Interval between checkpoints, in milliseconds. spring.jta.atomikos.properties.default-jta-timeout=10000 # Default timeout for JTA transactions, in milliseconds. spring.jta.atomikos.properties.enable-logging=true # Whether to enable disk logging. spring.jta.atomikos.properties.force-shutdown-on-vm-exit=false # Whether a VM shutdown should trigger forced shutdown of the transaction core. spring.jta.atomikos.properties.log-base-dir= # Directory in which the log files should be stored. spring.jta.atomikos.properties.log-base-name=tmlog # Transactions log file base name. spring.jta.atomikos.properties.max-actives=50 # Maximum number of active transactions. spring.jta.atomikos.properties.max-timeout=30m # Maximum timeout that can be allowed for transactions. spring.jta.atomikos.properties.recovery.delay=10000ms # Delay between two recovery scans. spring.jta.atomikos.properties.recovery.forget-orphaned-log-entries-delay=86400000 # Delay after which recovery can cleanup pending ('orphaned') log entries. spring.jta.atomikos.properties.recovery.max-retries=5 # Number of retry attempts to commit the transaction before throwing an exception. spring.jta.atomikos.properties.recovery.retry-interval=10000ms # Delay between retry attempts. spring.jta.atomikos.properties.serial-jta-transactions=true # Whether sub-transactions should be joined when possible. spring.jta.atomikos.properties.service= # Transaction manager implementation that should be started. spring.jta.atomikos.properties.threaded-two-phase-commit=false # Whether to use different (and concurrent) threads for two-phase commit on the participating resources. spring.jta.atomikos.properties.transaction-manager-unique-name= # The transaction manager's unique name. # BITRONIX spring.jta.bitronix.connectionfactory.acquire-increment=1 # Number of connections to create when growing the pool. spring.jta.bitronix.connectionfactory.acquisition-interval=1 # Time, in seconds, to wait before trying to acquire a connection again after an invalid connection was acquired. spring.jta.bitronix.connectionfactory.acquisition-timeout=30 # Timeout, in seconds, for acquiring connections from the pool. spring.jta.bitronix.connectionfactory.allow-local-transactions=true # Whether the transaction manager should allow mixing XA and non-XA transactions. spring.jta.bitronix.connectionfactory.apply-transaction-timeout=false # Whether the transaction timeout should be set on the XAResource when it is enlisted. spring.jta.bitronix.connectionfactory.automatic-enlisting-enabled=true # Whether resources should be enlisted and delisted automatically. spring.jta.bitronix.connectionfactory.cache-producers-consumers=true # Whether producers and consumers should be cached. spring.jta.bitronix.connectionfactory.defer-connection-release=true # Whether the provider can run many transactions on the same connection and supports transaction interleaving. spring.jta.bitronix.connectionfactory.ignore-recovery-failures=false # Whether recovery failures should be ignored. spring.jta.bitronix.connectionfactory.max-idle-time=60 # The time, in seconds, after which connections are cleaned up from the pool. spring.jta.bitronix.connectionfactory.max-pool-size=10 # The maximum size of the pool. 0 denotes no limit. spring.jta.bitronix.connectionfactory.min-pool-size=0 # The minimum size of the pool. spring.jta.bitronix.connectionfactory.password= # The password to use to connect to the JMS provider. spring.jta.bitronix.connectionfactory.share-transaction-connections=false # Whether connections in the ACCESSIBLE state can be shared within the context of a transaction. spring.jta.bitronix.connectionfactory.test-connections=true # Whether connections should be tested when acquired from the pool. spring.jta.bitronix.connectionfactory.two-pc-ordering-position=1 # The position that this resource should take during two-phase commit (always first is Integer.MIN_VALUE, always last is Integer.MAX_VALUE). spring.jta.bitronix.connectionfactory.unique-name=jmsConnectionFactory # The unique name used to identify the resource during recovery. spring.jta.bitronix.connectionfactory.use-tm-join=true Whether TMJOIN should be used when starting XAResources. spring.jta.bitronix.connectionfactory.user= # The user to use to connect to the JMS provider. spring.jta.bitronix.datasource.acquire-increment=1 # Number of connections to create when growing the pool. spring.jta.bitronix.datasource.acquisition-interval=1 # Time, in seconds, to wait before trying to acquire a connection again after an invalid connection was acquired. spring.jta.bitronix.datasource.acquisition-timeout=30 # Timeout, in seconds, for acquiring connections from the pool. spring.jta.bitronix.datasource.allow-local-transactions=true # Whether the transaction manager should allow mixing XA and non-XA transactions. spring.jta.bitronix.datasource.apply-transaction-timeout=false # Whether the transaction timeout should be set on the XAResource when it is enlisted. spring.jta.bitronix.datasource.automatic-enlisting-enabled=true # Whether resources should be enlisted and delisted automatically. spring.jta.bitronix.datasource.cursor-holdability= # The default cursor holdability for connections. spring.jta.bitronix.datasource.defer-connection-release=true # Whether the database can run many transactions on the same connection and supports transaction interleaving. spring.jta.bitronix.datasource.enable-jdbc4-connection-test= # Whether Connection.isValid() is called when acquiring a connection from the pool. spring.jta.bitronix.datasource.ignore-recovery-failures=false # Whether recovery failures should be ignored. spring.jta.bitronix.datasource.isolation-level= # The default isolation level for connections. spring.jta.bitronix.datasource.local-auto-commit= # The default auto-commit mode for local transactions. spring.jta.bitronix.datasource.login-timeout= # Timeout, in seconds, for establishing a database connection. spring.jta.bitronix.datasource.max-idle-time=60 # The time, in seconds, after which connections are cleaned up from the pool. spring.jta.bitronix.datasource.max-pool-size=10 # The maximum size of the pool. 0 denotes no limit. spring.jta.bitronix.datasource.min-pool-size=0 # The minimum size of the pool. spring.jta.bitronix.datasource.prepared-statement-cache-size=0 # The target size of the prepared statement cache. 0 disables the cache. spring.jta.bitronix.datasource.share-transaction-connections=false # Whether connections in the ACCESSIBLE state can be shared within the context of a transaction. spring.jta.bitronix.datasource.test-query= # SQL query or statement used to validate a connection before returning it. spring.jta.bitronix.datasource.two-pc-ordering-position=1 # The position that this resource should take during two-phase commit (always first is Integer.MIN_VALUE, and always last is Integer.MAX_VALUE). spring.jta.bitronix.datasource.unique-name=dataSource # The unique name used to identify the resource during recovery. spring.jta.bitronix.datasource.use-tm-join=true Whether TMJOIN should be used when starting XAResources. spring.jta.bitronix.properties.allow-multiple-lrc=false # Whether to allow multiple LRC resources to be enlisted into the same transaction. spring.jta.bitronix.properties.asynchronous2-pc=false # Enable asynchronously execution of two phase commit. spring.jta.bitronix.properties.background-recovery-interval-seconds=60 # Interval in seconds at which to run the recovery process in the background. spring.jta.bitronix.properties.current-node-only-recovery=true # Whether to recover only the current node. spring.jta.bitronix.properties.debug-zero-resource-transaction=false # Whether to log the creation and commit call stacks of transactions executed without a single enlisted resource. spring.jta.bitronix.properties.default-transaction-timeout=60 # Default transaction timeout, in seconds. spring.jta.bitronix.properties.disable-jmx=false # Whether to enable JMX support. spring.jta.bitronix.properties.exception-analyzer= # Set the fully qualified name of the exception analyzer implementation to use. spring.jta.bitronix.properties.filter-log-status=false # Whether to enable filtering of logs so that only mandatory logs are written. spring.jta.bitronix.properties.force-batching-enabled=true # Whether disk forces are batched. spring.jta.bitronix.properties.forced-write-enabled=true # Whether logs are forced to disk. spring.jta.bitronix.properties.graceful-shutdown-interval=60 # Maximum amount of seconds the TM waits for transactions to get done before aborting them at shutdown time. spring.jta.bitronix.properties.jndi-transaction-synchronization-registry-name= # JNDI name of the TransactionSynchronizationRegistry. spring.jta.bitronix.properties.jndi-user-transaction-name= # JNDI name of the UserTransaction. spring.jta.bitronix.properties.journal=disk # Name of the journal. Can be 'disk', 'null', or a class name. spring.jta.bitronix.properties.log-part1-filename=btm1.tlog # Name of the first fragment of the journal. spring.jta.bitronix.properties.log-part2-filename=btm2.tlog # Name of the second fragment of the journal. spring.jta.bitronix.properties.max-log-size-in-mb=2 # Maximum size in megabytes of the journal fragments. spring.jta.bitronix.properties.resource-configuration-filename= # ResourceLoader configuration file name. spring.jta.bitronix.properties.server-id= # ASCII ID that must uniquely identify this TM instance. Defaults to the machine's IP address. spring.jta.bitronix.properties.skip-corrupted-logs=false # Skip corrupted transactions log entries. spring.jta.bitronix.properties.warn-about-zero-resource-transaction=true # Whether to log a warning for transactions executed without a single enlisted resource. # NARAYANA (NarayanaProperties) spring.jta.narayana.default-timeout=60s # Transaction timeout. If a duration suffix is not specified, seconds will be used. spring.jta.narayana.expiry-scanners=com.arjuna.ats.internal.arjuna.recovery.ExpiredTransactionStatusManagerScanner # Comma-separated list of expiry scanners. spring.jta.narayana.log-dir= # Transaction object store directory. spring.jta.narayana.one-phase-commit=true # Whether to enable one phase commit optimization. spring.jta.narayana.periodic-recovery-period=120s # Interval in which periodic recovery scans are performed. If a duration suffix is not specified, seconds will be used. spring.jta.narayana.recovery-backoff-period=10s # Back off period between first and second phases of the recovery scan. If a duration suffix is not specified, seconds will be used. spring.jta.narayana.recovery-db-pass= # Database password to be used by the recovery manager. spring.jta.narayana.recovery-db-user= # Database username to be used by the recovery manager. spring.jta.narayana.recovery-jms-pass= # JMS password to be used by the recovery manager. spring.jta.narayana.recovery-jms-user= # JMS username to be used by the recovery manager. spring.jta.narayana.recovery-modules= # Comma-separated list of recovery modules. spring.jta.narayana.transaction-manager-id=1 # Unique transaction manager id. spring.jta.narayana.xa-resource-orphan-filters= # Comma-separated list of orphan filters. # EMBEDDED MONGODB (EmbeddedMongoProperties) spring.mongodb.embedded.features=SYNC_DELAY # Comma-separated list of features to enable. spring.mongodb.embedded.storage.database-dir= # Directory used for data storage. spring.mongodb.embedded.storage.oplog-size= # Maximum size of the oplog, in megabytes. spring.mongodb.embedded.storage.repl-set-name= # Name of the replica set. spring.mongodb.embedded.version=2.6.10 # Version of Mongo to use. # REDIS (RedisProperties) spring.redis.cluster.max-redirects= # Maximum number of redirects to follow when executing commands across the cluster. spring.redis.cluster.nodes= # Comma-separated list of "host:port" pairs to bootstrap from. spring.redis.database=0 # Database index used by the connection factory. spring.redis.url= # Connection URL. Overrides host, port, and password. User is ignored. Example: redis://user:[email protected]:6379 spring.redis.host=localhost # Redis server host. spring.redis.jedis.pool.max-active=8 # Max number of connections that can be allocated by the pool at a given time. Use a negative value for no limit. spring.redis.jedis.pool.max-idle=8 # Max number of "idle" connections in the pool. Use a negative value to indicate an unlimited number of idle connections. spring.redis.jedis.pool.max-wait=-1ms # Maximum amount of time a connection allocation should block before throwing an exception when the pool is exhausted. Use a negative value to block indefinitely. spring.redis.jedis.pool.min-idle=0 # Target for the minimum number of idle connections to maintain in the pool. This setting only has an effect if it is positive. spring.redis.lettuce.pool.max-active=8 # Maximum number of connections that can be allocated by the pool at a given time. Use a negative value for no limit. spring.redis.lettuce.pool.max-idle=8 # Maximum number of "idle" connections in the pool. Use a negative value to indicate an unlimited number of idle connections. spring.redis.lettuce.pool.max-wait=-1ms # Maximum amount of time a connection allocation should block before throwing an exception when the pool is exhausted. Use a negative value to block indefinitely. spring.redis.lettuce.pool.min-idle=0 # Target for the minimum number of idle connections to maintain in the pool. This setting only has an effect if it is positive. spring.redis.lettuce.shutdown-timeout=100ms # Shutdown timeout. spring.redis.password= # Login password of the redis server. spring.redis.port=6379 # Redis server port. spring.redis.sentinel.master= # Name of the Redis server. spring.redis.sentinel.nodes= # Comma-separated list of "host:port" pairs. spring.redis.ssl=false # Whether to enable SSL support. spring.redis.timeout=0 # Connection timeout. # TRANSACTION (TransactionProperties) spring.transaction.default-timeout= # Default transaction timeout. If a duration suffix is not specified, seconds will be used. spring.transaction.rollback-on-commit-failure= # Whether to roll back on commit failures. # ---------------------------------------- # INTEGRATION PROPERTIES # ---------------------------------------- # ACTIVEMQ (ActiveMQProperties) spring.activemq.broker-url= # URL of the ActiveMQ broker. Auto-generated by default. spring.activemq.close-timeout=15s # Time to wait before considering a close complete. spring.activemq.in-memory=true # Whether the default broker URL should be in memory. Ignored if an explicit broker has been specified. spring.activemq.non-blocking-redelivery=false # Whether to stop message delivery before re-delivering messages from a rolled back transaction. This implies that message order is not preserved when this is enabled. spring.activemq.password= # Login password of the broker. spring.activemq.send-timeout=0 # Time to wait on message sends for a response. Set it to 0 to wait forever. spring.activemq.user= # Login user of the broker. spring.activemq.packages.trust-all= # Whether to trust all packages. spring.activemq.packages.trusted= # Comma-separated list of specific packages to trust (when not trusting all packages). spring.activemq.pool.block-if-full=true # Whether to block when a connection is requested and the pool is full. Set it to false to throw a "JMSException" instead. spring.activemq.pool.block-if-full-timeout=-1ms # Blocking period before throwing an exception if the pool is still full. spring.activemq.pool.create-connection-on-startup=true # Whether to create a connection on startup. Can be used to warm up the pool on startup. spring.activemq.pool.enabled=false # Whether a PooledConnectionFactory should be created, instead of a regular ConnectionFactory. spring.activemq.pool.expiry-timeout=0ms # Connection expiration timeout. spring.activemq.pool.idle-timeout=30s # Connection idle timeout. spring.activemq.pool.max-connections=1 # Maximum number of pooled connections. spring.activemq.pool.maximum-active-session-per-connection=500 # Maximum number of active sessions per connection. spring.activemq.pool.reconnect-on-exception=true # Reset the connection when a "JMSException" occurs. spring.activemq.pool.time-between-expiration-check=-1ms # Time to sleep between runs of the idle connection eviction thread. When negative, no idle connection eviction thread runs. spring.activemq.pool.use-anonymous-producers=true # Whether to use only one anonymous "MessageProducer" instance. Set it to false to create one "MessageProducer" every time one is required. # ARTEMIS (ArtemisProperties) spring.artemis.embedded.cluster-password= # Cluster password. Randomly generated on startup by default. spring.artemis.embedded.data-directory= # Journal file directory. Not necessary if persistence is turned off. spring.artemis.embedded.enabled=true # Whether to enable embedded mode if the Artemis server APIs are available. spring.artemis.embedded.persistent=false # Whether to enable persistent store. spring.artemis.embedded.queues= # Comma-separated list of queues to create on startup. spring.artemis.embedded.server-id= # Server ID. By default, an auto-incremented counter is used. spring.artemis.embedded.topics= # Comma-separated list of topics to create on startup. spring.artemis.host=localhost # Artemis broker host. spring.artemis.mode= # Artemis deployment mode, auto-detected by default. spring.artemis.password= # Login password of the broker. spring.artemis.port=61616 # Artemis broker port. spring.artemis.user= # Login user of the broker. # SPRING BATCH (BatchProperties) spring.batch.initialize-schema=embedded # Database schema initialization mode. spring.batch.job.enabled=true # Execute all Spring Batch jobs in the context on startup. spring.batch.job.names= # Comma-separated list of job names to execute on startup (for instance, `job1,job2`). By default, all Jobs found in the context are executed. spring.batch.schema=classpath:org/springframework/batch/core/schema-@@platform@@.sql # Path to the SQL file to use to initialize the database schema. spring.batch.table-prefix= # Table prefix for all the batch meta-data tables. # SPRING INTEGRATION (IntegrationProperties) spring.integration.jdbc.initialize-schema=embedded # Database schema initialization mode. spring.integration.jdbc.schema=classpath:org/springframework/integration/jdbc/schema-@@platform@@.sql # Path to the SQL file to use to initialize the database schema. # JMS (JmsProperties) spring.jms.jndi-name= # Connection factory JNDI name. When set, takes precedence to others connection factory auto-configurations. spring.jms.listener.acknowledge-mode= # Acknowledge mode of the container. By default, the listener is transacted with automatic acknowledgment. spring.jms.listener.auto-startup=true # Start the container automatically on startup. spring.jms.listener.concurrency= # Minimum number of concurrent consumers. spring.jms.listener.max-concurrency= # Maximum number of concurrent consumers. spring.jms.pub-sub-domain=false # Whether the default destination type is topic. spring.jms.template.default-destination= # Default destination to use on send and receive operations that do not have a destination parameter. spring.jms.template.delivery-delay= # Delivery delay to use for send calls. spring.jms.template.delivery-mode= # Delivery mode. Enables QoS (Quality of Service) when set. spring.jms.template.priority= # Priority of a message when sending. Enables QoS (Quality of Service) when set. spring.jms.template.qos-enabled= # Whether to enable explicit QoS (Quality of Service) when sending a message. spring.jms.template.receive-timeout= # Timeout to use for receive calls. spring.jms.template.time-to-live= # Time-to-live of a message when sending. Enable QoS (Quality of Service) when set. # APACHE KAFKA (KafkaProperties) spring.kafka.admin.client-id= # ID to pass to the server when making requests. Used for server-side logging. spring.kafka.admin.fail-fast=false # Whether to fail fast if the broker is not available on startup. spring.kafka.admin.properties.*= # Additional admin-specific properties used to configure the client. spring.kafka.admin.ssl.key-password= # Password of the private key in the key store file. spring.kafka.admin.ssl.keystore-location= # Location of the key store file. spring.kafka.admin.ssl.keystore-password= # Password of the key store file. spring.kafka.admin.ssl.truststore-location= # Location of the trust store file. spring.kafka.admin.ssl.truststore-password= # Store password for the trust store file. spring.kafka.bootstrap-servers= # Comma-delimited list of host:port pairs to use for establishing the initial connection to the Kafka cluster. spring.kafka.client-id= # ID to pass to the server when making requests. Used for server-side logging. spring.kafka.consumer.auto-commit-interval= # Frequency with which the consumer offsets are auto-committed to Kafka if 'enable.auto.commit' is set to true. spring.kafka.consumer.auto-offset-reset= # What to do when there is no initial offset in Kafka or if the current offset no longer exists on the server. spring.kafka.consumer.bootstrap-servers= # Comma-delimited list of host:port pairs to use for establishing the initial connection to the Kafka cluster. spring.kafka.consumer.client-id= # ID to pass to the server when making requests. Used for server-side logging. spring.kafka.consumer.enable-auto-commit= # Whether the consumer's offset is periodically committed in the background. spring.kafka.consumer.fetch-max-wait= # Maximum amount of time the server blocks before answering the fetch request if there isn't sufficient data to immediately satisfy the requirement given by "fetch.min.bytes". spring.kafka.consumer.fetch-min-size= # Minimum amount of data, in bytes, the server should return for a fetch request. spring.kafka.consumer.group-id= # Unique string that identifies the consumer group to which this consumer belongs. spring.kafka.consumer.heartbeat-interval= # Expected time between heartbeats to the consumer coordinator. spring.kafka.consumer.key-deserializer= # Deserializer class for keys. spring.kafka.consumer.max-poll-records= # Maximum number of records returned in a single call to poll(). spring.kafka.consumer.properties.*= # Additional consumer-specific properties used to configure the client. spring.kafka.consumer.ssl.key-password= # Password of the private key in the key store file. spring.kafka.consumer.ssl.keystore-location= # Location of the key store file. spring.kafka.consumer.ssl.keystore-password= # Store password for the key store file. spring.kafka.consumer.ssl.truststore-location= # Location of the trust store file. spring.kafka.consumer.ssl.truststore-password= # Store password for the trust store file. spring.kafka.consumer.value-deserializer= # Deserializer class for values. spring.kafka.jaas.control-flag=required # Control flag for login configuration. spring.kafka.jaas.enabled= # Whether to enable JAAS configuration. spring.kafka.jaas.login-module=com.sun.security.auth.module.Krb5LoginModule # Login module. spring.kafka.jaas.options= # Additional JAAS options. spring.kafka.listener.ack-count= # Number of records between offset commits when ackMode is "COUNT" or "COUNT_TIME". spring.kafka.listener.ack-mode= # Listener AckMode. See the spring-kafka documentation. spring.kafka.listener.ack-time= # Time between offset commits when ackMode is "TIME" or "COUNT_TIME". spring.kafka.listener.concurrency= # Number of threads to run in the listener containers. spring.kafka.listener.poll-timeout= # Timeout to use when polling the consumer. spring.kafka.listener.type=single # Listener type. spring.kafka.producer.acks= # Number of acknowledgments the producer requires the leader to have received before considering a request complete. spring.kafka.producer.batch-size= # Number of records to batch before sending. spring.kafka.producer.bootstrap-servers= # Comma-delimited list of host:port pairs to use for establishing the initial connection to the Kafka cluster. spring.kafka.producer.buffer-memory= # Total bytes of memory the producer can use to buffer records waiting to be sent to the server. spring.kafka.producer.client-id= # ID to pass to the server when making requests. Used for server-side logging. spring.kafka.producer.compression-type= # Compression type for all data generated by the producer. spring.kafka.producer.key-serializer= # Serializer class for keys. spring.kafka.producer.properties.*= # Additional producer-specific properties used to configure the client. spring.kafka.producer.retries= # When greater than zero, enables retrying of failed sends. spring.kafka.producer.ssl.key-password= # Password of the private key in the key store file. spring.kafka.producer.ssl.keystore-location= # Location of the key store file. spring.kafka.producer.ssl.keystore-password= # Store password for the key store file. spring.kafka.producer.ssl.truststore-location= # Location of the trust store file. spring.kafka.producer.ssl.truststore-password= # Store password for the trust store file. spring.kafka.producer.transaction-id-prefix= # When non empty, enables transaction support for producer. spring.kafka.producer.value-serializer= # Serializer class for values. spring.kafka.properties.*= # Additional properties, common to producers and consumers, used to configure the client. spring.kafka.ssl.key-password= # Password of the private key in the key store file. spring.kafka.ssl.keystore-location= # Location of the key store file. spring.kafka.ssl.keystore-password= # Store password for the key store file. spring.kafka.ssl.truststore-location= # Location of the trust store file. spring.kafka.ssl.truststore-password= # Store password for the trust store file. spring.kafka.template.default-topic= # Default topic to which messages are sent. # RABBIT (RabbitProperties) spring.rabbitmq.addresses= # Comma-separated list of addresses to which the client should connect. spring.rabbitmq.cache.channel.checkout-timeout= # Duration to wait to obtain a channel if the cache size has been reached. spring.rabbitmq.cache.channel.size= # Number of channels to retain in the cache. spring.rabbitmq.cache.connection.mode=channel # Connection factory cache mode. spring.rabbitmq.cache.connection.size= # Number of connections to cache. spring.rabbitmq.connection-timeout= # Connection timeout. Set it to zero to wait forever. spring.rabbitmq.dynamic=true # Whether to create an AmqpAdmin bean. spring.rabbitmq.host=localhost # RabbitMQ host. spring.rabbitmq.listener.direct.acknowledge-mode= # Acknowledge mode of container. spring.rabbitmq.listener.direct.auto-startup=true # Whether to start the container automatically on startup. spring.rabbitmq.listener.direct.consumers-per-queue= # Number of consumers per queue. spring.rabbitmq.listener.direct.default-requeue-rejected= # Whether rejected deliveries are re-queued by default. Defaults to true. spring.rabbitmq.listener.direct.idle-event-interval= # How often idle container events should be published. spring.rabbitmq.listener.direct.prefetch= # Number of messages to be handled in a single request. It should be greater than or equal to the transaction size (if used). spring.rabbitmq.listener.direct.retry.enabled=false # Whether publishing retries are enabled. spring.rabbitmq.listener.direct.retry.initial-interval=1000ms # Interval between the first and second attempt to publish or deliver a message. spring.rabbitmq.listener.direct.retry.max-attempts=3 # Maximum number of attempts to publish or deliver a message. spring.rabbitmq.listener.direct.retry.max-interval=10000ms # Maximum interval between attempts. spring.rabbitmq.listener.direct.retry.multiplier=1 # Multiplier to apply to the previous retry interval. spring.rabbitmq.listener.direct.retry.stateless=true # Whether retries are stateless or stateful. spring.rabbitmq.listener.simple.acknowledge-mode= # Acknowledge mode of container. spring.rabbitmq.listener.simple.auto-startup=true # Whether to start the container automatically on startup. spring.rabbitmq.listener.simple.concurrency= # Minimum number of listener invoker threads. spring.rabbitmq.listener.simple.default-requeue-rejected= # Whether to re-queue delivery failures. spring.rabbitmq.listener.simple.idle-event-interval= # How often idle container events should be published. spring.rabbitmq.listener.simple.max-concurrency= # Maximum number of listener invoker. spring.rabbitmq.listener.simple.prefetch= # Number of messages to be handled in a single request. It should be greater than or equal to the transaction size (if used). spring.rabbitmq.listener.simple.retry.enabled=false # Whether publishing retries are enabled. spring.rabbitmq.listener.simple.retry.initial-interval=1000 # Interval, in milliseconds, between the first and second attempt to deliver a message. spring.rabbitmq.listener.simple.retry.max-attempts=3 # Maximum number of attempts to deliver a message. spring.rabbitmq.listener.simple.retry.max-interval=10000 # Maximum interval, in milliseconds, between attempts. spring.rabbitmq.listener.simple.retry.multiplier=1.0 # Multiplier to apply to the previous delivery retry interval. spring.rabbitmq.listener.simple.retry.stateless=true # Whether or not retry is stateless or stateful. spring.rabbitmq.listener.simple.transaction-size= # Number of messages to be processed in a transaction. That is, the number of messages between acks. For best results, it should be less than or equal to the prefetch count. spring.rabbitmq.listener.type=simple # Listener container type. spring.rabbitmq.password= # Login to authenticate against the broker. spring.rabbitmq.port=5672 # RabbitMQ port. spring.rabbitmq.publisher-confirms=false # Whether to enable publisher confirms. spring.rabbitmq.publisher-returns=false # Whether to enable publisher returns. spring.rabbitmq.requested-heartbeat= # Requested heartbeat timeout; zero for none. If a duration suffix is not specified, seconds will be used. spring.rabbitmq.ssl.enabled=false # Whether to enable SSL support. spring.rabbitmq.ssl.key-store= # Path to the key store that holds the SSL certificate. spring.rabbitmq.ssl.key-store-password= # Password used to access the key store. spring.rabbitmq.ssl.key-store-type=PKCS12 # Key store type. spring.rabbitmq.ssl.trust-store= # Trust store that holds SSL certificates. spring.rabbitmq.ssl.trust-store-password= # Password used to access the trust store. spring.rabbitmq.ssl.trust-store-type=JKS # Trust store type. spring.rabbitmq.ssl.algorithm= # SSL algorithm to use. By default, configured by the Rabbit client library. spring.rabbitmq.template.mandatory=false # Whether to enable mandatory messages. spring.rabbitmq.template.receive-timeout=0 # Timeout for `receive()` methods. spring.rabbitmq.template.reply-timeout=5000 # Timeout for `sendAndReceive()` methods. spring.rabbitmq.template.retry.enabled=false # Whether to enable retries in the `RabbitTemplate`. spring.rabbitmq.template.retry.initial-interval=1000 # Interval, in milliseconds, between the first and second attempt to publish a message. spring.rabbitmq.template.retry.max-attempts=3 # Maximum number of attempts to publish a message. spring.rabbitmq.template.retry.max-interval=10000 # Maximum number of attempts to publish a message. spring.rabbitmq.template.retry.multiplier=1.0 # Multiplier to apply to the previous publishing retry interval. spring.rabbitmq.username= # Login user to authenticate to the broker. spring.rabbitmq.virtual-host= # Virtual host to use when connecting to the broker. # ---------------------------------------- # ACTUATOR PROPERTIES # ---------------------------------------- # MANAGEMENT HTTP SERVER (ManagementServerProperties) management.server.add-application-context-header=false # Add the "X-Application-Context" HTTP header in each response. Requires a custom management.server.port. management.server.address= # Network address that to which the management endpoints should bind. Requires a custom management.server.port. management.server.context-path= # Management endpoint context-path. For instance, `/actuator`. Requires a custom management.server.port management.server.port= # Management endpoint HTTP port. Uses the same port as the application by default. Configure a different port to use management-specific SSL. management.server.ssl.ciphers= # Supported SSL ciphers. Requires a custom management.port. management.server.ssl.client-auth= # Whether client authentication is wanted ("want") or needed ("need"). Requires a trust store. Requires a custom management.server.port. management.server.ssl.enabled= # Whether to enable SSL support. Requires a custom management.server.port. management.server.ssl.enabled-protocols= # Enabled SSL protocols. Requires a custom management.server.port. management.server.ssl.key-alias= # Alias that identifies the key in the key store. Requires a custom management.server.port. management.server.ssl.key-password= # Password used to access the key in the key store. Requires a custom management.server.port. management.server.ssl.key-store= # Path to the key store that holds the SSL certificate (typically a jks file). Requires a custom management.server.port. management.server.ssl.key-store-password= # Password used to access the key store. Requires a custom management.server.port. management.server.ssl.key-store-provider= # Provider for the key store. Requires a custom management.server.port. management.server.ssl.key-store-type= # Type of the key store. Requires a custom management.server.port. management.server.ssl.protocol=TLS # SSL protocol to use. Requires a custom management.server.port. management.server.ssl.trust-store= # Trust store that holds SSL certificates. Requires a custom management.server.port. management.server.ssl.trust-store-password= # Password used to access the trust store. Requires a custom management.server.port. management.server.ssl.trust-store-provider= # Provider for the trust store. Requires a custom management.server.port. management.server.ssl.trust-store-type= # Type of the trust store. Requires a custom management.server.port. # CLOUDFOUNDRY management.cloudfoundry.enabled=true # Whether to enable extended Cloud Foundry actuator endpoints. management.cloudfoundry.skip-ssl-validation=false # Whether to skip SSL verification for Cloud Foundry actuator endpoint security calls. # ENDPOINTS GENERAL CONFIGURATION management.endpoints.enabled-by-default= # Enable or disable all endpoints by default. # ENDPOINTS JMX CONFIGURATION (JmxEndpointProperties) management.endpoints.jmx.enabled=true # Whether JMX endpoints are enabled. management.endpoints.jmx.expose=* # Endpoint IDs that should be exposed or '*' for all. management.endpoints.jmx.exclude= # Endpoint IDs that should be excluded. management.endpoints.jmx.domain=org.springframework.boot # Endpoints JMX domain name. Fallback to 'spring.jmx.default-domain' if set. management.endpoints.jmx.static-names=false # Additional static properties to append to all ObjectNames of MBeans representing Endpoints. management.endpoints.jmx.unique-names=false # Whether to ensure that ObjectNames are modified in case of conflict. # ENDPOINTS WEB CONFIGURATION (WebEndpointProperties) management.endpoints.web.enabled=true # Whether web endpoints are enabled management.endpoints.web.expose=info,status # Endpoint IDs that should be exposed or '*' for all. management.endpoints.web.exclude= # Endpoint IDs that should be excluded. management.endpoints.web.base-path=/actuator # Base path for Web endpoints. Relative to server.context-path or management.server.context-path if management.server.port is configured. management.endpoints.web.path-mapping= # Mapping between endpoint IDs and the path that should expose them. # ENDPOINTS CORS CONFIGURATION (CorsEndpointProperties) management.endpoints.web.cors.allow-credentials= # Whether credentials are supported. When not set, credentials are not supported. management.endpoints.web.cors.allowed-headers= # Comma-separated list of headers to allow in a request. '*' allows all headers. management.endpoints.web.cors.allowed-methods= # Comma-separated list of methods to allow. '*' allows all methods. When not set, defaults to GET. management.endpoints.web.cors.allowed-origins= # Comma-separated list of origins to allow. '*' allows all origins. When not set, CORS support is disabled. management.endpoints.web.cors.exposed-headers= # Comma-separated list of headers to include in a response. management.endpoints.web.cors.max-age=1800 # How long the response from a pre-flight request can be cached by clients. If a duration suffix is not specified, seconds will be used. # AUDIT EVENTS ENDPOINT (AuditEventsEndpoint) management.endpoint.auditevents.cache.time-to-live=0ms # Maximum time that a response can be cached. management.endpoint.auditevents.enabled= # Whether to enable the auditevents endpoint. # BEANS ENDPOINT (BeansEndpoint) management.endpoint.beans.cache.time-to-live=0ms # Maximum time that a response can be cached. management.endpoint.beans.enabled= # Whether to enable the beans endpoint. # CONDITIONS REPORT ENDPOINT (ConditionsReportEndpoint) management.endpoint.conditions.cache.time-to-live=0ms # Maximum time that a response can be cached. management.endpoint.conditions.enabled= # Whether to enable the conditions endpoint. # CONFIGURATION PROPERTIES REPORT ENDPOINT (ConfigurationPropertiesReportEndpoint) management.endpoint.configprops.cache.time-to-live=0ms # Maximum time that a response can be cached. management.endpoint.configprops.enabled= # Whether to enable the configprops endpoint. management.endpoint.configprops.keys-to-sanitize=password,secret,key,token,.*credentials.*,vcap_services # Keys that should be sanitized. Keys can be simple strings that the property ends with or regular expressions. # ENVIRONMENT ENDPOINT (EnvironmentEndpoint) management.endpoint.env.cache.time-to-live=0ms # Maximum time that a response can be cached. management.endpoint.env.enabled= # Whether to enable the env endpoint. management.endpoint.env.keys-to-sanitize=password,secret,key,token,.*credentials.*,vcap_services # Keys that should be sanitized. Keys can be simple strings that the property ends with or regular expressions. # FLYWAY ENDPOINT (FlywayEndpoint) management.endpoint.flyway.cache.time-to-live=0ms # Maximum time that a response can be cached. management.endpoint.flyway.enabled= # Whether to enable the flyway endpoint. # HEALTH ENDPOINT (HealthEndpoint) management.endpoint.health.cache.time-to-live=0ms # Maximum time that a response can be cached. management.endpoint.health.enabled= # Whether to enable the health endpoint. management.endpoint.health.show-details= # Whether to show full health details # HEAP DUMP ENDPOINT (HeapDumpWebEndpoint) management.endpoint.heapdump.cache.time-to-live=0ms # Maximum time that a response can be cached. management.endpoint.heapdump.enabled= # Whether to enable the heapdump endpoint. # INFO ENDPOINT (InfoEndpoint) management.endpoint.info.cache.time-to-live=0ms # Maximum time that a response can be cached. management.endpoint.info.enabled=true # Whether to enable the info endpoint. # LIQUIBASE ENDPOINT (LiquibaseEndpoint) management.endpoint.liquibase.cache.time-to-live=0ms # Maximum time that a response can be cached. management.endpoint.liquibase.enabled= # Whether to enable the liquibase endpoint. # LOG FILE ENDPOINT (LogFileWebEndpoint) management.endpoint.logfile.cache.time-to-live=0ms # Maximum time that a response can be cached. management.endpoint.logfile.enabled= # Whether to enable the logfile endpoint. management.endpoint.logfile.external-file= # External Logfile to be accessed. Can be used if the logfile is written by output redirect and not by the logging system itself. # LOGGERS ENDPOINT (LoggersEndpoint) management.endpoint.loggers.cache.time-to-live=0ms # Maximum time that a response can be cached. management.endpoint.loggers.enabled= # Whether to enable the loggers endpoint. # REQUEST MAPPING ENDPOINT (RequestMappingEndpoint) management.endpoint.mappings.cache.time-to-live=0ms # Maximum time that a response can be cached. management.endpoint.mappings.enabled= # Whether to enable the mappings endpoint. # METRICS ENDPOINT (MetricsEndpoint) management.endpoint.metrics.cache.time-to-live=0ms # Maximum time that a response can be cached. management.endpoint.metrics.enabled= # Whether to enable the metrics endpoint. # PROMETHEUS ENDPOINT (PrometheusScrapeEndpoint) management.endpoint.prometheus.cache.time-to-live=0ms # Maximum time that a response can be cached. management.endpoint.prometheus.enabled= # Whether to enable the metrics endpoint. # SCHEDULED TASKS ENDPOINT (ScheduledTasksEndpoint) management.endpoint.scheduledtasks.cache.time-to-live=0ms # Maximum time that a response can be cached. management.endpoint.scheduledtasks.enabled= # Whether to enable the scheduled tasks endpoint. # SESSIONS ENDPOINT (SessionsEndpoint) management.endpoint.sessions.cache.time-to-live=0ms # Maximum time that a response can be cached. management.endpoint.sessions.enabled= # Whether to enable the sessions endpoint. # SHUTDOWN ENDPOINT (ShutdownEndpoint) management.endpoint.shutdown.cache.time-to-live=0ms # Maximum time that a response can be cached. management.endpoint.shutdown.enabled=false # Whether to enable the shutdown endpoint. # THREAD DUMP ENDPOINT (ThreadDumpEndpoint) management.endpoint.threaddump.cache.time-to-live=0ms # Maximum time that a response can be cached. management.endpoint.threaddump.enabled= # Whether to enable the threaddump endpoint. # TRACE ENDPOINT (TraceEndpoint) management.endpoint.trace.cache.time-to-live=0ms # Maximum time that a response can be cached. management.endpoint.trace.enabled= # Whether to enable the trace endpoint. # HEALTH INDICATORS management.health.db.enabled=true # Whether to enable database health check. management.health.cassandra.enabled=true # Whether to enable Cassandra health check. management.health.couchbase.enabled=true # Whether to enable Couchbase health check. management.health.defaults.enabled=true # Whether to enable default health indicators. management.health.diskspace.enabled=true # Whether to enable disk space health check. management.health.diskspace.path= # Path used to compute the available disk space. management.health.diskspace.threshold=0 # Minimum disk space, in bytes, that should be available. management.health.elasticsearch.enabled=true # Whether to enable Elasticsearch health check. management.health.elasticsearch.indices= # Comma-separated index names. management.health.elasticsearch.response-timeout=100ms # The time to wait for a response from the cluster. management.health.jms.enabled=true # Whether to enable JMS health check. management.health.ldap.enabled=true # Whether to enable LDAP health check. management.health.mail.enabled=true # Whether to enable Mail health check. management.health.mongo.enabled=true # Whether to enable MongoDB health check. management.health.neo4j.enabled=true # Whether to enable Neo4j health check. management.health.rabbit.enabled=true # Whether to enable RabbitMQ health check. management.health.redis.enabled=true # Whether to enable Redis health check. management.health.solr.enabled=true # Whether to enable Solr health check. management.health.status.http-mapping= # Mapping of health statuses to HTTP status codes. By default, registered health statuses map to sensible defaults (for example, UP maps to 200). management.health.status.order=DOWN, OUT_OF_SERVICE, UP, UNKNOWN # Comma-separated list of health statuses in order of severity. # INFO CONTRIBUTORS (InfoContributorProperties) management.info.build.enabled=true # Whether to enable build info. management.info.defaults.enabled=true # Whether to enable default info contributors. management.info.env.enabled=true # Whether to enable environment info. management.info.git.enabled=true # Whether to enable git info. management.info.git.mode=simple # Mode to use to expose git information. # JOLOKIA (JolokiaProperties) management.jolokia.config.*= # Jolokia settings. See the Jolokia manual for details. management.jolokia.enabled=false # Whether to enable Jolokia. management.jolokia.path=/jolokia # Path at which Jolokia is available. # TRACING (TraceEndpointProperties) management.trace.filter.enabled=true # Whether to enable the trace servlet filter. management.trace.include=request-headers,response-headers,cookies,errors # Items to be included in the trace. # METRICS spring.metrics.use-global-registry=true # Whether auto-configured MeterRegistry implementations should be bound to the global static registry on Metrics. spring.metrics.export.atlas.batch-size= # Number of measurements per request to use for the backend. If more measurements are found, then multiple requests will be made. spring.metrics.export.atlas.config-refresh-frequency= # Frequency for refreshing config settings from the LWC service. spring.metrics.export.atlas.config-time-to-live= # Time to live for subscriptions from the LWC service. spring.metrics.export.atlas.config-uri= # URI for the Atlas LWC endpoint to retrieve current subscriptions. spring.metrics.export.atlas.connect-timeout= # Connection timeout for requests to the backend. spring.metrics.export.atlas.enabled= # Whether exporting of metrics to this backend is enabled. spring.metrics.export.atlas.eval-uri= # URI for the Atlas LWC endpoint to evaluate the data for a subscription. spring.metrics.export.atlas.lwc-enabled= # Enable streaming to Atlas LWC. spring.metrics.export.atlas.meter-time-to-live= # Time to live for meters that do not have any activity. After this period the meter will be considered expired and will not get reported. spring.metrics.export.atlas.num-threads= # Number of threads to use with the metrics publishing scheduler. spring.metrics.export.atlas.read-timeout= # Read timeout for requests to the backend. spring.metrics.export.atlas.step=1m # Step size (i.e. reporting frequency) to use. spring.metrics.export.atlas.uri= # URI of the Atlas server. spring.metrics.export.datadog.api-key= # Datadog API key. spring.metrics.export.datadog.batch-size= # Number of measurements per request to use for the backend. If more measurements are found, then multiple requests will be made. spring.metrics.export.datadog.connect-timeout= # Connection timeout for requests to the backend. spring.metrics.export.datadog.enabled= # Whether exporting of metrics to this backend is enabled. spring.metrics.export.datadog.host-tag= # Tag that will be mapped to "host" when shipping metrics to Datadog. Can be omitted if host should be omitted on publishing. spring.metrics.export.datadog.num-threads= # Number of threads to use with the metrics publishing scheduler. spring.metrics.export.datadog.read-timeout= # Read timeout for requests to the backend. spring.metrics.export.datadog.step=1m # Step size (i.e. reporting frequency) to use. spring.metrics.export.datadog.uri= # URI to ship metrics to. If you need to publish metrics to an internal proxy en-route to Datadog, you can define the location of the proxy with this. spring.metrics.export.ganglia.addressing-mode= # UDP addressing mode, either unicast or multicast. spring.metrics.export.ganglia.duration-units= # Base time unit used to report durations. spring.metrics.export.ganglia.enabled= # Whether exporting of metrics to Ganglia is enabled. spring.metrics.export.ganglia.host= # Host of the Ganglia server to receive exported metrics. spring.metrics.export.ganglia.port= # Port of the Ganglia server to receive exported metrics. spring.metrics.export.ganglia.protocol-version= # Ganglia protocol version. Must be either 3.1 or 3.0. spring.metrics.export.ganglia.rate-units= # Base time unit used to report rates. spring.metrics.export.ganglia.step= # Step size (i.e. reporting frequency) to use. spring.metrics.export.ganglia.time-to-live= # Time to live for metrics on Ganglia. spring.metrics.export.graphite.duration-units= # Base time unit used to report durations. spring.metrics.export.graphite.enabled= # Whether exporting of metrics to Graphite is enabled. spring.metrics.export.graphite.host= # Host of the Graphite server to receive exported metrics. spring.metrics.export.graphite.port= # Port of the Graphite server to receive exported metrics. spring.metrics.export.graphite.protocol= # Protocol to use while shipping data to Graphite. spring.metrics.export.graphite.rate-units= # Base time unit used to report rates. spring.metrics.export.graphite.step= # Step size (i.e. reporting frequency) to use. spring.metrics.export.influx.batch-size= # Number of measurements per request to use for the backend. If more measurements are found, then multiple requests will be made. spring.metrics.export.influx.compressed= # Enable GZIP compression of metrics batches published to Influx. spring.metrics.export.influx.connect-timeout= # Connection timeout for requests to the backend. spring.metrics.export.influx.consistency= # Write consistency for each point. spring.metrics.export.influx.db= # Tag that will be mapped to "host" when shipping metrics to Influx. Can be omitted if host should be omitted on publishing. spring.metrics.export.influx.enabled= # Whether exporting of metrics to this backend is enabled. spring.metrics.export.influx.num-threads= # Number of threads to use with the metrics publishing scheduler. spring.metrics.export.influx.password= # Login password of the Influx server. spring.metrics.export.influx.read-timeout= # Read timeout for requests to the backend. spring.metrics.export.influx.retention-policy= # Retention policy to use (Influx writes to the DEFAULT retention policy if one is not specified). spring.metrics.export.influx.step=1m # Step size (i.e. reporting frequency) to use. spring.metrics.export.influx.uri= # URI of the Influx server. spring.metrics.export.influx.user-name= # Login user of the Influx server. spring.metrics.export.prometheus.descriptions= # Enable publishing descriptions as part of the scrape payload to Prometheus. Turn this off to minimize the amount of data sent on each scrape. spring.metrics.export.prometheus.enabled= # Whether exporting of metrics to Prometheus is enabled. spring.metrics.export.prometheus.step= # Step size (i.e. reporting frequency) to use. spring.metrics.export.simple.enabled=false # Whether exporting of metrics to a simple in-memory store is enabled. spring.metrics.export.simple.mode=cumulative # Counting mode. spring.metrics.export.simple.step=10s # Step size (i.e. reporting frequency) to use. spring.metrics.export.statsd.enabled= # Export metrics to StatsD. spring.metrics.export.statsd.flavor=datadog # StatsD line protocol to use. spring.metrics.export.statsd.host=localhost # Host of the StatsD server to receive exported metrics. spring.metrics.export.statsd.max-packet-length=1400 # Total length of a single payload should be kept within your network's MTU. spring.metrics.export.statsd.polling-frequency=10s # How often gauges will be polled. When a gauge is polled, its value is recalculated and if the value has changed, it is sent to the StatsD server. spring.metrics.export.statsd.port=8125 # Port of the StatsD server to receive exported metrics. spring.metrics.export.statsd.queue-size=2147483647 # Maximum size of the queue of items waiting to be sent to the StatsD server. spring.metrics.jdbc.datasource-metric-name=data.source # Name of the metric for data source usage. spring.metrics.jdbc.instrument-datasource=true # Instrument all available data sources. spring.metrics.web.client.record-request-percentiles=false # Whether instrumented requests record percentiles histogram buckets by default. spring.metrics.web.client.requests-metric-name=http.client.requests # Name of the metric for sent requests. spring.metrics.web.server.auto-time-requests=true # Whether requests handled by Spring MVC or WebFlux should be automatically timed. spring.metrics.web.server.record-request-percentiles=false # Whether instrumented requests record percentiles histogram buckets by default. spring.metrics.web.server.requests-metric-name=http.server.requests # Name of the metric for received requests. # ---------------------------------------- # DEVTOOLS PROPERTIES # ---------------------------------------- # DEVTOOLS (DevToolsProperties) spring.devtools.livereload.enabled=true # Whether to enable a livereload.com-compatible server. spring.devtools.livereload.port=35729 # Server port. spring.devtools.restart.additional-exclude= # Additional patterns that should be excluded from triggering a full restart. spring.devtools.restart.additional-paths= # Additional paths to watch for changes. spring.devtools.restart.enabled=true # Enable automatic restart. spring.devtools.restart.exclude=META-INF/maven/**,META-INF/resources/**,resources/**,static/**,public/**,templates/**,**/*Test.class,**/*Tests.class,git.properties # Patterns that should be excluded from triggering a full restart. spring.devtools.restart.log-condition-evaluation-delta=true # Whether to log the condition evaluation delta upon restart. spring.devtools.restart.poll-interval=1s # Amount of time to wait between polling for classpath changes. spring.devtools.restart.quiet-period=400ms # Amount of quiet time required without any classpath changes before a restart is triggered. spring.devtools.restart.trigger-file= # Name of a specific file that, when changed, triggers the restart check. If not specified, any classpath file change triggers the restart. # REMOTE DEVTOOLS (RemoteDevToolsProperties) spring.devtools.remote.context-path=/.~~spring-boot!~ # Context path used to handle the remote connection. spring.devtools.remote.proxy.host= # The host of the proxy to use to connect to the remote application. spring.devtools.remote.proxy.port= # The port of the proxy to use to connect to the remote application. spring.devtools.remote.restart.enabled=true # Whether to enable remote restart. spring.devtools.remote.secret= # A shared secret required to establish a connection (required to enable remote support). spring.devtools.remote.secret-header-name=X-AUTH-TOKEN # HTTP header used to transfer the shared secret. # ---------------------------------------- # TESTING PROPERTIES # ---------------------------------------- spring.test.database.replace=any # Type of existing DataSource to replace. spring.test.mockmvc.print=default # MVC Print option.
The majority of the metadata file is generated automatically at compile time by
processing all items annotated with
@ConfigurationProperties
. However, it is possible
to
write part of the metadata manually
for corner cases or more advanced use cases.
{"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." ]}
server.port=9090 server.servlet.path=/home
Note | |
---|---|
It is not required that every “property” has a “group”. Some properties might exist in their own right. |
Name | Type | Purpose |
---|---|---|
|
String |
The full name of the group. This attribute is mandatory. |
|
String |
The class name of the data type of the group. For example, if the group were based
on a class annotated with
|
|
String |
A short description of the group that can be displayed to users. If not description is
available, it may be omitted. It is recommended that descriptions be short paragraphs,
with the first line providing a concise summary. The last line in the description should
end with a period (
|
|
String |
The class name of the source that contributed this group. For example, if the group
were based on a
|
|
String |
The full name of the method (include parenthesis and argument types) that contributed
this group (for example, the name of a
|
Name | Type | Purpose |
---|---|---|
|
String |
The full name of the property. Names are in lower-case period-separated form (for
example,
|
|
String |
The full signature of the data type of the property (for example,
|
|
String |
A short description of the group that can be displayed to users. If no description is
available, it may be omitted. It is recommended that descriptions be short paragraphs,
with the first line providing a concise summary. The last line in the description should
end with a period (
|
|
String |
The class name of the source that contributed this property. For example, if the
property were from a class annotated with
|
|
Object |
The default value, which is used if the property is not specified. If the type of the property is an array, it can be an array of value(s). If the default value is unknown, it may be omitted. |
|
Deprecation |
Specify whether the property is deprecated. If the field is not deprecated or if that
information is not known, it may be omitted. The next table offers more detail about
the
|
Name | Type | Purpose |
---|---|---|
|
String |
The level of deprecation, which can be either
|
|
String |
A short description of the reason why the property was deprecated. If no reason is
available, it may be omitted. It is recommended that descriptions be short paragraphs,
with the first line providing a concise summary. The last line in the description should
end with a period (
|
|
String |
The full name of the property that replaces this deprecated property. If there is no replacement for this property, it may be omitted. |
Note | |
---|---|
Prior to Spring Boot 1.3, a single
|
@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); }
Note | |
---|---|
There is no way to set a
|
Name | Type | Purpose |
---|---|---|
|
String |
The full name of the property to which this hint refers. Names are in lower-case
period-separated form (such as
|
|
ValueHint[] |
A list of valid values as defined by the
|
|
ValueProvider[] |
A list of providers as defined by the
|
Name | Type | Purpose |
---|---|---|
|
Object |
A valid value for the element to which the hint refers. If the type of the property is an array, it can also be an array of value(s). This attribute is mandatory. |
|
String |
A short description of the value that can be displayed to users. If no description is
available, it may be omitted . It is recommended that descriptions be short paragraphs,
with the first line providing a concise summary. The last line in the description should
end with a period (
|
Name | Type | Purpose |
---|---|---|
|
String |
The name of the provider to use to offer additional content assistance for the element to which the hint refers. |
|
JSON object |
Any additional parameter that the provider supports (check the documentation of the provider for more details). |
The
name
attribute of each hint refers to the
name
of a property. In the
initial example shown earlier
, we provide five values
for the
spring.jpa.hibernate.ddl-auto
property:
none
,
validate
,
update
,
create
,
and
create-drop
. Each value may have a description as well.
If your property is of type
Map
, you can provide hints for both the keys and the
values (but not for the map itself). The special
.keys
and
.values
suffixes must
refer to the keys and the values, respectively.
Assume a
sample.contexts
maps magic
String
values to an integer, as shown in the
following example:
@ConfigurationProperties("sample") public class SampleProperties { private Map<String,Integer> contexts; // getters and setters }
The magic values are (in this example) are
sample1
and
sample2
. In order to offer
additional content assistance for the keys, you could add the following JSON to
the manual metadata of the module
:
{"hints": [ "name": "sample.contexts.keys", "values": [ "value": "sample1" "value": "sample2" ]}
Tip | |
---|---|
We recommend that you use an
|
Note | |
---|---|
As this is a new feature, IDE vendors must catch up with how it works. Adoption times naturally vary. |
The following table summarizes the list of supported providers:
Name | Description |
---|---|
|
Permits any additional value to be provided. |
|
Auto-completes the classes available in the project. Usually constrained by a base
class that is specified by the
|
|
Handles the property as if it were defined by the type defined by the mandatory
|
|
Auto-completes valid logger names. Typically, package and class names available in the current project can be auto-completed. |
|
Auto-completes the available bean names in the current project. Usually constrained
by a base class that is specified by the
|
|
Auto-completes the available Spring profile names in the project. |
Tip | |
---|---|
Only one provider can be active for a given property, but you can specify several providers if they can all manage the property in some way . Make sure to place the most powerful provider first, as the IDE must use the first one in the JSON section that it can handle. If no provider for a given property is supported, no special content assistance is provided, either. |
The following example offers
on
and
off
as auto-completion values for
system.state
:
{"hints": [ "name": "system.state", "values": [ "value": "on" "value": "off" "providers": [ "name": "any" ]}
Note that, in the preceding example, any other value is also allowed.
Parameter | Type | Default value | Description |
---|---|---|---|
|
|
none |
The fully qualified name of the class that should be assignable to the chosen value. Typically used to filter out-non candidate classes. Note that this information can be provided by the type itself by exposing a class with the appropriate upper bound. |
|
|
true |
Specify whether only concrete classes are to be considered as valid candidates. |
{"hints": [ "name": "server.servlet.jsp.class-name", "providers": [ "name": "class-reference", "parameters": { "target": "javax.servlet.http.HttpServlet" ]}
Parameter | Type | Default value | Description |
---|---|---|---|
|
|
none |
The fully qualified name of the type to consider for the property. This parameter is mandatory. |
The following types can be used:
java.lang.Enum
: Lists the possible values for the property. (We recommend
defining the property with the
Enum
type, as no further hint should be required for
the IDE to auto-complete the values.)
java.nio.charset.Charset
: Supports auto-completion of charset/encoding values (such as
UTF-8
)
java.util.Locale
: auto-completion of locales (such as
en_US
)
org.springframework.util.MimeType
: Supports auto-completion of content type values
(such as
text/plain
)
org.springframework.core.io.Resource
: Supports auto-completion of Spring’s Resource
abstraction to refer to a file on the filesystem or on the classpath. (such as
classpath:/sample.properties
)
Tip | |
---|---|
If multiple values can be provided, use a
|
{"hints": [ "name": "spring.liquibase.change-log", "providers": [ "name": "handle-as", "parameters": { "target": "org.springframework.core.io.Resource" ]}
Parameter | Type | Default value | Description |
---|---|---|---|
|
|
none |
The fully qualified name of the bean class that should be assignable to the candidate. Typically used to filter out non-candidate beans. |
{"hints": [ "name": "spring.jmx.server", "providers": [ "name": "spring-bean-reference", "parameters": { "target": "javax.management.MBeanServer" ]}
Note | |
---|---|
The binder is not aware of the metadata. If you provide that hint, you still need
to transform the bean name into an actual Bean reference using by the
|
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
With Gradle, you can use the propdeps-plugin and specify the following dependency:
dependencies {
optional "org.springframework.boot:spring-boot-configuration-processor"
compileJava.dependsOn(processResources)
Note | |
---|---|
You need to add
|
The processor picks up both classes and methods that are annotated with
@ConfigurationProperties
. The Javadoc for field values within configuration classes
is used to populate the
description
attribute.
Note | |
---|---|
You should only use simple text with
|
Properties are discovered through the presence of standard getters and setters with
special handling for collection types (that is detected even if only a getter is present).
The annotation processor also supports the use of the
@Data
,
@Getter
, and
@Setter
lombok annotations.
Note | |
---|---|
If you are using AspectJ in your project, you need to make sure that the annotation
processor runs only once. There are several ways to do this. With Maven, you can
configure the
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <proc>none</proc> </configuration> </plugin> |
@ConfigurationProperties(prefix="server") public class ServerProperties { private String name; private Host host; // ... getter and setters private static class Host { private String ip; private int port; // ... getter and setters }
Tip | |
---|---|
This has no effect on collections and maps, as those types are automatically identified, and a single metadata property is generated for each of them. |
The following auto-configuration classes are from the
spring-boot-autoconfigure
module:
Configuration Class | Links |
---|---|
The following auto-configuration classes are from the
spring-boot-actuator-autoconfigure
module:
Configuration Class | Links |
---|---|
Test slice | Imported auto-configuration |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Spring Boot Loader-compatible jar files should be structured in the following way:
example.jar +-META-INF | +-MANIFEST.MF +-org | +-springframework | +-boot | +-loader | +-<spring boot loader classes> +-BOOT-INF +-classes | +-mycompany | +-project | +-YourClasses.class +-lib +-dependency1.jar +-dependency2.jar
Spring Boot Loader-compatible war files should be structured in the following way:
example.war +-META-INF | +-MANIFEST.MF +-org | +-springframework | +-boot | +-loader | +-<spring boot loader classes> +-WEB-INF +-classes | +-com | +-mycompany | +-project | +-YourClasses.class +-lib | +-dependency1.jar | +-dependency2.jar +-lib-provided +-servlet-api.jar +-dependency3.jar
The following example shows a typical
MANIFEST.MF
for an executable jar file:
Main-Class: org.springframework.boot.loader.JarLauncher Start-Class: com.mycompany.project.MyApplication
For a war file, it would be as follows:
Main-Class: org.springframework.boot.loader.WarLauncher Start-Class: com.mycompany.project.MyApplication
Note | |
---|---|
You need not specify
|
Key | Purpose |
---|---|
|
Comma-separated Classpath, such as
|
|
Used to resolve relative paths in
|
|
Default arguments for the main method (space separated). |
|
Name of main class to launch (for example,
|
|
Name of properties file (for example,
|
|
Path to properties file (for example,
|
|
Boolean flag to indicate that all properties should be added to System properties
It defaults to
|
When specified as environment variables or manifest entries, the following names should be used:
Key | Manifest entry | Environment variable |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Tip | |
---|---|
Build plugins automatically move the
|
The following rules apply to working with
PropertiesLauncher
:
loader.properties
is searched for in
loader.home
, then in the root of the
classpath, and then in
classpath:/BOOT-INF/classes
. The first location where a file
with that name exists is used.
loader.home
is the directory location of an additional properties file
(overriding the default) only when
loader.config.location
is not specified.
loader.path
can contain directories (which are scanned recursively for jar and zip
files), archive paths, a directory within an archive that is scanned for jar files (for
example,
dependencies.jar!/lib
), or wildcard patterns (for the default JVM behavior).
Archive paths can be relative to
loader.home
or anywhere in the file system with a
jar:file:
prefix.
loader.path
(if empty) defaults to
BOOT-INF/lib
(meaning a local directory or a
nested one if running from an archive). Because of this,
PropertiesLauncher
behaves
the same as
JarLauncher
when no additional configuration is provided.
loader.path
can not be used to configure the location of
loader.properties
(the
classpath used to search for the latter is the JVM classpath when
PropertiesLauncher
is launched).
loader.properties
, the exploded archive
manifest, and the archive manifest.
好帅的苦咖啡 · SkipResumeTrainingValidationLoop._should_check_val_fx() takes 1 positional argument but 2 were given 9 月前 |