Spring Boot Reference
Spring Boot Reference
Spring Boot Reference
1.4.3.RELEASE
Phillip Webb , Dave Syer , Josh Long , Stphane Nicoll , Rob Winch ,
Andy Wilkinson , Marcel Overdijk , Christian Dupuis , Sbastien Deleuze
Copyright 2013-2016
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 copy contains this Copyright Notice, whether distributed in print or electronically.
Table of Contents
I. Spring Boot Documentation ...................................................................................................... 1
1. About the documentation ................................................................................................ 2
2. Getting help .................................................................................................................... 3
3. First steps ...................................................................................................................... 4
4. Working with Spring Boot ................................................................................................ 5
5. Learning about Spring Boot features ................................................................................ 6
6. Moving to production ....................................................................................................... 7
7. Advanced topics ............................................................................................................. 8
II. Getting started ........................................................................................................................ 9
8. Introducing Spring Boot ................................................................................................. 10
9. System Requirements ................................................................................................... 11
9.1. Servlet containers ............................................................................................... 11
10. Installing Spring Boot .................................................................................................. 12
10.1. Installation instructions for the Java developer ................................................... 12
Maven installation ............................................................................................. 12
Gradle installation ............................................................................................. 13
10.2. Installing the Spring Boot CLI ........................................................................... 14
Manual installation ............................................................................................ 14
Installation with SDKMAN! ................................................................................. 14
OSX Homebrew installation ............................................................................... 15
MacPorts installation ......................................................................................... 15
Command-line completion ................................................................................. 15
Quick start Spring CLI example ......................................................................... 15
10.3. Upgrading from an earlier version of Spring Boot ............................................... 16
11. Developing your first Spring Boot application ................................................................ 17
11.1. Creating the POM ............................................................................................ 17
11.2. Adding classpath dependencies ........................................................................ 18
11.3. Writing the code ............................................................................................... 18
The @RestController and @RequestMapping annotations .................................. 19
The @EnableAutoConfiguration annotation ........................................................ 19
The main method ........................................................................................... 19
11.4. Running the example ........................................................................................ 19
11.5. Creating an executable jar ................................................................................ 20
12. What to read next ....................................................................................................... 22
III. Using Spring Boot ................................................................................................................ 23
13. Build systems ............................................................................................................. 24
13.1. Dependency management ................................................................................ 24
13.2. Maven .............................................................................................................. 24
Inheriting the starter parent ............................................................................... 24
Using Spring Boot without the parent POM ........................................................ 25
Changing the Java version ................................................................................ 26
Using the Spring Boot Maven plugin .................................................................. 26
13.3. Gradle .............................................................................................................. 26
13.4. Ant ................................................................................................................... 27
13.5. Starters ............................................................................................................ 28
14. Structuring your code .................................................................................................. 34
14.1. Using the default package .............................................................................. 34
1.4.3.RELEASE
Spring Boot
ii
1.4.3.RELEASE
Spring Boot
iii
1.4.3.RELEASE
Spring Boot
iv
1.4.3.RELEASE
Spring Boot
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
1.4.3.RELEASE
Spring Boot
vi
1.4.3.RELEASE
Spring Boot
138
138
139
139
140
141
142
143
144
145
145
146
146
146
146
148
149
150
150
150
150
151
151
151
151
151
152
152
152
152
153
154
155
156
157
158
159
159
159
160
160
160
161
161
161
162
162
162
163
164
vii
1.4.3.RELEASE
Spring Boot
viii
1.4.3.RELEASE
Spring Boot
ix
1.4.3.RELEASE
Spring Boot
71.
72.
73.
74.
75.
76.
77.
78.
1.4.3.RELEASE
Spring Boot
xi
78.1. Change the HTTP port or address of the actuator endpoints ............................. 258
78.2. Customize the whitelabel error page .............................................................. 258
78.3. Actuator and Jersey ........................................................................................ 258
79. Security ..................................................................................................................... 259
79.1. Switch off the Spring Boot security configuration .............................................. 259
79.2. Change the AuthenticationManager and add user accounts .............................. 259
79.3. Enable HTTPS when running behind a proxy server ......................................... 259
80. Hot swapping ............................................................................................................ 261
80.1. Reload static content ...................................................................................... 261
80.2. Reload templates without restarting the container ............................................. 261
Thymeleaf templates ....................................................................................... 261
FreeMarker templates ...................................................................................... 261
Groovy templates ............................................................................................ 261
Velocity templates ........................................................................................... 261
80.3. Fast application restarts .................................................................................. 261
80.4. Reload Java classes without restarting the container ........................................ 261
Configuring Spring Loaded for use with Maven ................................................. 262
Configuring Spring Loaded for use with Gradle and IntelliJ IDEA ........................ 262
81. Build ......................................................................................................................... 263
81.1. Generate build information .............................................................................. 263
81.2. Generate git information .................................................................................. 263
81.3. Customize dependency versions ..................................................................... 264
81.4. Create an executable JAR with Maven ............................................................ 264
81.5. Use a Spring Boot application as a dependency ............................................... 265
81.6. Extract specific libraries when an executable jar runs ....................................... 265
81.7. Create a non-executable JAR with exclusions .................................................. 266
81.8. Remote debug a Spring Boot application started with Maven ............................. 267
81.9. Remote debug a Spring Boot application started with Gradle ............................. 267
81.10. Build an executable archive from Ant without using spring-boot-antlib ............... 268
81.11. How to use Java 6 ....................................................................................... 268
Embedded servlet container compatibility ......................................................... 269
Jackson .......................................................................................................... 269
JTA API compatibility ...................................................................................... 269
82. Traditional deployment ............................................................................................... 270
82.1. Create a deployable war file ........................................................................... 270
82.2. Create a deployable war file for older servlet containers .................................... 271
82.3. Convert an existing application to Spring Boot .................................................. 271
82.4. Deploying a WAR to WebLogic ....................................................................... 273
82.5. Deploying a WAR in an Old (Servlet 2.5) Container .......................................... 273
X. Appendices ......................................................................................................................... 275
A. Common application properties ................................................................................... 276
B. Configuration meta-data .............................................................................................. 297
B.1. Meta-data format .............................................................................................. 297
Group Attributes .............................................................................................. 298
Property Attributes ........................................................................................... 299
Hint Attributes ................................................................................................. 300
Repeated meta-data items ............................................................................... 301
B.2. Providing manual hints ..................................................................................... 301
Value hint ....................................................................................................... 302
Value provider ................................................................................................. 302
1.4.3.RELEASE
Spring Boot
xii
1.4.3.RELEASE
Spring Boot
xiii
1.4.3.RELEASE
Spring Boot
2. Getting help
Having trouble with Spring Boot, Wed like to help!
Try the How-tos they provide solutions to the most common questions.
Learn the Spring basics Spring Boot builds on many other Spring projects, check the spring.io website for a wealth of reference documentation. If you are just starting out with Spring, try one of the
guides.
Ask a question - we monitor stackoverflow.com for questions tagged with spring-boot.
Report bugs with Spring Boot at github.com/spring-projects/spring-boot/issues.
Note
All of Spring Boot is open source, including the documentation! If you find problems with the docs;
or if you just want to improve them, please get involved.
1.4.3.RELEASE
Spring Boot
3. First steps
If youre just getting started with Spring Boot, or 'Spring' in general, this is the place to start!
From scratch: Overview | Requirements | Installation
Tutorial: Part 1 | Part 2
Running your example: Part 1 | Part 2
1.4.3.RELEASE
Spring Boot
1.4.3.RELEASE
Spring Boot
1.4.3.RELEASE
Spring Boot
6. Moving to production
When youre ready to push your Spring Boot application to production, weve got some tricks that you
might like!
Management endpoints: Overview | Customization
Connection options: HTTP | JMX | SSH
Monitoring: Metrics | Auditing | Tracing | Process
1.4.3.RELEASE
Spring Boot
7. Advanced topics
Lastly, we have a few topics for the more advanced user.
Deploy Spring Boot Applications: Cloud Deployment | OS Service
Build tool plugins: Maven | Gradle
Appendix: Application Properties | Auto-configuration classes | Executable Jars
1.4.3.RELEASE
Spring Boot
1.4.3.RELEASE
Spring Boot
10
9. System Requirements
By default, Spring Boot 1.4.3.RELEASE requires Java 7 and Spring Framework 4.3.5.RELEASE or
above. You can use Spring Boot with Java 6 with some additional configuration. See Section 81.11,
How to use Java 6 for more details. Explicit build support is provided for Maven (3.2+) and Gradle
(1.12 or 2.x). Support for Gradle 2.8 and earlier is deprecated. Gradle 3 is not supported.
Tip
Although you can use Spring Boot with Java 6 or 7, we generally recommend Java 8 if at all
possible.
Servlet Version
Java Version
Tomcat 8
3.1
Java 7+
Tomcat 7
3.0
Java 6+
Jetty 9.3
3.1
Java 8+
Jetty 9.2
3.1
Java 7+
Jetty 8
3.0
Java 6+
Undertow 1.3
3.1
Java 7+
You can also deploy Spring Boot applications to any Servlet 3.0+ compatible container.
1.4.3.RELEASE
Spring Boot
11
If you are new to Java development, or if you just want to experiment with Spring Boot you might want
to try the Spring Boot CLI first, otherwise, read on for classic installation instructions.
Tip
Although Spring Boot is compatible with Java 1.6, if possible, you should consider using the latest
version of Java.
Maven installation
Spring Boot is compatible with Apache Maven 3.2 or above. If you dont already have Maven installed
you can follow the instructions at maven.apache.org.
Tip
On many operating systems Maven can be installed via a package manager. If youre an OSX
Homebrew user try brew install maven. Ubuntu users can run sudo apt-get install
maven.
Spring Boot dependencies use the org.springframework.boot groupId. Typically your Maven
POM file will inherit from the spring-boot-starter-parent project and declare dependencies to
one or more Starters. Spring Boot also provides an optional Maven plugin to create executable jars.
Here is 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>
1.4.3.RELEASE
Spring Boot
12
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.3.RELEASE</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>
</project>
Tip
The spring-boot-starter-parent is a great way to use Spring Boot, but it might not be
suitable all of the time. Sometimes you may need to inherit from a different parent POM, or you
might just not like our default settings. See the section called Using Spring Boot without the parent
POM for an alternative solution that uses an import scope.
Gradle installation
Spring Boot is compatible with Gradle 1.12 or 2.x but support for 2.8 and earlier is deprecated. Gradle
2.14.1 is recommended. Gradle 3 is not supported. If you dont already have Gradle installed you can
follow the instructions at www.gradle.org/.
Spring Boot dependencies can be declared using the org.springframework.boot group. Typically
your project will declare 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.
Its a small script and library that you commit alongside your code to bootstrap the build process.
See docs.gradle.org/2.14.1/userguide/gradle_wrapper.html for details.
Here is a typical build.gradle file:
plugins {
id 'org.springframework.boot' version '1.4.3.RELEASE'
id 'java'
}
jar {
baseName = 'myproject'
version = '0.0.1-SNAPSHOT'
}
1.4.3.RELEASE
Spring Boot
13
repositories {
jcenter()
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web")
testCompile("org.springframework.boot:spring-boot-starter-test")
}
Manual installation
You can download the Spring CLI distribution from the Spring software repository:
spring-boot-cli-1.4.3.RELEASE-bin.zip
spring-boot-cli-1.4.3.RELEASE-bin.tar.gz
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, or alternatively you
can use java -jar with the .jar file (the script helps you to be sure that the classpath is set correctly).
If you are developing features for the CLI and want easy access to the version you just built, follow
these extra instructions.
$ sdk install springboot dev /path/to/spring-boot/spring-boot-cli/target/spring-boot-cli-1.4.3.RELEASEbin/spring-1.4.3.RELEASE/
$ sdk default springboot dev
$ spring --version
Spring CLI v1.4.3.RELEASE
This will 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 will be up-to-date.
You can see it by doing this:
1.4.3.RELEASE
Spring Boot
14
$ sdk ls springboot
================================================================================
Available Springboot Versions
================================================================================
> + dev
* 1.4.3.RELEASE
================================================================================
+ - local version
* - installed
> - currently in use
================================================================================
MacPorts installation
If you are on a Mac and using MacPorts, all you need to do to install the Spring Boot CLI is:
$ sudo port install spring-boot-cli
Command-line completion
Spring Boot CLI ships with scripts that provide command completion for 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. To run the script manually,
e.g. if you have installed using SDKMAN!
$ . ~/.sdkman/candidates/springboot/current/shell-completion/bash/spring
$ spring <HIT TAB HERE>
grab help jar run test version
Note
If you install Spring Boot CLI using Homebrew or MacPorts, the command-line completion scripts
are automatically registered with your shell.
1.4.3.RELEASE
Spring Boot
15
class ThisWillActuallyRun {
@RequestMapping("/")
String home() {
"Hello World!"
}
}
Note
It will take some time when you first run the application as dependencies are downloaded.
Subsequent runs will be much quicker.
Open localhost:8080 in your favorite web browser and you should see the following output:
Hello World!
1.4.3.RELEASE
Spring Boot
16
$ mvn -v
Apache Maven 3.2.3 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-11T13:58:10-07:00)
Maven home: /Users/user/tools/apache-maven-3.1.1
Java version: 1.7.0_51, 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.
This should give you a working build, you can test it out by running mvn package (you can ignore the
jar will be empty - no content was marked for inclusion! warning for now).
1.4.3.RELEASE
Spring Boot
17
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 will continue to use a plain text editor for this example.
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. Lets edit our
pom.xml and add the spring-boot-starter-web dependency just 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 will see that there are now a number of additional
dependencies, including the Tomcat web server and Spring Boot itself.
org.springframework.boot.*;
org.springframework.boot.autoconfigure.*;
org.springframework.stereotype.*;
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);
}
}
1.4.3.RELEASE
Spring Boot
18
Although there isnt much code here, quite a lot is going on. Lets step through the important parts.
____
1.4.3.RELEASE
__ _ _
Spring Boot
19
If you open a web browser to localhost:8080 you should see the following output:
Hello World!
Note
The spring-boot-starter-parent POM includes <executions> configuration to bind the
repackage goal. If you are not using the parent POM you will need to declare this configuration
yourself. See the plugin documentation for details.
Save your pom.xml and run mvn package from the command line:
1.4.3.RELEASE
Spring Boot
20
$ mvn package
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]
[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:
$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar
1.4.3.RELEASE
Spring Boot
21
1.4.3.RELEASE
Spring Boot
22
13.2 Maven
Maven users can inherit from the spring-boot-starter-parent project to obtain sensible defaults.
The parent project provides the following features:
Java 1.6 as the default compiler level.
UTF-8 source encoding.
A Dependency Management section, allowing you to omit <version> tags for common
dependencies, inherited from the spring-boot-dependencies POM.
Sensible resource filtering.
Sensible plugin configuration (exec plugin, surefire, Git commit ID, shade).
Sensible resource filtering for application.properties and application.yml including
profile-specific files (e.g. application-foo.properties and application-foo.yml)
On the last point: since the default config files accept Spring style placeholders (${}) the Maven
filtering is changed to use @..@ placeholders (you can override that with a Maven property
resource.delimiter).
1.4.3.RELEASE
Spring Boot
24
Note
You should only need to specify the Spring Boot version number on this dependency. If you import
additional starters, you can safely omit the version number.
With that setup, you can also override individual dependencies by overriding a property in your own
project. For instance, to upgrade to another Spring Data release train youd add the following to your
pom.xml.
<properties>
<spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>
Tip
Check the spring-boot-dependencies pom for a list of supported properties.
That setup does not allow you to override individual dependencies using a property as explained above.
To achieve the same result, youd need to add an entry in the dependencyManagement of your project
before the spring-boot-dependencies entry. For instance, to upgrade to another Spring Data
release train youd add the following to your pom.xml.
<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>
1.4.3.RELEASE
Spring Boot
25
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.4.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Note
In the example above, we specify a BOM but any dependency type can be overridden that way.
Note
If you use the Spring Boot starter parent pom, you only need to add the plugin, there is no need
for to configure it unless you want to change the settings defined in the parent.
13.3 Gradle
Gradle users can directly import starters in their dependencies section. Unlike Maven, there is no
super parent to import to share some configuration.
repositories {
jcenter()
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web:1.4.3.RELEASE")
}
The spring-boot-gradle-plugin is also available and provides tasks to create executable jars
and run projects from source. It also provides dependency management that, among other capabilities,
allows you to omit the version number for any dependencies that are managed by Spring Boot:
1.4.3.RELEASE
Spring Boot
26
plugins {
id 'org.springframework.boot' version '1.4.3.RELEASE'
id 'java'
}
repositories {
jcenter()
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web")
testCompile("org.springframework.boot:spring-boot-starter-test")
}
13.4 Ant
It is possible to build a Spring Boot project using Apache Ant+Ivy. The spring-boot-antlib AntLib
module is also available to help Ant create executable jars.
To declare dependencies a typical ivy.xml file will look something like this:
<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>
1.4.3.RELEASE
Spring Boot
27
</target>
</project>
Tip
See the Section 81.10, Build an executable archive from Ant without using spring-boot-antlib
How-to if you dont want to use the spring-boot-antlib module.
13.5 Starters
Starters are a set of convenient dependency descriptors that you can include in your application. You
get a one-stop-shop for all the Spring and related technology that you need, without having to hunt
through sample code and copy paste loads of dependency descriptors. For example, if you want to get
started using Spring and JPA for database access, just include the spring-boot-starter-datajpa dependency in your project, and you are good to go.
The starters contain a lot of the dependencies that you need to get a project up and running quickly and
with a consistent, supported set of managed transitive dependencies.
Whats in a name
All official starters follow a similar naming pattern; spring-boot-starter-*, where * is a
particular type of application. This naming structure is intended to help when you need to find
a starter. The Maven integration in many IDEs allow you to search dependencies by name. For
example, with the appropriate Eclipse or STS plugin installed, you can simply hit ctrl-space in
the POM editor and type spring-boot-starter for a complete list.
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. A third-party starter for acme will
be typically named acme-spring-boot-starter.
The
following
application
starters
org.springframework.boot group:
are
provided
by
Spring
Boot
under
the
Description
Pom
spring-boot-starterthymeleaf
Pom
spring-boot-starter-ws
Pom
spring-boot-starterdata-couchbase
Pom
spring-boot-starterartemis
Pom
1.4.3.RELEASE
Spring Boot
28
Name
Description
Pom
spring-boot-starterweb-services
Pom
spring-boot-startermail
Pom
spring-boot-starterdata-redis
Pom
spring-boot-starter-web
Pom
spring-boot-starterdata-gemfire
Pom
spring-boot-starteractivemq
Pom
spring-boot-starterdata-elasticsearch
Pom
spring-boot-starterintegration
Pom
spring-boot-startertest
Pom
spring-boot-starterhornetq
Pom
spring-boot-starterjdbc
Pom
spring-boot-startermobile
Pom
spring-boot-startervalidation
Pom
1.4.3.RELEASE
Spring Boot
29
Name
Description
Pom
spring-boot-starterhateoas
Pom
spring-boot-starterjersey
Pom
spring-boot-starterdata-neo4j
Pom
spring-boot-starterwebsocket
Pom
spring-boot-starter-aop
Pom
spring-boot-starteramqp
Pom
spring-boot-starterdata-cassandra
spring-boot-startersocial-facebook
Pom
spring-boot-starterjta-atomikos
Pom
spring-boot-startersecurity
spring-boot-startermustache
Pom
spring-boot-starterdata-jpa
Pom
spring-boot-starter
Pom
spring-boot-startervelocity
Pom
1.4.3.RELEASE
Spring Boot
30
Name
Description
Pom
spring-boot-startergroovy-templates
Pom
spring-boot-starterfreemarker
Pom
spring-boot-starterbatch
Pom
spring-boot-starterredis
spring-boot-startersocial-linkedin
Pom
spring-boot-startercache
Pom
spring-boot-starterdata-solr
spring-boot-starterdata-mongodb
Pom
spring-boot-starterjooq
Pom
spring-boot-starterjta-narayana
Pom
spring-boot-startercloud-connectors
Pom
spring-boot-starterjta-bitronix
Pom
1.4.3.RELEASE
Spring Boot
31
Name
Description
Pom
spring-boot-startersocial-twitter
Pom
spring-boot-starterdata-rest
Pom
In addition to the application starters, the following starters can be used to add production ready features:
Table 13.2. Spring Boot production starters
Name
Description
Pom
spring-boot-starteractuator
Pom
spring-boot-starterremote-shell
Pom
Finally, Spring Boot also includes some 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
spring-boot-starterundertow
Pom
spring-boot-starterjetty
spring-boot-starterlogging
spring-boot-startertomcat
Pom
spring-boot-starterlog4j2
Pom
1.4.3.RELEASE
Spring Boot
32
Name
Description
Pom
spring-boot-starterlogging
Tip
For a list of additional community contributed starters, see the README file in the spring-bootstarters module on GitHub.
1.4.3.RELEASE
Spring Boot
33
The Application.java file would declare the main method, along with the basic @Configuration.
package com.example.myproject;
import
import
import
import
org.springframework.boot.SpringApplication;
org.springframework.boot.autoconfigure.EnableAutoConfiguration;
org.springframework.context.annotation.ComponentScan;
org.springframework.context.annotation.Configuration;
@Configuration
@EnableAutoConfiguration
@ComponentScan
1.4.3.RELEASE
Spring Boot
34
1.4.3.RELEASE
Spring Boot
35
1.4.3.RELEASE
Spring Boot
36
16. Auto-configuration
Spring Boot auto-configuration attempts to automatically configure your Spring application based on the
jar dependencies that you have added. For example, If HSQLDB is on your classpath, and you have
not manually configured any database connection beans, then we will auto-configure an in-memory
database.
You need to opt-in to auto-configuration by adding the @EnableAutoConfiguration or
@SpringBootApplication annotations to one of your @Configuration classes.
Tip
You should only ever add one @EnableAutoConfiguration annotation. We generally
recommend that you add it to your primary @Configuration class.
If the class is not on the classpath, you can use the excludeName attribute of the annotation and specify
the fully qualified name instead. Finally, you can also control the list of auto-configuration classes to
exclude via the spring.autoconfigure.exclude property.
Tip
You can define exclusions both at the annotation level and using the property.
1.4.3.RELEASE
Spring Boot
37
Tip
Notice how using constructor injection allows the riskAssessor field to be marked as final,
indicating that it cannot be subsequently changed.
1.4.3.RELEASE
Spring Boot
38
Note
@SpringBootApplication also provides aliases
@EnableAutoConfiguration and @ComponentScan.
1.4.3.RELEASE
Spring Boot
to
customize
the
attributes
of
39
It is also possible to run a packaged application with remote debugging support enabled. This allows
you to attach a debugger to your packaged application:
$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \
-jar target/myproject-0.0.1-SNAPSHOT.jar
You might also want to use the useful operating system environment variable:
$ export MAVEN_OPTS=-Xmx1024m -XX:MaxPermSize=128M
1.4.3.RELEASE
Spring Boot
40
You might also want to use this useful operating system environment variable:
$ export JAVA_OPTS=-Xmx1024m -XX:MaxPermSize=128M
1.4.3.RELEASE
Spring Boot
41
Gradle.
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 its started using 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 support optional dependencies out-of-the-box so you may want to have a look to the
propdeps-plugin in the meantime.
Tip
If you want to ensure that devtools is never included in a production build, you can use the
excludeDevtools build property to completely remove the JAR. The property is supported with
both the Maven and Gradle plugins.
1.4.3.RELEASE
Spring Boot
42
Tip
For a complete list of the properties that are applied see DevToolsPropertyDefaultsPostProcessor.
Note
You can also start your application via the supported build plugins (i.e. Maven and Gradle) as long
as forking is enabled since DevTools need an isolated application classloader to operate properly.
Gradle and Maven do that by default when they detect DevTools on the classpath.
Tip
Automatic restart works very well when used with LiveReload. See below for details. If you use
JRebel automatic restarts will be 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 contexts shutdown hook to close it during a
restart. It will 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, springboot-autoconfigure, spring-boot-actuator, and spring-boot-starter.
Restart vs Reload
The restart technology provided by Spring Boot works by using two classloaders. Classes that dont
change (for example, those from third-party jars) are loaded into a base classloader. Classes that
youre 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.
1.4.3.RELEASE
Spring Boot
43
If you find that restarts arent 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. Spring
Loaded provides another option, however it doesnt support as many frameworks and it isnt
commercially supported.
Excluding resources
Certain resources dont necessarily need to trigger a restart when they are changed. For example,
Thymeleaf templates can just be edited in-place. By default changing resources in /META-INF/
maven, /META-INF/resources ,/resources ,/static ,/public or /templates will not trigger
a restart but will trigger a live reload. If you want to customize these exclusions you can use the
spring.devtools.restart.exclude property. For example, to exclude only /static and /
public you would set the following:
spring.devtools.restart.exclude=static/**,public/**
Tip
if you want to keep those defaults and add additional exclusions,
spring.devtools.restart.additional-exclude property instead.
use
the
Disabling restart
If you dont want to use the restart feature you can disable it using the
spring.devtools.restart.enabled property. In most cases you can set this in your
application.properties (this will still initialize the restart classloader but it wont watch for file
changes).
If you need to completely disable restart support, for example, because it doesnt work with a specific
library, you need to set a System property before calling SpringApplication.run(). For example:
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}
1.4.3.RELEASE
Spring Boot
44
Note
All property keys must be unique. As long as a property starts with restart.include. or
restart.exclude. it will be 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.
Known limitations
Restart
functionality
does
not
work
well
with
objects
that
are
deserialized
using a standard ObjectInputStream. If you need to deserialize data, you
may need to use Springs ConfigurableObjectInputStream in combination with
Thread.currentThread().getContextClassLoader().
Unfortunately, several third-party libraries deserialize without considering the context classloader. If you
find such a problem, you will need to request a fix with the original authors.
20.3 LiveReload
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.
1.4.3.RELEASE
Spring Boot
45
If you dont want to start the LiveReload server when your application runs you can set the
spring.devtools.livereload.enabled property to false.
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 will have LiveReload support.
Warning
Enabling spring-boot-devtools on a remote application is a security risk. You should never
enable support on a production deployment.
Remote devtools support is provided in two parts; there is a server side endpoint that accepts
connections, and a client application that you run in your IDE. The server component is automatically
enabled when the spring.devtools.remote.secret property is set. The client component must
be launched manually.
1.4.3.RELEASE
Spring Boot
46
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
Its 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 and spring.devtools.remote.proxy.port
properties.
Remote update
The remote client will monitor your application classpath for changes in the same way as the local restart.
Any updated resource will be pushed to the remote application and (if required) trigger a restart. This
can be quite helpful if you are iterating on a feature that uses a cloud service that you dont 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 wont be pushed to the remote server.
1.4.3.RELEASE
Spring Boot
47
Tip
Notice that you dont need to pass an address=NNNN option to -Xrunjdwp. If omitted Java will
simply pick a random free port.
Note
Debugging a remote service over the Internet can be slow and you might need to increase timeouts
in your IDE. For example, in Eclipse you can select Java Debug from Preferences and
change the Debugger timeout (ms) to a more suitable value (60000 works well in most
situations).
1.4.3.RELEASE
Spring Boot
48
1.4.3.RELEASE
Spring Boot
49
1.4.3.RELEASE
Spring Boot
50
23. SpringApplication
The SpringApplication class provides a convenient way to bootstrap a Spring application that
will be started from a main() method. In many situations you can just delegate to the static
SpringApplication.run method:
public static void main(String[] args) {
SpringApplication.run(MySpringConfiguration.class, args);
}
When your application starts you should see something similar to the following:
.
____
_
__ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot ::
v1.4.3.RELEASE
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] ationConfigEmbeddedWebApplicationContext
Refreshing
org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@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.TomcatEmbeddedServletContainerFactory
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)
:
:
:
:
By default INFO logging messages will be shown, including some relevant startup details such as the
user that launched the application.
Note
Spring Boot provides numerous FailureAnalyzer implementations and you can add your own
very easily.
If no failure analyzers are able to handle the exception,
the full auto-configuration report to better understand what
1.4.3.RELEASE
Spring Boot
52
so you need to enable the debug property or enable DEBUG logging for
org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer
For instance, if you are running your application using java -jar you can enable the debug property
as follows:
$ java -jar myproject-0.0.1-SNAPSHOT.jar --debug
Description
${application.version}
${application.formatted-version}
${spring-boot.version}
${spring-boot.formatted-version}
${application.title}
Tip
The SpringApplication.setBanner() method can be used if you want to generate
a banner programmatically. Use the org.springframework.boot.Banner interface and
implement your own printBanner() method.
1.4.3.RELEASE
Spring Boot
53
You can also use the spring.main.banner-mode property to determine if the banner has to be
printed on System.out (console), using the configured logger (log) or not at all (off).
The printed banner will be registered as a singleton bean under the name springBootBanner.
Note
YAML maps off to false so make sure to add quotes if you want to disable the banner in your
application.
spring:
main:
banner-mode: "off"
Note
The constructor arguments passed to SpringApplication are configuration sources for spring
beans. In most cases these will be references to @Configuration classes, but they could also
be references to XML configuration or to packages that should be scanned.
It is also possible to configure the SpringApplication using an application.properties file.
See Chapter 24, Externalized Configuration for details.
For a complete list of the configuration options, see the SpringApplication Javadoc.
1.4.3.RELEASE
Spring Boot
54
Note
There are some restrictions when creating an ApplicationContext hierarchy, e.g. Web
components must be contained within the child context, and the same Environment will be
used for both parent and child contexts. See the SpringApplicationBuilder Javadoc for
full details.
Application events are sent in the following order, as your application runs:
1. An ApplicationStartedEvent is sent at the start of a run, but before any processing except the
registration of listeners and initializers.
2. An ApplicationEnvironmentPreparedEvent is sent when the Environment to be used in the
context is known, but before the context is created.
3. An ApplicationPreparedEvent is sent just before the refresh is started, but after bean definitions
have been loaded.
4. An ApplicationReadyEvent is sent after the refresh and any related callbacks have been
processed to indicate the application is ready to service requests.
5. An ApplicationFailedEvent is sent if there is an exception on startup.
Tip
You often wont need to use application events, but it can be handy to know that they exist.
Internally, Spring Boot uses events to handle a variety of tasks.
1.4.3.RELEASE
Spring Boot
55
The algorithm used to determine a web environment is fairly simplistic (based on the presence of a few
classes). You can use setWebEnvironment(boolean webEnvironment) if you need to override
the default.
It is also possible to take complete control of the ApplicationContext type that will be used by
calling setApplicationContextClass().
Tip
It is often desirable to call setWebEnvironment(false) when using SpringApplication
within a JUnit test.
Tip
Spring Boot will also register a CommandLinePropertySource with the Spring Environment.
This allows you to also inject single application arguments using the @Value annotation.
1.4.3.RELEASE
Spring Boot
56
1.4.3.RELEASE
Spring Boot
57
home
directory
(~/.spring-boot-
of
13.Profile-specific
application
properties
packaged
{profile}.properties and YAML variants)
your
packaged
inside
your
jar
jar
(application-
(application-
1.4.3.RELEASE
Spring Boot
58
@Component
public class MyBean {
@Value("${name}")
private String name;
// ...
}
On your application classpath (e.g. inside your jar) you can have an application.properties
that provides a sensible default property value for name. When running in a new environment, an
application.properties can be provided outside of your jar that overrides the name; and for
one-off testing, you can launch with a specific command line switch (e.g. java -jar app.jar -name="Spring").
Tip
The SPRING_APPLICATION_JSON properties can be supplied on the command line with an
environment variable. For example in a UN*X shell:
$ SPRING_APPLICATION_JSON='{"foo":{"bar":"spam"}}' java -jar myapp.jar
In this example you will end up with foo.bar=spam in the Spring Environment. You can also
supply the JSON as spring.application.json in a System variable:
$ java -Dspring.application.json='{"foo":"bar"}' -jar myapp.jar
The random.int* syntax is OPEN value (,max) CLOSE where the OPEN,CLOSE are any character
and value,max are integers. If max is provided then value is the minimum value and max is the
maximum (exclusive).
1.4.3.RELEASE
Spring Boot
59
If you dont want command line properties to be added to the Environment you can disable them using
SpringApplication.setAddCommandLineProperties(false).
or
$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/
override.properties
Warning
spring.config.name and spring.config.location are used very early to determine
which files have to be loaded so they have to be defined as an environment property (typically
OS env, system property or command line argument).
If spring.config.location contains directories (as opposed to files) they should end in / (and will
be appended with the names generated from spring.config.name before being loaded, including
profile-specific file names). Files specified in spring.config.location are used as-is, with no
support for profile-specific variants, and will be overridden by any profile-specific properties.
The default search path classpath:,classpath:/config,file:,file:config/ is always
used, irrespective of the value of spring.config.location. This search path is ordered from
lowest to highest precedence (file:config/ wins). If you do specify your own locations, they take
precedence over all of the default locations and use the same lowest to highest precedence ordering. In
that way you can set up default values for your application in application.properties (or whatever
other basename you choose with spring.config.name) and override it at runtime with a different
file, keeping the defaults.
1.4.3.RELEASE
Spring Boot
60
Note
If you use environment variables rather than system properties, most operating systems disallow
period-separated key names, but you can use underscores instead (e.g. SPRING_CONFIG_NAME
instead of spring.config.name).
Note
If you are running in a container then JNDI properties (in java:comp/env) or servlet context
initialization parameters can be used instead of, or as well as, environment variables or system
properties.
Tip
You can also use this technique to create short variants of existing Spring Boot properties. See
the Section 69.4, Use short command line arguments how-to for details.
1.4.3.RELEASE
Spring Boot
61
Note
If you use Starters SnakeYAML will be automatically provided via spring-boot-starter.
Loading YAML
Spring Framework provides two convenient classes that can be used to load YAML documents. The
YamlPropertiesFactoryBean will load YAML as Properties and the YamlMapFactoryBean will
load YAML as a Map.
For example, the following YAML document:
environments:
dev:
url: http://dev.bar.com
name: Developer Setup
prod:
url: http://foo.bar.com
name: My Cool App
YAML lists are represented as property keys with [index] dereferencers, for example this YAML:
my:
servers:
- dev.bar.com
- foo.bar.com
To bind to properties like that using the Spring DataBinder utilities (which is what
@ConfigurationProperties does) you need to have a property in the target bean of type
java.util.List (or Set) and you either need to provide a setter, or initialize it with a mutable value,
e.g. this will bind to the properties above
@ConfigurationProperties(prefix="my")
public class Config {
private List<String> servers = new ArrayList<String>();
public List<String> getServers() {
return this.servers;
}
}
1.4.3.RELEASE
Spring Boot
62
In the example above, the server.address property will be 127.0.0.1 if the development profile
is active. If the development and production profiles are not enabled, then the value for the property
will be 192.168.1.100.
The default profiles are activated if none are explicitly active when the application context starts. So in
this YAML we set a value for security.user.password that is only available in the "default" profile:
server:
port: 8000
--spring:
profiles: default
security:
user:
password: weak
whereas in this example, the password is always set because it isnt attached to any profile, and it would
have to be explicitly reset in all other profiles as necessary:
server:
port: 8000
security:
user:
password: weak
Spring profiles designated using the "spring.profiles" element may optionally be negated using the !
character. If both negated and non-negated profiles are specified for a single document, at least one
non-negated profile must match and no negated profiles may match.
YAML shortcomings
YAML files cant be loaded via the @PropertySource annotation. So in the case that you need to load
values that way, you need to use a properties file.
1.4.3.RELEASE
Spring Boot
63
@ConfigurationProperties("foo")
public class FooProperties {
private final List<MyPojo> list = new ArrayList<>();
public List<MyPojo> getList() {
return this.list;
}
}
If the dev profile isnt active, FooProperties.list will contain one MyPojo entry as defined above.
If the dev profile is enabled however, the list will still only contain one entry (with name my another
name and description null). This configuration will not add a second MyPojo instance to the list, and
it wont merge the items.
When a collection is specified in multiple profiles, the one with highest priority is used (and only that one):
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 example above, considering that the dev profile is active, FooProperties.list will contain
one MyPojo entry (with name my another name and description null).
java.net.InetAddress;
java.util.ArrayList;
java.util.Collections;
java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("foo")
1.4.3.RELEASE
Spring Boot
64
1.4.3.RELEASE
Spring Boot
65
recommend to always add a setter for such types. If you initialize a collection, make sure it is
not immutable (as in the example above)
If nested POJO properties are initialized (like the Security field in the example above), a
setter is not required. If you want the binder to create the instance on-the-fly using its default
constructor, you will need a setter.
Some people use Project Lombok to add getters and setters automatically. Make sure that Lombok
doesnt generate any particular constructor for such type as it will be used automatically by the
container to instantiate the object.
Tip
See also the differences between @Value and @ConfigurationProperties.
You also need to list the properties classes to register in the @EnableConfigurationProperties
annotation:
@Configuration
@EnableConfigurationProperties(FooProperties.class)
public class MyConfiguration {
}
Note
When @ConfigurationProperties bean is registered that way, the bean will have a
conventional name: <prefix>-<fqn>, where <prefix> is the environment key prefix specified
in the @ConfigurationProperties annotation and <fqn> the fully qualified name of the bean.
If the annotation does not provide any prefix, only the fully qualified name of the bean is used.
The bean name in the example above will be foo-com.example.FooProperties.
Even if the configuration above will create a regular bean for FooProperties, we recommend
that @ConfigurationProperties only deal with the environment and in particular does not
inject other beans from the context. Having said that, The @EnableConfigurationProperties
annotation is also automatically applied to your project so that any existing bean annotated with
@ConfigurationProperties will be configured from the Environment. You could shortcut
MyConfiguration above by making sure FooProperties is a already a bean:
@Component
@ConfigurationProperties(prefix="foo")
public class FooProperties {
// ... see above
}
This style of configuration works particularly well with the SpringApplication external YAML
configuration:
# application.yml
foo:
remote-address: 192.168.1.1
security:
username: foo
roles:
1.4.3.RELEASE
Spring Boot
66
- USER
- ADMIN
# additional configuration as required
To work with @ConfigurationProperties beans you can just inject them in the same way as any
other bean.
@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 @ConfigurationProperties also allows you to generate meta-data files that can be
used by IDEs to offer auto-completion for your own keys, see the Appendix B, Configuration metadata appendix for details.
Third-party configuration
As well as using @ConfigurationProperties to annotate a class, you can also use it on public
@Bean methods. This can be particularly useful when you want to bind properties to third-party
components that are outside of your control.
To configure a bean from the Environment properties, add @ConfigurationProperties to its
bean registration:
@ConfigurationProperties(prefix = "bar")
@Bean
public BarComponent barComponent() {
...
}
Any property defined with the bar prefix will be mapped onto that BarComponent bean in a similar
manner as the FooProperties example above.
Relaxed binding
Spring Boot uses some relaxed rules for binding Environment properties to
@ConfigurationProperties beans, so there doesnt need to be an exact match between the
Environment property name and the bean property name. Common examples where this is useful
include dashed separated (e.g. context-path binds to contextPath), and capitalized (e.g. PORT
binds to port) environment properties.
1.4.3.RELEASE
Spring Boot
67
Note
person.firstName
Standard camel case syntax.
person.firstname
person.first_name
Underscore notation, alternative format for use in .properties and .yml
files.
PERSON_FIRST_NAME
Upper case format. Recommended when using a system environment
variables.
Properties conversion
Spring will attempt to coerce the external application properties to the right type when it binds to
the @ConfigurationProperties beans. If you need custom type conversion you can provide a
ConversionService bean (with bean id conversionService) or custom property editors (via
a CustomEditorConfigurer bean) or custom Converters (with bean definitions annotated as
@ConfigurationPropertiesBinding).
Note
As this bean is requested very early during the application lifecycle, make sure to limit the
dependencies that your ConversionService is using. Typically, any dependency that you
require may not be fully initialized at creation time. You may want to rename your custom
ConversionService if its not required for configuration keys coercion and only rely on custom
converters qualified with @ConfigurationPropertiesBinding.
@ConfigurationProperties Validation
Spring Boot will attempt to validate external configuration, by default using JSR-303 (if it is on
the classpath). You can simply add JSR-303 javax.validation constraint annotations to your
@ConfigurationProperties class:
@ConfigurationProperties(prefix="foo")
public class FooProperties {
1.4.3.RELEASE
Spring Boot
68
@NotNull
private InetAddress remoteAddress;
// ... getters and setters
}
In order to validate values of nested properties, you must annotate the associated field as @Valid to
trigger its validation. For example, building upon the above FooProperties example:
@ConfigurationProperties(prefix="connection")
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 applications lifecycle and declaring
the @Bean method as static allows the bean to be created without having to instantiate the
@Configuration class. This avoids any problems that may be caused by early instantiation. There is
a property validation sample so you can see how to set things up.
Tip
The spring-boot-actuator module includes an endpoint that exposes all
@ConfigurationProperties beans. Simply point your web browser to /configprops or use
the equivalent JMX endpoint. See the Production ready features. section for details.
Feature
@ConfigurationProperties
@Value
Relaxed binding
Yes
No
Meta-data support
Yes
No
SpEL evaluation
No
Yes
1.4.3.RELEASE
Spring Boot
69
If you define a set of configuration keys for your own components, we recommend you to group them in a
POJO annotated with @ConfigurationProperties. Please also be aware that since @Value does
not support relaxed binding, it isnt a great candidate if you need to provide the value using environment
variables.
Finally, while you can write a SpEL expression in @Value, such expressions are not processed from
Application property files.
1.4.3.RELEASE
Spring Boot
70
25. Profiles
Spring Profiles provide a way to segregate parts of your application configuration and make it
only available in certain environments. Any @Component or @Configuration can be marked with
@Profile to limit when it is loaded:
@Configuration
@Profile("production")
public class ProductionConfiguration {
// ...
}
In the normal Spring way, you can use a spring.profiles.active Environment property to
specify which profiles are active. You can specify the property in any of the usual ways, for example
you could include it in your application.properties:
spring.profiles.active=dev,hsqldb
Note
Remember that the spring.profiles property can be defined in a YAML document to
determine when this particular document is included in the configuration. See Section 69.7,
Change configuration depending on the environment for more details.
1.4.3.RELEASE
Spring Boot
71
1.4.3.RELEASE
Spring Boot
72
26. Logging
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 will be used for logging. Appropriate Logback routing is
also included to ensure that dependent libraries that use Java Util Logging, Commons Logging, Log4J
or SLF4J will all work correctly.
Tip
There are a lot of logging frameworks available for Java. Dont worry if the above list seems
confusing. Generally you wont need to change your logging dependencies and the Spring Boot
defaults will work just fine.
:
:
:
:
:
1.4.3.RELEASE
Spring Boot
73
Note
you can also specify debug=true in your application.properties.
When the debug mode is enabled, a selection of core loggers (embedded container, Hibernate and
Spring Boot) are configured to output more information. Enabling the debug mode does not configure
your application to log all messages with DEBUG level.
Alternatively, you can enable a trace mode by starting your application with a --trace flag (or
trace=true in your application.properties). This will enable trace logging for a selection of
core loggers (embedded container, Hibernate schema generation and the whole Spring portfolio).
Color-coded output
If your terminal supports ANSI, color output will be used to aid readability. You can set
spring.output.ansi.enabled to a supported value to override the auto detection.
Color coding is configured using the %clr conversion word. In its simplest form the converter will color
the output according to the log level, for example:
%clr(%5p)
Color
FATAL
Red
ERROR
Red
WARN
Yellow
INFO
Green
DEBUG
Green
TRACE
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:
%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow}
1.4.3.RELEASE
Spring Boot
74
red
yellow
Description
(none)
(none)
Specific file
(none)
my.log
(none)
Specific
directory
/var/log
Log files will rotate when they reach 10 Mb and as with console output, ERROR, WARN and INFO level
messages are logged by default.
Note
The logging system is initialized early in the application lifecycle and as such logging properties
will not be found in property files loaded via @PropertySource annotations.
Tip
Logging properties are independent of the actual logging infrastructure. As a result, specific
configuration keys (such as logback.configurationFile for Logback) are not managed by
spring Boot.
Note
By default Spring Boot remaps Thymeleaf INFO messages so that they are logged at DEBUG
level. This helps to reduce noise in the standard log output. See LevelRemappingAppender
for details of how you can apply remapping in your own configuration.
1.4.3.RELEASE
Spring Boot
75
Logging System
Customization
Logback
Log4j2
log4j2-spring.xml or log4j2.xml
logging.properties
Note
When possible we recommend that you use the -spring variants for your logging configuration
(for example logback-spring.xml rather than logback.xml). If you use standard
configuration locations, Spring cannot completely control log initialization.
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 if at all possible.
To help with the customization some other properties are transferred from the Spring Environment
to System properties:
Spring Environment
System Property
logging.exceptionconversion-word
LOG_EXCEPTION_CONVERSION_WORD
The conversion word thats
used when logging exceptions.
logging.file
LOG_FILE
1.4.3.RELEASE
Comments
Spring Boot
76
Spring Environment
System Property
Comments
logging.path
LOG_PATH
logging.pattern.console
CONSOLE_LOG_PATTERN
logging.pattern.file
FILE_LOG_PATTERN
logging.pattern.level
LOG_LEVEL_PATTERN
PID
PID
All the logging systems supported can consult System properties when parsing their configuration files.
See the default configurations in spring-boot.jar for examples.
Tip
If you want to use a placeholder in a logging property, you should use Spring Boots syntax and
not the syntax of the underlying framework. Notably, if youre using Logback, you should use :
as the delimiter between a property name and its default value and not :-.
Tip
You can add MDC and other ad-hoc content to log lines by overriding only the
LOG_LEVEL_PATTERN (or logging.pattern.level with Logback). For example, if you use
logging.pattern.level=user:%X{user} %5p then the default log format will contain an
MDC entry for "user" if it exists, e.g.
2015-09-30 12:30:04.031 user:juergen INFO 22174 --- [
Handling authenticated request
nio-8080-exec-0] demo.Controller
1.4.3.RELEASE
Spring Boot
77
Profile-specific configuration
The <springProfile> tag allows you to optionally include or exclude sections of configuration based
on the active Spring profiles. Profile sections are supported anywhere within the <configuration>
element. Use the name attribute to specify which profile accepts the configuration. Multiple profiles can
be specified using a comma-separated list.
<springProfile name="staging">
<!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>
<springProfile name="dev, staging">
<!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>
<springProfile name="!production">
<!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>
Environment properties
The <springProperty> tag allows you to surface properties from the Spring Environment for use
within Logback. This can be useful if you want to access values from your application.properties
file in your logback configuration. The tag works in a similar way to Logbacks standard <property>
tag, but rather than specifying a direct value you specify the source of the property (from the
Environment). You can use the scope attribute if you need to store the property somewhere other
than in local scope. If you need a fallback value in case the property is not set in the Environment,
you can use the defaultValue attribute.
<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>
Tip
The RelaxedPropertyResolver is used to access Environment properties. If specify
the source in dashed notation (my-property-name) all the relaxed variations will be tried
(myPropertyName, MY_PROPERTY_NAME etc).
1.4.3.RELEASE
Spring Boot
78
Spring MVC is part of the core Spring Framework and detailed information is available in the reference
documentation. There are also several guides available at spring.io/guides that cover Spring MVC.
1.4.3.RELEASE
Spring Boot
79
HttpMessageConverters
Spring MVC uses the HttpMessageConverter interface to convert HTTP requests and responses.
Sensible defaults are included out of the box, for example Objects can be automatically converted to
JSON (using the Jackson library) or XML (using the Jackson XML extension if available, else using
JAXB). Strings are encoded using UTF-8 by default.
If you need to add or customize converters you can use Spring Boots 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);
}
}
Any HttpMessageConverter bean that is present in the context will be added to the list of converters.
You can also override default converters that way.
1.4.3.RELEASE
Spring Boot
80
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> {
// ...
}
}
MessageCodesResolver
Spring MVC has a strategy for generating error codes for rendering error messages from binding errors:
MessageCodesResolver. Spring Boot will create one for you if you set the spring.mvc.messagecodes-resolver.format property PREFIX_ERROR_CODE or POSTFIX_ERROR_CODE (see the
enumeration in DefaultMessageCodesResolver.Format).
Static Content
By default Spring Boot will serve static content from a directory called /static (or /public or /
resources or /META-INF/resources) in the classpath or from the root of the ServletContext.
It uses the ResourceHttpRequestHandler from Spring MVC so you can modify that behavior by
adding your own WebMvcConfigurerAdapter and overriding the addResourceHandlers method.
In a stand-alone web application the default servlet from the container is also enabled, and acts as a
fallback, serving content from the root of the ServletContext if Spring decides not to handle it. Most
of the time this will not happen (unless you modify the default MVC configuration) because Spring will
always be able to handle requests through the DispatcherServlet.
You can customize the static resource locations using spring.resources.staticLocations
(replacing the default values with a list of directory locations). If you do this the default welcome page
detection will switch to your custom locations, so if there is an index.html in any of your locations on
startup, it will be the home page of the application.
In addition to the standard static resource locations above, a special case is made for Webjars content.
Any resources with a path in /webjars/** will be served from jar files if they are packaged in the
Webjars format.
Tip
Do not use the src/main/webapp directory if your application will be packaged as a jar. Although
this directory is a common standard, it will only work with war packaging and it will be silently
ignored by most build tools if you generate a jar.
1.4.3.RELEASE
Spring Boot
81
Spring Boot also supports 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, simply add the webjars-locator dependency. Then
declare your Webjar, taking jQuery for example, as "/webjars/jquery/dist/jquery.min.js"
which 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, youll need to declare the webjars-locator-jboss-vfs dependency
instead of the webjars-locator; otherwise all Webjars resolve as a 404.
To use cache busting, the following configuration will configure a cache busting solution for all
static resources, effectively adding a content hash in URLs, such as <link href="/css/
spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>:
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
Note
Links to resources are rewritten at runtime in template, thanks to a
ResourceUrlEncodingFilter, auto-configured for Thymeleaf, Velocity and FreeMarker. You
should manually declare this filter when using JSPs. Other template engines arent automatically
supported right now, but can be with custom template macros/helpers and the use of the
ResourceUrlProvider.
When loading resources dynamically with, for example, a JavaScript module loader, renaming files is
not an option. Thats why other strategies are also supported and can be combined. A "fixed" strategy
will add a static version string in the URL, without changing the file name:
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/" will use a fixed versioning
strategy "/v12/js/lib/mymodule.js" while other resources will 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 blog post and in Spring Frameworks
reference documentation.
ConfigurableWebBindingInitializer
Spring MVC uses a WebBindingInitializer to initialize a WebDataBinder for a particular
request. If you create your own ConfigurableWebBindingInitializer @Bean, Spring Boot will
automatically configure Spring MVC to use it.
1.4.3.RELEASE
Spring Boot
82
Template engines
As well as REST web services, you can also use Spring MVC to serve dynamic HTML content. Spring
MVC supports a variety of templating technologies including Velocity, FreeMarker and JSPs. Many other
templating engines also ship their own Spring MVC integrations.
Spring Boot includes auto-configuration support for the following templating engines:
FreeMarker
Groovy
Thymeleaf
Velocity (deprecated in 1.4)
Mustache
Tip
JSPs should be avoided if possible, there are several known limitations when using them with
embedded servlet containers.
When youre using one of these templating engines with the default configuration, your templates will
be picked up automatically from src/main/resources/templates.
Tip
IntelliJ IDEA orders the classpath differently depending on how you run your application. Running
your application in the IDE via its main method will result in a different ordering to when you
run your application using Maven or Gradle or from its packaged jar. This can cause Spring
Boot to fail to find the templates on the classpath. If youre affected by this problem you can
reorder the classpath in the IDE to place the modules classes and resources first. Alternatively,
you can configure the template prefix to search every templates directory on the classpath:
classpath*:/templates/.
Error Handling
Spring Boot provides an /error mapping by default that handles all errors in a sensible way, and
it is registered as a global error page in the servlet container. 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 view that renders the same data in HTML format (to customize
it just add a View that resolves to error). To replace the default behaviour completely you can
implement ErrorController and register a bean definition of that type, or simply add a bean of type
ErrorAttributes to use the existing mechanism but replace the contents.
Tip
The BasicErrorController can be used as a base class for a custom ErrorController.
This is particularly useful if you want to add a handler for a new content type (the default is
to handle text/html specifically and provide a fallback for everything else). To do that just
extend BasicErrorController and add a public method with a @RequestMapping that has
a produces attribute, and create a bean of your new type.
1.4.3.RELEASE
Spring Boot
83
You can also define a @ControllerAdvice to customize the JSON document to return for a particular
controller and/or exception type.
@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);
}
}
In the example above, if YourException is thrown by a controller defined in the same package as
FooController, a json representation of the CustomerErrorType POJO will be used instead of the
ErrorAttributes representation.
Custom error pages
If you want to display a custom HTML error page for a given status code, you add a file to an /error
folder. Error pages can either be static HTML (i.e. added under any of the static resource folders) or
built using templates. The name of the file should be the exact status code or a series mask.
For example, to map 404 to a static HTML file, your folder structure would look like this:
src/
+- main/
+- java/
|
+ <source code>
+- resources/
+- public/
+- error/
|
+- 404.html
+- <other public assets>
To map all 5xx errors using a FreeMarker template, youd have a structure like this:
src/
+- main/
+- java/
|
+ <source code>
+- resources/
+- templates/
+- error/
|
+- 5xx.ftl
+- <other templates>
For more complex mappings you can also add beans that implement the ErrorViewResolver
interface.
public class MyErrorViewResolver implements ErrorViewResolver {
@Override
public ModelAndView resolveErrorView(HttpServletRequest request,
1.4.3.RELEASE
Spring Boot
84
You can also use regular Spring MVC features like @ExceptionHandler methods and
@ControllerAdvice. The ErrorController will then pick up any unhandled exceptions.
Mapping error pages outside of Spring MVC
For applications that arent using Spring MVC, you can use the ErrorPageRegistrar interface to
directly register ErrorPages. This abstraction works directly with the underlying embedded servlet
container and will work even if you dont have a Spring MVC DispatcherServlet.
@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"));
}
}
N.B. if you register an ErrorPage with a path that will end up being handled by a Filter (e.g. as is
common with some non-Spring web frameworks, like Jersey and Wicket), then the Filter has to be
explicitly registered as an ERROR dispatcher, e.g.
@Bean
public FilterRegistrationBean myFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new MyFilter());
...
registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
return registration;
}
(the default FilterRegistrationBean does not include the ERROR dispatcher type).
Error Handling on WebSphere Application Server
When deployed to a servlet container, a Spring Boot uses its error page filter to forward a request with an
error status to the appropriate error page. The request can only be forwarded to the correct error page if
the response has not already been committed. By default, WebSphere Application Server 8.0 and later
commits the response upon successful completion of a servlets service method. You should disable
this behaviour by setting com.ibm.ws.webcontainer.invokeFlushAfterService to false
Spring HATEOAS
If youre developing a RESTful API that makes use of hypermedia, Spring Boot provides autoconfiguration for Spring HATEOAS that works well with most applications. The auto-configuration
replaces the need to use @EnableHypermediaSupport and registers a number of beans to ease
1.4.3.RELEASE
Spring Boot
85
CORS support
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 like IFRAME or JSONP.
As of version 4.2, Spring MVC supports CORS out of the box. 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:
@Configuration
public class MyConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**");
}
};
}
}
Warning
Jerseys support for scanning executable archives is rather limited. For example, it cannot scan
for endpoints in a package found in WEB-INF/classes when running an executable war file. To
1.4.3.RELEASE
Spring Boot
86
avoid this limitation, the packages method should not be used and endpoints should be registered
individually using the register method as shown above.
You can also register an arbitrary number of beans implementing ResourceConfigCustomizer for
more advanced customizations.
All the registered endpoints should be @Components with HTTP resource annotations (@GET etc.), e.g.
@Component
@Path("/hello")
public class Endpoint {
@GET
public String message() {
return "Hello";
}
}
Since the Endpoint is a Spring @Component its lifecycle is managed by Spring and you can
@Autowired dependencies and inject external configuration with @Value. The Jersey servlet will be
registered and mapped to /* by default. You can change the mapping by adding @ApplicationPath
to your ResourceConfig.
By default Jersey will be set up as a Servlet in a @Bean of type ServletRegistrationBean
named jerseyServletRegistration. By default, the servlet will be initialized lazily but you
can customize it with spring.jersey.servlet.load-on-startup .You can disable or override
that bean by creating one of your own with the same name. You can also use a Filter instead
of a Servlet by setting spring.jersey.type=filter (in which case the @Bean to replace or
override is jerseyFilterRegistration). The servlet has an @Order which you can set with
spring.jersey.filter.order. Both the Servlet and the Filter registrations can be given init
parameters using spring.jersey.init.* to specify a map of properties.
There is a Jersey sample so you can see how to set things up. There is also a Jersey 1.x sample.
Note that in the Jersey 1.x sample that the spring-boot maven plugin has been configured to unpack
some Jersey jars so they can be scanned by the JAX-RS implementation (because the sample asks
for them to be scanned in its Filter registration). You may need to do the same if any of your JAXRS resources are packaged as nested jars.
1.4.3.RELEASE
Spring Boot
87
By default, if the context contains only a single Servlet it will be mapped to /. In the case of multiple
Servlet beans the bean name will be used as a path prefix. Filters will map to /*.
If convention-based mapping is not flexible enough you can use the ServletRegistrationBean,
FilterRegistrationBean and ServletListenerRegistrationBean classes for complete
control.
The EmbeddedWebApplicationContext
Under the hood Spring Boot uses a new type of ApplicationContext for embedded servlet container
support. The EmbeddedWebApplicationContext is a special type of WebApplicationContext
that bootstraps itself by searching for a single EmbeddedServletContainerFactory bean. Usually a
TomcatEmbeddedServletContainerFactory, JettyEmbeddedServletContainerFactory,
or UndertowEmbeddedServletContainerFactory will have been auto-configured.
Note
You usually wont need to be aware of these implementation classes. Most
applications will be auto-configured and the appropriate ApplicationContext and
EmbeddedServletContainerFactory will be created on your behalf.
1.4.3.RELEASE
Spring Boot
88
Network settings: listen port for incoming HTTP requests (server.port), interface address to bind
to server.address, etc.
Session settings: whether the session is persistent (server.session.persistence), session
timeout (server.session.timeout), location of session data (server.session.store-dir)
and session-cookie configuration (server.session.cookie.*).
Error management: location of the error page (server.error.path), etc.
SSL
HTTP compression
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 ServerProperties class for a complete list.
Programmatic customization
If you need to configure your embedded servlet container programmatically you can
register a Spring bean that implements the EmbeddedServletContainerCustomizer
interface.
EmbeddedServletContainerCustomizer
provides
access
to
the
ConfigurableEmbeddedServletContainer which includes numerous customization setter
methods.
import org.springframework.boot.context.embedded.*;
import org.springframework.stereotype.Component;
@Component
public class CustomizationBean implements EmbeddedServletContainerCustomizer {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.setPort(9000);
}
}
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.
1.4.3.RELEASE
Spring Boot
89
JSP limitations
When running a Spring Boot application that uses an embedded servlet container (and is packaged as
an executable archive), there are some limitations in the JSP support.
With Tomcat it should work if you use war packaging, i.e. an executable war will work, and will also
be deployable to a standard container (not limited to, but including Tomcat). An executable jar will not
work because of a hard coded file pattern in Tomcat.
With Jetty it should work if you use war packaging, i.e. an executable war will work, and will also be
deployable to any standard container.
Undertow does not support JSPs.
Creating a custom error.jsp page wont override the default view for error handling, custom error
pages should be used instead.
There is a JSP sample so you can see how to set things up.
1.4.3.RELEASE
Spring Boot
90
28. Security
If Spring Security is on the classpath then web applications will be secure by default with basic
authentication on all HTTP endpoints. 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 (user username and random password,
printed at INFO level when the application starts up)
Using default security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35
Note
If
you
fine-tune
your
logging
configuration,
ensure
that
the
org.springframework.boot.autoconfigure.security category is set to log INFO
messages, otherwise the default password will not be printed.
You can change the password by providing a security.user.password. This and other useful
properties are externalized via SecurityProperties (properties prefix "security").
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 with @EnableWebSecurity (this does not disable the
authentication manager configuration or Actuators security). To customize it you normally use
external properties and beans of type WebSecurityConfigurerAdapter (e.g. to add form-based
login). To also switch off the authentication manager configuration you can add a bean of type
AuthenticationManager, or else configure the global AuthenticationManager by autowiring an
AuthenticationManagerBuilder into a method in one of your @Configuration classes. There
are several secure applications in the Spring Boot samples to get you started with common use cases.
The basic features you get out of the box in a web application are:
An AuthenticationManager bean with in-memory store
SecurityProperties.User for the properties of the user).
and
single
user
(see
Ignored (insecure) paths for common static resource locations (/css/**, /js/**, /images/**, /
webjars/** and **/favicon.ico).
HTTP Basic security for all other endpoints.
Security events published to Springs ApplicationEventPublisher
unsuccessful authentication and access denied).
(successful
and
Common low-level features (HSTS, XSS, CSRF, caching) provided by Spring Security are on by
default.
All of the above can be switched on and off or modified using external
properties (security.*). To override the access rules without changing any other
auto-configured features add a @Bean of type WebSecurityConfigurerAdapter with
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) and configure it to meet your needs.
1.4.3.RELEASE
Spring Boot
91
Note
By default, a WebSecurityConfigurerAdapter will match any path. If you dont want to
completely override Spring Boots auto-configured access rules, your adapter must explicitly
configure the paths that you do want to override.
28.1 OAuth2
If you have spring-security-oauth2 on your classpath you can take advantage of some autoconfiguration to make it easy to set up Authorization or Resource Server. For full details, see the Spring
Security OAuth 2 Developers Guide.
Authorization Server
To create an Authorization Server and grant access tokens you need to use
@EnableAuthorizationServer and provide security.oauth2.client.client-id and
security.oauth2.client.client-secret] properties. The client will be registered for you in an
in-memory repository.
Having done that you will be able to use the client credentials to create an access token, for example:
$ curl client:secret@localhost:8080/oauth/token -d grant_type=password -d username=user -d password=pwd
The basic auth credentials for the /token endpoint are the client-id and client-secret. The
user credentials are the normal Spring Security user details (which default in Spring Boot to user and
a random password).
To switch off the auto-configuration and configure the Authorization Server features yourself just add a
@Bean of type AuthorizationServerConfigurer.
Resource Server
To use the access token you need a Resource Server (which can be the same as the Authorization
Server). Creating a Resource Server is easy, just add @EnableResourceServer and provide some
configuration to allow the server to decode access tokens. If your application is also an Authorization
Server it already knows how to decode tokens, so there is nothing else to do. If your app is a standalone
service then you need to give it some more configuration, one of the following options:
security.oauth2.resource.user-info-uri to use the /me resource (e.g. https://
uaa.run.pivotal.io/userinfo on PWS)
security.oauth2.resource.token-info-uri to use the token decoding endpoint (e.g.
https://uaa.run.pivotal.io/check_token on PWS).
If you specify both the user-info-uri and the token-info-uri then you can set a flag to say that
one is preferred over the other (prefer-token-info=true is the default).
Alternatively (instead of user-info-uri or token-info-uri) if the tokens are JWTs you can
configure a security.oauth2.resource.jwt.key-value to decode them locally (where the key
is a verification key). The verification key value is either a symmetric secret or PEM-encoded RSA public
key. If you dont have the key and its public you can provide a URI where it can be downloaded (as a
JSON object with a value field) with security.oauth2.resource.jwt.key-uri. E.g. on PWS:
$ curl https://uaa.run.pivotal.io/token_key
{"alg":"SHA256withRSA","value":"-----BEGIN PUBLIC KEY-----\nMIIBI...\n-----END PUBLIC KEY-----\n"}
1.4.3.RELEASE
Spring Boot
92
Warning
If you use the security.oauth2.resource.jwt.key-uri the authorization server needs to
be running when your application starts up. It will log a warning if it cant find the key, and tell
you what to do to fix it.
Client
To make your web-app into an OAuth2 client you can simply add @EnableOAuth2Client and
Spring Boot will create a OAuth2ClientContext and OAuth2ProtectedResourceDetails that
are necessary to create an OAuth2RestOperations. Spring Boot does not automatically create such
bean but you can easily create your own:
@Bean
public OAuth2RestTemplate oauth2RestTemplate(OAuth2ClientContext oauth2ClientContext,
OAuth2ProtectedResourceDetails details) {
return new OAuth2RestTemplate(details, oauth2ClientContext);
}
Note
You may want to add a qualifier and review your configuration as more than one RestTemplate
may be defined in your application.
1.4.3.RELEASE
Spring Boot
93
This configuration uses security.oauth2.client.* as credentials (the same as you might be using
in the Authorization Server), but in addition it will need to know the authorization and token URIs in the
Authorization Server. For example:
application.yml.
security:
oauth2:
client:
clientId: bd1c0a783ccdd1c9b9e4
clientSecret: 1a9030fbca47a5b2c28e92f19050bb77824b5ad1
accessTokenUri: https://github.com/login/oauth/access_token
userAuthorizationUri: https://github.com/login/oauth/authorize
clientAuthenticationScheme: form
An application with this configuration will redirect to Github for authorization when you attempt to use
the OAuth2RestTemplate. If you are already signed into Github you wont even notice that it has
authenticated. These specific credentials will only work if your application is running on port 8080
(register your own client app in Github or other provider for more flexibility).
To limit the scope that the client asks for when it obtains an access token you can set
security.oauth2.client.scope (comma separated or an array in YAML). By default the scope
is empty and it is up to Authorization Server to decide what the defaults should be, usually depending
on the settings in the client registration that it holds.
Note
There is also a setting for security.oauth2.client.client-authentication-scheme
which defaults to header (but you might need to set it to form if, like Github for instance, your
OAuth2 provider doesnt like header authentication). In fact, the security.oauth2.client.*
properties are bound to an instance of AuthorizationCodeResourceDetails so all its
properties can be specified.
Tip
In a non-web application you can still create an OAuth2RestOperations and it is still wired
into the security.oauth2.client.* configuration. In this case it is a client credentials token
grant you will be asking for if you use it (and there is no need to use @EnableOAuth2Client
or @EnableOAuth2Sso). To prevent that infrastructure to be defined, just remove the
security.oauth2.client.client-id from your configuration (or make it the empty string).
Single Sign On
An OAuth2 Client can be used to fetch user details from the provider (if such features are available)
and then convert them into an Authentication token for Spring Security. The Resource Server
above support this via the user-info-uri property This is the basis for a Single Sign On (SSO)
protocol based on OAuth2, and Spring Boot makes it easy to participate by providing an annotation
@EnableOAuth2Sso. The Github client above can protect all its resources and authenticate using the
Github /user/ endpoint, by adding that annotation and declaring where to find the endpoint (in addition
to the security.oauth2.client.* configuration already listed above):
application.yml.
security:
oauth2:
1.4.3.RELEASE
Spring Boot
94
...
resource:
userInfoUri: https://api.github.com/user
preferTokenInfo: false
Since all paths are secure by default, there is no home page that you can show to
unauthenticated users and invite them to login (by visiting the /login path, or the path specified by
security.oauth2.sso.login-path).
To customize the access rules or paths to protect, so you can add a home page for instance,
@EnableOAuth2Sso can be added to a WebSecurityConfigurerAdapter and the annotation will
cause it to be decorated and enhanced with the necessary pieces to get the /login path working. For
example, here we simply allow unauthenticated access to the home page at "/" and keep the default
for everything else:
@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void init(WebSecurity web) {
web.ignore("/");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("/**").authorizeRequests().anyRequest().authenticated();
}
}
1.4.3.RELEASE
Spring Boot
95
1.4.3.RELEASE
Spring Boot
96
Note
You need a dependency on spring-jdbc for an embedded database to be auto-configured. In
this example its pulled in transitively via spring-boot-starter-data-jpa.
Tip
If, for whatever reason, you do configure the connection URL for an embedded database, care
should be taken to ensure that the databases automatic shutdown is disabled. If youre using
H2 you should use DB_CLOSE_ON_EXIT=FALSE to do so. If youre using HSQLDB, you should
ensure that shutdown=true is not used. Disabling the databases automatic shutdown allows
Spring Boot to control when the database is closed, thereby ensuring that it happens once access
to the database is no longer needed.
Note
You should at least specify the url using the spring.datasource.url property or Spring Boot
will attempt to auto-configure an embedded database.
1.4.3.RELEASE
Spring Boot
97
Tip
You often wont need to specify the driver-class-name since Spring boot can deduce it for
most databases from the url.
Note
For a pooling DataSource to be created we need to be able to verify that a valid
Driver class is available, so we check for that before doing anything. I.e. if you set
spring.datasource.driver-class-name=com.mysql.jdbc.Driver then that class has
to be loadable.
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.tomcat.*,
spring.datasource.hikari.*,
spring.datasource.dbcp.* and spring.datasource.dbcp2.*). Refer to the documentation
of the connection pool implementation you are using for more details.
For instance, if you are using 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
1.4.3.RELEASE
Spring Boot
98
@Autowired
public MyBean(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
// ...
}
Entity Classes
Traditionally, JPA Entity classes are specified in a persistence.xml file. With Spring Boot
this file is not necessary and instead Entity Scanning is used. By default all packages
below your main configuration class (the one annotated with @EnableAutoConfiguration or
@SpringBootApplication) will be searched.
Any classes annotated with @Entity, @Embeddable or @MappedSuperclass will be considered. A
typical entity class would look something like this:
package com.example.myapp.domain;
import java.io.Serializable;
import javax.persistence.*;
@Entity
public class City implements Serializable {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String state;
1.4.3.RELEASE
Spring Boot
99
Tip
You can customize entity scanning locations using the @EntityScan annotation. See the
Section 74.4, Separate @Entity definitions from Spring configuration how-to.
Tip
We have barely scratched the surface of Spring Data JPA. For complete details check their
reference documentation.
1.4.3.RELEASE
Spring Boot
100
Note
Hibernates own internal property name for this (if you happen to remember it better) is
hibernate.hbm2ddl.auto. You can set it, along with other Hibernate native properties, using
spring.jpa.properties.* (the prefix is stripped before adding them to the entity manager).
Example:
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
1.4.3.RELEASE
Spring Boot
101
security.basic.enabled
Code Generation
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 are using the jooq-codegen-maven
plugin (and you also use the spring-boot-starter-parent parent POM) you can safely omit the
plugins <version> tag. You can also use Spring Boot defined version variables (e.g. h2.version)
to declare the plugins database dependency. Heres 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>
<jdbc>
<driver>org.h2.Driver</driver>
<url>jdbc:h2:~/yourdatabase</url>
</jdbc>
<generator>
...
</generator>
</configuration>
</plugin>
Using DSLContext
The fluent API offered by jOOQ is initiated via the org.jooq.DSLContext interface. Spring Boot will
auto-configure a DSLContext as a Spring Bean and connect it to your application DataSource. To
use the DSLContext you can just @Autowire it:
@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 create to hold the DSLContext, weve done
the same for this example.
1.4.3.RELEASE
Spring Boot
102
Customizing jOOQ
You can customize the SQL dialect used by jOOQ by setting spring.jooq.sql-dialect in your
application.properties. For example, to specify Postgres you would add:
spring.jooq.sql-dialect=Postgres
More advanced customizations can be achieved by defining your own @Bean definitions which will be
used when the jOOQ Configuration is created. You can define beans for the following jOOQ Types:
ConnectionProvider
TransactionProvider
RecordMapperProvider
RecordListenerProvider
ExecuteListenerProvider
VisitListenerProvider
You can also create your own org.jooq.Configuration @Bean if you want to take complete control
of the jOOQ configuration.
1.4.3.RELEASE
Spring Boot
103
30.1 Redis
Redis is a cache, message broker and richly-featured key-value store. Spring Boot offers basic autoconfiguration for the Jedis client library and abstractions on top of it provided by Spring Data Redis. There
is a spring-boot-starter-data-redis Starter for collecting the dependencies in a convenient
way.
Connecting to Redis
You can inject an auto-configured RedisConnectionFactory, StringRedisTemplate or vanilla
RedisTemplate instance as you would any other Spring Bean. By default the instance will attempt to
connect to a Redis server using localhost:6379:
@Component
public class MyBean {
private StringRedisTemplate template;
@Autowired
public MyBean(StringRedisTemplate template) {
this.template = template;
}
// ...
}
If you add a @Bean of your own of any of the auto-configured types it will replace the default (except in
the case of RedisTemplate the exclusion is based on the bean name redisTemplate not its type). If
commons-pool2 is on the classpath you will get a pooled connection factory by default.
30.2 MongoDB
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 Starter.
1.4.3.RELEASE
Spring Boot
104
You can set spring.data.mongodb.uri property to change the URL and configure additional
settings such as the replica set:
spring.data.mongodb.uri=mongodb://user:[email protected]:12345,mongo2.example.com:23456/test
Alternatively, as long as youre using Mongo 2.x, specify a host/port. For example, you might declare
the following in your application.properties:
spring.data.mongodb.host=mongoserver
spring.data.mongodb.port=27017
Note
spring.data.mongodb.host and spring.data.mongodb.port are not supported if youre
using the Mongo 3.0 Java driver. In such cases, spring.data.mongodb.uri should be used
to provide all of the configuration.
Tip
If spring.data.mongodb.port is not specified the default of 27017 is used. You could simply
delete this line from the sample above.
Tip
If you arent using Spring Data Mongo you can inject com.mongodb.Mongo beans instead of
using MongoDbFactory.
You can also declare your own MongoDbFactory or Mongo bean if you want to take complete control
of establishing the MongoDB connection.
MongoTemplate
Spring Data Mongo provides a MongoTemplate class that is very similar in its design to Springs
JdbcTemplate. As with JdbcTemplate Spring Boot auto-configures a bean for you to simply inject:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;
@Component
public class MyBean {
1.4.3.RELEASE
Spring Boot
105
Tip
For complete details of Spring Data MongoDB, including its rich object mapping technologies,
refer to their reference documentation.
Embedded Mongo
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 will listen on can be configured using the spring.data.mongodb.port
property. To use a randomly allocated free port use a value of zero. The MongoClient created by
MongoAutoConfiguration will be automatically configured to use the randomly allocated port.
If you have SLF4J on the classpath, output produced by Mongo will be 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
instances configuration and logging routing.
30.3 Neo4j
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
1.4.3.RELEASE
Spring Boot
106
approaches. Spring Boot offers several conveniences for working with Neo4j, including the springboot-starter-data-neo4j Starter.
Neo4jSession
By default, the lifetime of the session is scope to the application. If you are running a web application
you can change it to scope or request easily:
spring.data.neo4j.session.scope=session
1.4.3.RELEASE
Spring Boot
107
Tip
You can customize entity scanning locations using the @EntityScan annotation.
To enable repository support (and optionally support for @Transactional), add the following two
annotations to your Spring configuration:
@EnableNeo4jRepositories(basePackages = "com.example.myapp.repository")
@EnableTransactionManagement
Repository example
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 their reference documentation.
30.4 Gemfire
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).
30.5 Solr
Apache Solr is a search engine. Spring Boot offers basic auto-configuration for the Solr 5 client library
and abstractions on top of it provided by Spring Data Solr. There is a spring-boot-starter-datasolr Starter for collecting the dependencies in a convenient way.
Connecting to Solr
You can inject an auto-configured SolrClient instance as you would any other Spring bean. By default
the instance will attempt to connect to a server using localhost:8983/solr:
@Component
public class MyBean {
private SolrClient solr;
@Autowired
public MyBean(SolrClient solr) {
this.solr = solr;
}
1.4.3.RELEASE
Spring Boot
108
// ...
}
If you add a @Bean of your own of type SolrClient it will replace the default.
30.6 Elasticsearch
Elasticsearch is an open source, distributed, real-time search and analytics engine. Spring Boot offers
basic auto-configuration for the Elasticsearch and 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.
@Component
public class MyBean {
1.4.3.RELEASE
Spring Boot
109
If you add a @Bean of your own of type ElasticsearchTemplate it will replace the default.
30.7 Cassandra
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 abstractions on top of it provided by Spring Data Cassandra. There is a spring-boot-starterdata-cassandra Starter for collecting the dependencies in a convenient way.
Connecting to Cassandra
You can inject an auto-configured CassandraTemplate or a Cassandra Session instance as
you would with any other Spring Bean. The spring.data.cassandra.* properties can be used
to customize the connection. Generally you will provide keyspace-name and contact-points
properties:
spring.data.cassandra.keyspace-name=mykeyspace
spring.data.cassandra.contact-points=cassandrahost1,cassandrahost2
@Component
public class MyBean {
private CassandraTemplate template;
@Autowired
public MyBean(CassandraTemplate template) {
this.template = template;
}
// ...
}
If you add a @Bean of your own of type CassandraTemplate it will replace the default.
1.4.3.RELEASE
Spring Boot
110
30.8 Couchbase
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
abstractions on top of it provided by Spring Data Couchbase. There is a spring-boot-starterdata-couchbase Starter for collecting the dependencies in a convenient way.
Connecting to Couchbase
You can very easily get a Bucket and Cluster by adding the Couchbase SDK and some configuration.
The spring.couchbase.* properties can be used to customize the connection. Generally you will
provide the bootstrap hosts, bucket name and password:
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 default and the password is the empty String. Alternatively, you can define your
own org.springframework.data.couchbase.config.CouchbaseConfigurer @Bean
to take control over the whole configuration.
It is also possible to customize some of the CouchbaseEnvironment settings. For instance the
following configuration changes the timeout to use to open a new Bucket and enables SSL support:
spring.couchbase.env.timeouts.connect=3000
spring.couchbase.env.ssl.key-store=/location/of/keystore.jks
spring.couchbase.env.ssl.key-store-password=secret
1.4.3.RELEASE
Spring Boot
111
@Component
public class MyBean {
private final CouchbaseTemplate template;
@Autowired
public MyBean(CouchbaseTemplate template) {
this.template = template;
}
// ...
}
If you add a @Bean of your own of type CouchbaseTemplate named couchbaseTemplate it will
replace the default.
1.4.3.RELEASE
Spring Boot
112
31. Caching
The Spring Framework provides support for transparently adding caching to an application. At its core,
the abstraction applies caching to methods, reducing thus the number of executions based on the
information available in the cache. The caching logic is applied transparently, without any interference
to the invoker.
Note
Check the relevant section of the Spring Framework reference for more details.
In a nutshell, adding caching to an operation of your service is as easy as adding the relevant annotation
to its method:
import javax.cache.annotation.CacheResult;
import org.springframework.stereotype.Component;
@Component
public class MathService {
@CacheResult
public int computePiDecimal(int i) {
// ...
}
}
Note
You can either use the standard JSR-107 (JCache) annotations or Springs own caching
annotations transparently. We strongly advise you however to not mix and match them.
Tip
It is also possible to update or evict data from the cache transparently.
1.4.3.RELEASE
Spring Boot
113
Note
In the example above, a ConcurrentMapCacheManager is expected to be configured. If that is
not the case, the customizer wont be invoked at all. You can have as many customizers as you
want and you can also order them as usual using @Order or Ordered.
Generic
Generic caching is used if the context defines at least one org.springframework.cache.Cache
bean, a CacheManager wrapping them is configured.
JCache (JSR-107)
JCache is bootstrapped via the presence of a javax.cache.spi.CachingProvider on the
classpath (i.e. a JSR-107 compliant caching library) and the JCacheCacheManager provided by the
spring-boot-starter-cache Starter. There are various compliant libraries out there and Spring
1.4.3.RELEASE
Spring Boot
114
Boot provides dependency management for Ehcache 3, Hazelcast and Infinispan. Any other compliant
library can be added as well.
It might happen that more than one provider is present, in which case the provider must be explicitly
specified. Even if the JSR-107 standard does not enforce a standardized way to define the location of
the configuration file, Spring Boot does its best to accommodate with implementation details.
# Only necessary if more than one provider is present
spring.cache.jcache.provider=com.acme.MyCachingProvider
spring.cache.jcache.config=classpath:acme.xml
Note
Since a cache library may offer both a native implementation and JSR-107 support Spring Boot
will prefer the JSR-107 support so that the same features are available if you switch to a different
JSR-107 implementation.
There are several ways to customize the underlying javax.cache.cacheManager:
Caches can be created on startup via the 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 javax.cache.CacheManager bean is defined, it is wrapped automatically in a
org.springframework.cache.CacheManager implementation that the abstraction expects.
No further customization is applied on it.
EhCache 2.x
EhCache 2.x is used if a file named ehcache.xml can be found at the root of the classpath. If EhCache
2.x, the EhCacheCacheManager provided by the spring-boot-starter-cache Starter and such
file is present it is used to bootstrap the cache manager. An alternate configuration file can be provide
a well using:
spring.cache.ehcache.config=classpath:config/another-config.xml
Hazelcast
Spring Boot has a general support for Hazelcast. If a HazelcastInstance has been auto-configured,
it is automatically wrapped in a CacheManager.
If for some reason you need a different HazelcastInstance for caching, you can request Spring Boot
to create a separate one that will be only used by the CacheManager:
spring.cache.hazelcast.config=classpath:config/my-cache-hazelcast.xml
Tip
If a separate HazelcastInstance is created that way, it is not registered in the application
context.
1.4.3.RELEASE
Spring Boot
115
Infinispan
Infinispan has no default configuration file location so it must be specified explicitly (or the default
bootstrap is used).
spring.cache.infinispan.config=infinispan.xml
Couchbase
If the Couchbase java client and the couchbase-spring-cache implementation are available and
Couchbase is configured, a CouchbaseCacheManager will be auto-configured. It is also possible
to create additional caches on startup using the spring.cache.cache-names property. These will
operate on the Bucket that was auto-configured. You can also create additional caches on another
Bucket using the customizer: assume you need two caches on the "main" Bucket (foo and bar) and
one biz cache with a custom time to live of 2sec on the another Bucket. First, you can create the
two first caches simply via configuration:
spring.cache.cache-names=foo,bar
Then define this extra @Configuration to configure the extra Bucket and the biz cache:
@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("biz", CacheBuilder.newInstance(anotherBucket())
.withExpirationInMillis(2000));
};
}
}
This sample configuration reuses the Cluster that was created via auto-configuration.
Redis
If Redis is available and configured, the RedisCacheManager is auto-configured. It is also possible to
create additional caches on startup using the spring.cache.cache-names property.
Note
By default, a key prefix is added to prevent that if two separate caches use the same key, Redis
would have overlapping keys and be likely to return invalid values. We strongly recommend to
keep this setting enabled if you create your own RedisCacheManager.
1.4.3.RELEASE
Spring Boot
116
Caffeine
Caffeine is a Java 8 rewrite of Guavas cache and will supersede the Guava support in Spring Boot 2.0.
If Caffeine is present, a CaffeineCacheManager (provided by the spring-boot-starter-cache
Starter) is auto-configured. Caches can be created on startup using the spring.cache.cachenames property and customized by one of the following (in this order):
1. A cache spec defined by spring.cache.caffeine.spec
2. A com.github.benmanes.caffeine.cache.CaffeineSpec bean is defined
3. A com.github.benmanes.caffeine.cache.Caffeine bean is defined
For instance, the following configuration creates a foo and bar caches with a maximum size of 500
and a time to live of 10 minutes
spring.cache.cache-names=foo,bar
spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s
Guava
If Guava is present, a GuavaCacheManager is auto-configured. Caches can be created on startup
using the spring.cache.cache-names property and customized by one of the following (in this
order):
1. A cache spec defined by spring.cache.guava.spec
2. A com.google.common.cache.CacheBuilderSpec bean is defined
3. A com.google.common.cache.CacheBuilder bean is defined
For instance, the following configuration creates a foo and bar caches with a maximum size of 500
and a time to live of 10 minutes
spring.cache.cache-names=foo,bar
spring.cache.guava.spec=maximumSize=500,expireAfterAccess=600s
Simple
If none of these options worked out, a simple implementation using ConcurrentHashMap as cache
store is configured. This is the default if no caching library is present in your application.
None
When @EnableCaching is present in your configuration, a suitable cache configuration is expected as
well. If you need to disable caching altogether in certain environments, force the cache type to none
to use a no-op implementation:
1.4.3.RELEASE
Spring Boot
117
spring.cache.type=none
1.4.3.RELEASE
Spring Boot
118
32. Messaging
The Spring Framework provides extensive support for integrating with messaging systems: from
simplified use of the JMS API using JmsTemplate to a complete infrastructure to receive messages
asynchronously. Spring AMQP provides a similar feature set for the Advanced Message Queuing
Protocol and Spring Boot also provides auto-configuration options for RabbitTemplate and
RabbitMQ. There is also support for STOMP messaging natively in Spring WebSocket and Spring Boot
has support for that through starters and a small amount of auto-configuration.
32.1 JMS
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 wont need to use it directly yourself and you 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.
ActiveMQ support
Spring Boot can also configure a ConnectionFactory when it detects that ActiveMQ is available on
the classpath. If the broker is present, an embedded broker is started and configured automatically (as
long as no broker URL is specified through configuration).
Note
If you are using spring-boot-starter-activemq the necessary dependencies to connect
or embed an ActiveMQ instance are provided, as well as the Spring infrastructure to integrate
with JMS.
ActiveMQ configuration is controlled by external configuration properties in spring.activemq.*. For
example, you might declare the following section in application.properties:
spring.activemq.broker-url=tcp://192.168.1.210:9876
spring.activemq.user=admin
spring.activemq.password=secret
Artemis support
Apache Artemis was formed in 2015 when HornetQ was donated to the Apache Foundation. Make sure
to use that rather than the deprecated HornetQ support.
Note
You should not try and use Artemis and HornetQ at the same time.
Spring Boot can auto-configure a ConnectionFactory when it detects that Artemis is available on
the classpath. If the broker is present, an embedded broker is started and configured automatically
1.4.3.RELEASE
Spring Boot
119
(unless the mode property has been explicitly set). The supported modes are: embedded (to make
explicit that an embedded broker is required and should lead to an error if the broker is not available in
the classpath), and native to connect to a broker using the netty transport protocol. When the latter
is configured, Spring Boot configures a ConnectionFactory connecting to a broker running on the
local machine with the default settings.
Note
If you are using spring-boot-starter-artemis the necessary dependencies to connect to
an existing Artemis instance are provided, as well as the Spring infrastructure to integrate with
JMS. Adding org.apache.activemq:artemis-jms-server to your application allows you
to use the embedded mode.
Artemis configuration is controlled by external configuration properties in spring.artemis.*. For
example, you might declare the following section in application.properties:
spring.artemis.mode=native
spring.artemis.host=192.168.1.210
spring.artemis.port=9876
spring.artemis.user=admin
spring.artemis.password=secret
When embedding the broker, you can choose if you want to enable persistence, and
the list of destinations that should be made available. These can be specified as a
comma-separated list to create them with the default options; or you can define bean(s)
of type org.apache.activemq.artemis.jms.server.config.JMSQueueConfiguration or
org.apache.activemq.artemis.jms.server.config.TopicConfiguration, for advanced
queue and topic configurations respectively.
See ArtemisProperties for more of the supported options.
No JNDI lookup is involved at all and destinations are resolved against their names, either using the
name attribute in the Artemis configuration or the names provided through configuration.
HornetQ support
Note
HornetQ is deprecated in 1.4, consider migrating to artemis
Spring Boot can auto-configure a ConnectionFactory when it detects that HornetQ is available on
the classpath. If the broker is present, an embedded broker is started and configured automatically
(unless the mode property has been explicitly set). The supported modes are: embedded (to make
explicit that an embedded broker is required and should lead to an error if the broker is not available in
the classpath), and native to connect to a broker using the netty transport protocol. When the latter
is configured, Spring Boot configures a ConnectionFactory connecting to a broker running on the
local machine with the default settings.
Note
If you are using spring-boot-starter-hornetq the necessary dependencies to connect to
an existing HornetQ instance are provided, as well as the Spring infrastructure to integrate with
1.4.3.RELEASE
Spring Boot
120
When embedding the broker, you can choose if you want to enable persistence,
and the list of destinations that should be made available. These can be specified
as a comma-separated list to create them with the default options; or you can
define bean(s) of type org.hornetq.jms.server.config.JMSQueueConfiguration or
org.hornetq.jms.server.config.TopicConfiguration, for advanced queue and topic
configurations respectively.
See HornetQProperties for more of the supported options.
No JNDI lookup is involved at all and destinations are resolved against their names, either using the
name attribute in the HornetQ configuration or the names provided through configuration.
Sending a message
Springs JmsTemplate is auto-configured and you can autowire it directly into your own beans:
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;
}
// ...
}
1.4.3.RELEASE
Spring Boot
121
Note
JmsMessagingTemplate can be injected in a similar manner. If a DestinationResolver or
MessageConverter beans are defined, they are associated automatically to the auto-configured
JmsTemplate.
Receiving a message
When the JMS infrastructure is present, any bean can be annotated with @JmsListener to create
a listener endpoint. If no JmsListenerContainerFactory has been defined, a default one is
configured automatically. If a DestinationResolver or MessageConverter beans are defined,
they are associated automatically to the default factory.
The default factory is transactional by default. If you are running in an infrastructure where a
JtaTransactionManager is present, it will be associated to the listener container by default. If not,
the sessionTransacted flag will be enabled. In that latter scenario, you can associate your local
data store transaction to the processing of an incoming message by adding @Transactional on your
listener method (or a delegate thereof). This will make sure that the incoming message is acknowledged
once the local transaction has completed. This also includes sending response messages that have
been performed on the same JMS session.
The following component creates a listener endpoint on the someQueue destination:
@Component
public class MyBean {
@JmsListener(destination = "someQueue")
public void processMessage(String content) {
// ...
}
}
Tip
Check the Javadoc of @EnableJms for more details.
If you need to create more JmsListenerContainerFactory instances or if you want to override the
default, Spring Boot provides a DefaultJmsListenerContainerFactoryConfigurer that you
can use to initialize a DefaultJmsListenerContainerFactory with the same settings as the one
that is auto-configured.
For instance, the following 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;
}
}
1.4.3.RELEASE
Spring Boot
122
32.2 AMQP
The Advanced Message Queuing Protocol (AMQP) is a platform-neutral, wire-level protocol for
message-oriented middleware. The Spring AMQP project applies core Spring concepts to the
development of AMQP-based messaging solutions. Spring Boot offers several conveniences for working
with AMQP via RabbitMQ, including the spring-boot-starter-amqp Starter.
RabbitMQ support
RabbitMQ is a lightweight, reliable, scalable and portable message broker based on the AMQP protocol.
Spring uses RabbitMQ to communicate using the AMQP protocol.
RabbitMQ configuration is controlled by external configuration properties in spring.rabbitmq.*. For
example, you might declare the following section in application.properties:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=secret
Sending a message
Springs AmqpTemplate and AmqpAdmin are auto-configured and you can autowire them directly into
your own beans:
import
import
import
import
org.springframework.amqp.core.AmqpAdmin;
org.springframework.amqp.core.AmqpTemplate;
org.springframework.beans.factory.annotation.Autowired;
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;
}
// ...
1.4.3.RELEASE
Spring Boot
123
Note
RabbitMessagingTemplate can be injected in a similar manner. If a MessageConverter
bean is defined, it is associated automatically to the auto-configured AmqpTemplate.
Any org.springframework.amqp.core.Queue that is defined as a bean will be automatically used
to declare a corresponding queue on the RabbitMQ instance if necessary.
You can enable retries on the AmqpTemplate to retry operations, for example in the event the broker
connection is lost. Retries are disabled by default.
Receiving a message
When the Rabbit infrastructure is present, any bean can be annotated with @RabbitListener to create
a listener endpoint. If no RabbitListenerContainerFactory has been defined, a default one is
configured automatically. If a MessageConverter beans is defined, it is associated automatically to
the default factory.
The following component creates a listener endpoint on the someQueue queue:
@Component
public class MyBean {
@RabbitListener(queues = "someQueue")
public void processMessage(String content) {
// ...
}
}
Tip
Check the Javadoc of @EnableRabbit for more details.
If you need to create more RabbitListenerContainerFactory instances or if you want to override
the default, Spring Boot provides a SimpleRabbitListenerContainerFactoryConfigurer that
you can use to initialize a SimpleRabbitListenerContainerFactory with the same settings as
the one that is auto-configured.
For instance, the following exposes another factory that uses a specific MessageConverter:
@Configuration
static class RabbitConfiguration {
@Bean
public SimpleRabbitListenerContainerFactory myFactory(
SimpleRabbitListenerContainerFactoryConfigurer configurer) {
SimpleRabbitListenerContainerFactory factory =
new SimpleRabbitListenerContainerFactory();
configurer.configure(factory, connectionFactory);
factory.setMessageConverter(myMessageConverter());
return factory;
}
}
1.4.3.RELEASE
Spring Boot
124
You can enable retries to handle situations where your listener throws an exception. When retries are
exhausted, the message will be rejected and either dropped or routed to a dead-letter exchange if the
broker is configured so. Retries are disabled by default.
Important
If retries are not enabled and the listener throws an exception, by default the
delivery will be retried indefinitely. You can modify this behavior in two ways; set the
defaultRequeueRejected property to false and zero re-deliveries will be attempted; or,
throw an AmqpRejectAndDontRequeueException to signal the message should be rejected.
This is the mechanism used when retries are enabled and the maximum delivery attempts are
reached.
1.4.3.RELEASE
Spring Boot
125
Tip
RestTemplateBuilder includes a number of useful methods that can be used to quickly
configure a RestTemplate. For example, to add BASIC auth support you can use
builder.basicAuthorization("user", "password").build().
1.4.3.RELEASE
Spring Boot
126
throws HttpException {
if (target.getHostName().equals("192.168.0.5")) {
return null;
}
return super.determineProxy(target, request, context);
}
}).build();
restTemplate.setRequestFactory(
new HttpComponentsClientHttpRequestFactory(httpClient));
}
}
Lastly, the most extreme (and rarely used) option is to create your own RestTemplateBuilder
bean. This will switch off the auto-configuration of a RestTemplateBuilder and will prevent any
RestTemplateCustomizer beans from being used.
1.4.3.RELEASE
Spring Boot
127
1.4.3.RELEASE
Spring Boot
128
1.4.3.RELEASE
Spring Boot
129
of the machine on which Bitronix is running. To ensure uniqueness in production, you should
configure the spring.jta.transaction-manager-id property with a different value for each
instance of your application.
1.4.3.RELEASE
Spring Boot
130
// 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;
1.4.3.RELEASE
Spring Boot
131
36. Hazelcast
If hazelcast is on the classpath, Spring Boot will auto-configure an HazelcastInstance that you can
inject in your application. The HazelcastInstance is only created if a configuration is found.
You can define a com.hazelcast.config.Config bean and well use that. If your configuration
defines an instance name, well try to locate an existing instance rather than creating a new one.
You could also specify the hazelcast.xml configuration file to use via configuration:
spring.hazelcast.config=classpath:config/my-hazelcast.xml
Otherwise, Spring Boot tries to find the Hazelcast configuration from the default locations, that is
hazelcast.xml in the working directory or at the root of the classpath. We also check if the
hazelcast.config system property is set. Check the Hazelcast documentation for more details.
Note
Spring Boot also has an explicit caching support for Hazelcast. The HazelcastInstance is
automatically wrapped in a CacheManager implementation if caching is enabled.
1.4.3.RELEASE
Spring Boot
132
1.4.3.RELEASE
Spring Boot
133
Note
For backward compatibility if Redis is available Spring Session will be automatically configured
to use Redis.
Tip
You can disable Spring Session by setting the store-type to none.
Each store has specific additional settings. For instance it is possible to customize the name of the table
for the jdbc store:
spring.session.jdbc.table-name=SESSIONS
1.4.3.RELEASE
Spring Boot
134
1.4.3.RELEASE
Spring Boot
135
40. Testing
Spring Boot provides a number of utilities and annotations to help when testing your application. Test
support is provided by two modules; spring-boot-test contains core items, and spring-boottest-autoconfigure supports auto-configuration for tests.
Most developers will just use the spring-boot-starter-test Starter which imports both Spring
Boot test modules as well has JUnit, AssertJ, Hamcrest and a number of other useful libraries.
1.4.3.RELEASE
Spring Boot
136
for though is that the external properties, logging and other features of Spring Boot are only installed in
the context by default if you use SpringApplication to create it.
Spring Boot provides a @SpringBootTest annotation which can be used as an alternative to
the standard spring-test @ContextConfiguration annotation when you need Spring Boot
features. The annotation works by creating the ApplicationContext used in your tests via
SpringApplication.
You can use the webEnvironment attribute of @SpringBootTest to further refine how your tests
will 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 will transparently fallback to creating a regular non-web ApplicationContext. Can be
used in conjunction with @AutoConfigureMockMvc for MockMvc-based testing of your application.
RANDOM_PORT Loads an EmbeddedWebApplicationContext and provides a real servlet
environment. Embedded servlet containers are started and listening on a random port.
DEFINED_PORT Loads an EmbeddedWebApplicationContext and provides a real servlet
environment. Embedded servlet containers are started and listening on a defined port (i.e from your
application.properties or on the default port 8080).
NONE Loads an ApplicationContext using SpringApplication but does not provide any
servlet environment (mock or otherwise).
Note
In addition to @SpringBootTest a number of other annotations are also provided for testing
more specific slices of an application. See below for details.
Tip
Dont forget to also add @RunWith(SpringRunner.class) to your test, otherwise the
annotations will be ignored.
1.4.3.RELEASE
Spring Boot
137
Note
Springs test framework will cache application contexts between tests. Therefore, as long as your
tests share the same configuration (no matter how its discovered), the potentially time consuming
process of loading the context will only happen once.
org.springframework.beans.factory.annotation.Autowired;
org.springframework.boot.test.context.SpringBootTest;
org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
org.springframework.boot.test.web.client.TestRestTemplate;
org.springframework.test.context.junit4.SpringRunner;
1.4.3.RELEASE
Spring Boot
138
assertThat(body).isEqualTo("Hello World");
}
}
org.junit.*;
org.junit.runner.*;
org.springframework.beans.factory.annotation.*;
org.springframework.boot.test.context.*;
org.springframework.boot.test.mock.mockito.*;
org.springframework.test.context.junit4.*;
Additionally you can also use @SpyBean to wrap any existing bean with a Mockito spy. See the Javadoc
for full details.
Auto-configured tests
Spring Boots auto-configuration system works well for applications, but can sometimes be a little too
much for tests. Its often helpful to load only the parts of the configuration that are required to test a
slice of your application. For example, you might want to test that Spring MVC controllers are mapping
URLs correctly, and you dont want to involve database calls in those tests; or you might be wanting to
test JPA entities, and youre not interested in web layer when those tests run.
1.4.3.RELEASE
Spring Boot
139
org.junit.*;
org.junit.runner.*;
org.springframework.beans.factory.annotation.*;
org.springframework.boot.test.autoconfigure.json.*;
org.springframework.boot.test.context.*;
org.springframework.boot.test.json.*;
org.springframework.test.context.junit4.*;
1.4.3.RELEASE
Spring Boot
140
Note
JSON helper classes can also be used directly in standard unit tests. Simply call the initFields
method of the helper in your @Before method if you arent using @JsonTest.
A list of the auto-configuration that is enabled by @JsonTest can be found in the appendix.
org.junit.*;
org.junit.runner.*;
org.springframework.beans.factory.annotation.*;
org.springframework.boot.test.autoconfigure.web.servlet.*;
org.springframework.boot.test.mock.mockito.*;
import
import
import
import
static
static
static
static
org.assertj.core.api.Assertions.*;
org.mockito.BDDMockito.*;
org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
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"));
}
}
1.4.3.RELEASE
Spring Boot
141
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 @AutoConfigureMockMvc annotation.
If you use HtmlUnit or Selenium, auto-configuration will also provide a WebClient bean and/or a
WebDriver bean. Here is an example that uses HtmlUnit:
import
import
import
import
import
import
com.gargoylesoftware.htmlunit.*;
org.junit.*;
org.junit.runner.*;
org.springframework.beans.factory.annotation.*;
org.springframework.boot.test.autoconfigure.web.servlet.*;
org.springframework.boot.test.mock.mockito.*;
Note
By default Spring Boot will put WebDriver beans in a special scope to ensure that the driver
is quit after each test, and that a new instance is injected. If you dont want this behavor you can
add @Scope("singleton") to your WebDriver @Bean definition.
A list of the auto-configuration that is enabled by @WebMvcTest can be found in the appendix.
org.junit.Test;
org.junit.runner.RunWith;
org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
org.springframework.test.context.junit4.SpringRunner;
org.springframework.transaction.annotation.Propagation;
1.4.3.RELEASE
Spring Boot
142
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 specifically designed for tests. If you want to use TestEntityManager
outside of @DataJpaTests you can also use the @AutoConfigureTestEntityManager
annotation. A JdbcTemplate is also available if you need that.
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 dont require
any developer installation. If, however, you prefer to run tests against a real database you can use the
@AutoConfigureTestDatabase annotation:
@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace=Replace.NONE)
public class ExampleRepositoryTests {
// ...
}
A list of the auto-configuration that is enabled by @DataJpaTest can be found in the appendix.
1.4.3.RELEASE
Spring Boot
143
A list of the auto-configuration that is enabled by @RestClientTest can be found in the appendix.
org.springframework.beans.factory.annotation.Autowired;
org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
org.springframework.http.MediaType;
org.springframework.test.context.junit4.SpringRunner;
org.springframework.test.web.servlet.MockMvc;
In addition to configuring the output directory, @AutoConfigureRestDocs can also configure the host,
scheme, and port that will appear in any documented URIs. If you require more control over Spring
REST Docs' configuration a RestDocsMockMvcConfigurationCustomizer bean can be used:
@TestConfiguration
static class CustomizationConfiguration
implements RestDocsMockMvcConfigurationCustomizer {
@Override
public void customize(MockMvcRestDocumentationConfigurer configurer) {
1.4.3.RELEASE
Spring Boot
144
configurer.snippets().withTemplateFormat(TemplateFormats.markdown());
}
}
If you want to make use of Spring REST Docs' support for a parameterized output directory, you can
create a RestDocumentationResultHandler bean. The auto-configuration will call alwaysDo with
this result handler, thereby causing each MockMvc call to automatically generate the default snippets:
@TestConfiguration
static class ResultHandlerConfiguration {
@Bean
public RestDocumentationResultHandler restDocumentation() {
return MockMvcRestDocumentation.document("{method-name}");
}
}
1.4.3.RELEASE
Spring Boot
145
ConfigFileApplicationContextInitializer
ConfigFileApplicationContextInitializer is an ApplicationContextInitializer that
can apply to your tests to load Spring Boot application.properties files. You can use this when
you dont need the full features provided by @SpringBootTest.
@ContextConfiguration(classes = Config.class,
initializers = ConfigFileApplicationContextInitializer.class)
Note
Using ConfigFileApplicationContextInitializer alone wont provide support for
@Value("${}") injection. Its only job is to ensure that application.properties files are
loaded into Springs Environment. For @Value support you need to either additionally configure
a PropertySourcesPlaceholderConfigurer or use @SpringBootTest where one will be
auto-configured for you.
EnvironmentTestUtils
EnvironmentTestUtils allows you to quickly add properties to a ConfigurableEnvironment or
ConfigurableApplicationContext. Simply call it with key=value strings:
EnvironmentTestUtils.addEnvironment(env, "org=Spring", "name=Boot");
OutputCapture
OutputCapture is a JUnit Rule that you can use to capture System.out and System.err output.
Simply declare the capture as a @Rule then use toString() for assertions:
import org.junit.Rule;
import org.junit.Test;
import org.springframework.boot.test.rule.OutputCapture;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
public class MyTest {
@Rule
public OutputCapture capture = new OutputCapture();
@Test
public void testName() throws Exception {
System.out.println("Hello World!");
assertThat(capture.toString(), containsString("World"));
}
}
TestRestTemplate
TestRestTemplate is a convenience alternative to Springs RestTemplate that is useful in
integration tests. You can get a vanilla template or one that sends Basic HTTP authentication (with a
username and password). In either case the template will behave in a test-friendly way: not following
redirects (so you can assert the response location), ignoring cookies (so the template is stateless), and
not throwing exceptions on server-side errors. It is recommended, but not mandatory, to use Apache
HTTP Client (version 4.3.2 or better), and if you have that on your classpath the TestRestTemplate
will respond by configuring the client appropriately.
1.4.3.RELEASE
Spring Boot
146
1.4.3.RELEASE
Spring Boot
147
41. WebSockets
Spring Boot provides WebSockets auto-configuration for embedded Tomcat (8 and 7), Jetty 9 and
Undertow. If youre deploying a war file to a standalone container, Spring Boot assumes that the
container will be responsible for the configuration of its WebSocket support.
Spring Framework provides rich WebSocket support that can be easily accessed via the springboot-starter-websocket module.
1.4.3.RELEASE
Spring Boot
148
1.4.3.RELEASE
Spring Boot
149
1.4.3.RELEASE
Spring Boot
150
Spring Boot includes a number of @Conditional annotations that you can reuse in your own code by
annotating @Configuration classes or individual @Bean methods.
Class conditions
The @ConditionalOnClass and @ConditionalOnMissingClass annotations allows
configuration to be included based on the presence or absence of specific classes. Due to the fact that
annotation metadata is parsed using ASM you can actually 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 using a String value.
Bean conditions
The @ConditionalOnBean and @ConditionalOnMissingBean annotations allow a bean to be
included based on the presence or absence of specific beans. You can use the value attribute to
specify beans by type, or name to specify beans by name. The search attribute allows you to limit the
ApplicationContext hierarchy that should be considered when searching for beans.
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 @ConditionalOnBean and @ConditionalOnMissingBean annotations on autoconfiguration classes (since these are guaranteed to load after any user-define beans definitions
have been added).
Note
@ConditionalOnBean
and
@ConditionalOnMissingBean
do
not
prevent
@Configuration classes from being created. Using these conditions at the class level is
equivalent to marking each contained @Bean method with the annotation.
Property conditions
The @ConditionalOnProperty annotation allows configuration to be included based on a Spring
Environment property. Use the prefix and name attributes to specify the property that should be
checked. By default any property that exists and is not equal to false will be matched. You can also
create more advanced checks using the havingValue and matchIfMissing attributes.
Resource conditions
The @ConditionalOnResource annotation allows configuration to be included only when a specific
resource is present. Resources can be specified using the usual Spring conventions, for example,
file:/home/user/test.dat.
1.4.3.RELEASE
Spring Boot
151
Naming
Please make sure to provide a proper namespace for your starter. Do not start your module names with
spring-boot, even if you are using a different Maven groupId. We may offer an official support for
the thing youre auto-configuring in the future.
Here is a rule of thumb. Lets assume that you are creating a starter for "acme", name the auto-configure
module acme-spring-boot-autoconfigure and the starter acme-spring-boot-starter. If
you only have one module combining the two, use acme-spring-boot-starter.
Besides, if your starter provides configuration keys, use a proper namespace for them. In particular, do
not include your keys in the namespaces that Spring Boot uses (e.g. server, management, spring,
etc). These are "ours" and we may improve/modify them in the future in such a way it could break your
things.
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-configurationmetadata.json) to make sure your keys are properly documented.
Autoconfigure module
The autoconfigure module contains everything that is necessary to get started with the library. It may
also contain configuration keys definition (@ConfigurationProperties) and any callback interface
that can be used to further customize how the components are initialized.
Tip
You should mark the dependencies to the library as optional so that you can include the
autoconfigure module in your projects more easily. If you do it that way, the library wont be
provided and Spring Boot will back off by default.
1.4.3.RELEASE
Spring Boot
152
Starter module
The starter is an empty jar, really. Its only purpose is to provide the necessary dependencies to work
with the library; see it as an opinionated view of what is required to get started.
Do not make assumptions about the project in which your starter is added. If the library you are autoconfiguring typically requires other starters, mention them as well. Providing a proper set of default
dependencies may be hard if the number of optional dependencies is high as you should avoid bringing
unnecessary dependencies for a typical usage of the library.
1.4.3.RELEASE
Spring Boot
153
1.4.3.RELEASE
Spring Boot
154
1.4.3.RELEASE
Spring Boot
156
46. Endpoints
Actuator endpoints allow you to monitor and interact with your application. Spring Boot includes a
number of built-in endpoints and you can also add your own. For example the health endpoint provides
basic application health information.
The way that endpoints are exposed will depend on the type of technology that you choose. Most
applications choose HTTP monitoring, where the ID of the endpoint is mapped to a URL. For example,
by default, the health endpoint will be mapped to /health.
The following technology agnostic endpoints are available:
ID
Description
Sensitive
Default
actuator
true
autoconfig
Displays an auto-configuration report showing all autoconfiguration candidates and the reason why they were or
were not applied.
true
beans
true
configprops
true
dump
true
env
true
flyway
true
health
false
info
false
liquibase
true
metrics
true
mappings
true
shutdown
true
trace
true
1.4.3.RELEASE
Spring Boot
157
If you are using Spring MVC, the following additional endpoints can also be used:
ID
Description
Sensitive
Default
docs
false
heapdump
true
jolokia
true
logfile
true
Note
Depending on how an endpoint is exposed, the sensitive property may be used as a security
hint. For example, sensitive endpoints will require a username/password when they are accessed
over HTTP (or simply disabled if web security is not enabled).
Note
The prefix #endpoints + . + name is used to uniquely identify the endpoint that is being
configured.
By default, all endpoints except for shutdown are enabled. If you prefer to specifically opt-in endpoint
enablement you can use the endpoints.enabled property. For example, the following will disable
all endpoints except for info:
endpoints.enabled=false
endpoints.info.enabled=true
Likewise, you can also choose to globally set the sensitive flag of all endpoints. By default, the sensitive
flag depends on the type of endpoint (see the table above). For example, to mark all endpoints as
sensitive except info:
endpoints.sensitive=true
endpoints.info.sensitive=false
1.4.3.RELEASE
Spring Boot
158
Tip
Check EndpointCorsProperties for a complete list of options.
1.4.3.RELEASE
Spring Boot
159
Auto-configured HealthIndicators
The following HealthIndicators are auto-configured by Spring Boot when appropriate:
Name
Description
CassandraHealthIndicator
Checks that a Cassandra database is up.
DiskSpaceHealthIndicator
Checks for low disk space.
DataSourceHealthIndicator
Checks that a connection to DataSource can be obtained.
ElasticsearchHealthIndicator
Checks that an Elasticsearch cluster is up.
JmsHealthIndicator
Checks that a JMS broker is up.
MailHealthIndicator
Checks that a mail server is up.
MongoHealthIndicator
Checks that a Mongo database is up.
RabbitHealthIndicator
Checks that a Rabbit server is up.
RedisHealthIndicator
Checks that a Redis server is up.
SolrHealthIndicator
Checks that a Solr server is up.
Tip
It is possible to disable them all using the management.health.defaults.enabled property.
1.4.3.RELEASE
Spring Boot
160
Note
The identifier for a given HealthIndicator is the name of the bean without the
HealthIndicator suffix if it exists. In the example above, the health information will be available
in an entry named my.
In addition to Spring Boots 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 using the management.health.status.order configuration property.
For example, assuming 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=DOWN, OUT_OF_SERVICE, UNKNOWN, UP
You might also want to register custom status mappings with the HealthMvcEndpoint
if you access the health endpoint over HTTP. For example you could map FATAL to
HttpStatus.SERVICE_UNAVAILABLE.
Auto-configured InfoContributors
The following InfoContributors are auto-configured by Spring Boot when appropriate:
1.4.3.RELEASE
Spring Boot
161
Name
Description
EnvironmentInfoContributor
Expose any key from the Environment under the info key.
GitInfoContributor
Expose git information if a git.properties file is available.
BuildInfoContributor
Expose build information if a META-INF/build-info.properties file is
available.
Tip
It is possible to disable them all using the management.info.defaults.enabled property.
Tip
Rather than hardcoding those values you could also expand info properties at build time.
Assuming you are using Maven, you could rewrite the example above as follows:
[email protected]@
[email protected]@
[email protected]@
Build information
The info endpoint can also publish information about your build if a BuildProperties bean is
available. This happens if a META-INF/build-info.properties file is available in the classpath.
1.4.3.RELEASE
Spring Boot
162
Tip
The Maven and Gradle plugins can both generate that file, see Generate build information for
more details.
If you hit the info endpoint you should see a response that contains the following additional entry:
{
"example": {
"key" : "value"
}
}
1.4.3.RELEASE
Spring Boot
163
Tip
If you dont use Spring Security and your HTTP endpoints are exposed publicly, you should
carefully consider which endpoints you enable. See Section 46.1, Customizing endpoints for
details of how you can set endpoints.enabled to false then opt-in only specific endpoints.
The application.properties example above will change the endpoint from /{id} to /manage/
{id} (e.g. /manage/info).
You can also change the id of an endpoint (using endpoints.{name}.id) which then changes the
default resource path for the MVC endpoint. Legal endpoint ids are composed only of alphanumeric
characters (because they can be exposed in a number of places, including JMX object names,
where special characters are forbidden). The MVC path can be changed separately by configuring
endpoints.{name}.path, and there is no validation on those values (so you can use anything that
is legal in a URL path). For example, to change the location of the /health endpoint to /ping/me you
can set endpoints.health.path=/ping/me.
1.4.3.RELEASE
Spring Boot
164
Tip
If you provide a custom MvcEndpoint remember to include a settable path property, and default
it to /{id} if you want your code to behave like the standard MVC endpoints. (Take a look at the
HealthMvcEndpoint to see how you might do that.) If your custom endpoint is an Endpoint
(not an MvcEndpoint) then Spring Boot will take care of the path for you.
Since your management port is often protected by a firewall, and not exposed to the public you might
not need security on the management endpoints, even if your main application is secure. In that case
you will have Spring Security on the classpath, and you can disable management security like this:
management.security.enabled=false
(If you dont have Spring Security on the classpath then there is no need to explicitly disable the
management security in this way, and it might even break the application.)
Alternatively, both the main server and the management server can use SSL but with different key stores:
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:main.jks
server.ssl.key-password=secret
management.port=8080
management.ssl.enable=true
management.ssl.key-store=classpath:management.jks
management.ssl.key-password=secret
1.4.3.RELEASE
Spring Boot
165
Note
You can only listen on a different address if the port is different to the main server port.
Here is an example application.properties that will not allow remote management connections:
management.port=8081
management.address=127.0.0.1
Authenticated
false
false
Full content
Full content
false
true
Status only
Full content
true
false
Status only
Full content
true
true
No content
Full content
1.4.3.RELEASE
Spring Boot
166
Jolokia can then be accessed using /jolokia on your management HTTP server.
Customizing Jolokia
Jolokia has a number of settings that you would traditionally configure using servlet parameters.
With Spring Boot you can use your application.properties, simply prefix the parameter with
jolokia.config.:
jolokia.config.debug=true
Disabling Jolokia
If you are using Jolokia but you dont want Spring Boot to configure it, simply set the
endpoints.jolokia.enabled property to false:
1.4.3.RELEASE
Spring Boot
167
endpoints.jolokia.enabled=false
1.4.3.RELEASE
Spring Boot
168
Tip
If you want to also enable telnet access you will additionally need a dependency on
org.crsh:crsh.shell.telnet.
Note
CRaSH requires to run with a JDK as it compiles commands on the fly. If a basic help command
fails, you are probably running with a JRE.
Linux and OSX users can use ssh to connect to the remote shell, Windows users can download and
install PuTTY.
$ ssh -p 2000 user@localhost
user@localhost's password:
.
____
_
__ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.4.3.RELEASE) on myhost
Type help for a list of commands. Spring Boot provides metrics, beans, autoconfig and endpoint
commands.
1.4.3.RELEASE
Spring Boot
169
Spring Boot adds some additional attributes to InvocationContext that you can access from your
command:
Attribute Name
Description
spring.boot.version
spring.version
spring.beanfactory
spring.environment
1.4.3.RELEASE
Spring Boot
170
1.4.3.RELEASE
Spring Boot
171
50. Metrics
Spring Boot Actuator includes a metrics service with gauge and counter support. A gauge records
a single value; and a counter records a delta (an increment or decrement). Spring Boot Actuator also
provides a PublicMetrics interface that you can implement to expose metrics that you cannot record
via one of those two mechanisms. Look at SystemPublicMetrics for an example.
Metrics for all HTTP requests are automatically recorded, so if you hit the metrics endpoint you should
see a response similar to this:
{
"counter.status.200.root": 20,
"counter.status.200.metrics": 3,
"counter.status.200.star-star": 5,
"counter.status.401.root": 4,
"gauge.response.star-star": 6,
"gauge.response.root": 2,
"gauge.response.metrics": 3,
"classes": 5808,
"classes.loaded": 5808,
"classes.unloaded": 0,
"heap": 3728384,
"heap.committed": 986624,
"heap.init": 262144,
"heap.used": 52765,
"nonheap": 0,
"nonheap.committed": 77568,
"nonheap.init": 2496,
"nonheap.used": 75826,
"mem": 986624,
"mem.free": 933858,
"processors": 8,
"threads": 15,
"threads.daemon": 11,
"threads.peak": 15,
"threads.totalStarted": 42,
"uptime": 494836,
"instance.uptime": 489782,
"datasource.primary.active": 5,
"datasource.primary.usage": 0.25
}
Here we can see basic memory, heap, class loading, processor and thread pool information
along with some HTTP metrics. In this instance the root (/) and /metrics URLs have returned HTTP
200 responses 20 and 3 times respectively. It also appears that the root URL returned HTTP 401
(unauthorized) 4 times. The double asterisks (star-star) comes from a request matched by Spring
MVC as /** (normally a static resource).
The gauge shows the last response time for a request. So the last request to root took 2ms to respond
and the last to /metrics took 3ms.
Note
In this example we are actually accessing the endpoint over HTTP using the /metrics URL, this
explains why metrics appears in the response.
1.4.3.RELEASE
Spring Boot
172
1.4.3.RELEASE
Spring Boot
173
temporal value (i.e. the hit ratio of the last second). Check your caching provider documentation
for more details.
If two different cache managers happen to define the same cache, the name of the cache is prefixed
by the name of the CacheManager bean.
It is possible to override part or all of those defaults by registering a bean with a customized version
of CachePublicMetrics. By default, Spring Boot provides cache statistics for EhCache, Hazelcast,
Infinispan, JCache and Guava. You can add additional CacheStatisticsProvider beans if your
favorite caching library isnt supported out of the box. See CacheStatisticsAutoConfiguration
for examples.
Tip
You can use any string as a metric name but you should follow guidelines of your chosen store/
graphing technology. Some good guidelines for Graphite are available on Matt Aimonettis Blog.
1.4.3.RELEASE
Spring Boot
174
1.4.3.RELEASE
Spring Boot
175
same application). The key is used to keep a global index of all metric names, so it should be unique
globally, whatever that means for your system (e.g. two instances of the same system could share a
Redis cache if they have distinct keys).
Example:
@Bean
@ExportMetricWriter
MetricWriter metricWriter(MetricExportProperties export) {
return new RedisMetricRepository(connectionFactory,
export.getRedis().getPrefix(), export.getRedis().getKey());
}
application.properties.
spring.metrics.export.redis.prefix: metrics.mysystem.${spring.application.name:application}.
${random.value:0000}
spring.metrics.export.redis.key: keys.metrics.mysystem
The prefix is constructed with the application name and id at the end, so it can easily be used to identify
a group of processes with the same logical name later.
Note
Its important to set both the key and the prefix. The key is used for all repository operations, and
can be shared by multiple repositories. If multiple repositories share a key (like in the case where
you need to aggregate across them), then you normally have a read-only master repository that
has a short, but identifiable, prefix (like metrics.mysystem), and many write-only repositories
with prefixes that start with the master prefix (like metrics.mysystem.* in the example above).
It is efficient to read all the keys from a master repository like that, but inefficient to read a subset
with a longer prefix (e.g. using one of the writing repositories).
Tip
The example above uses MetricExportProperties to inject and extract the key and prefix.
This is provided to you as a convenience by Spring Boot, configured with sensible defaults. There
is nothing to stop you using your own values as long as they follow the recommendations.
1.4.3.RELEASE
Spring Boot
176
"domain": "org.springframework.metrics",
"process": "b968a76"
},
"aggregateTags": [],
"dps": {
"1430492872": 2,
"1430492875": 6
}
}
]
@Bean
of
type
StatsdMetricWriter
and
mark
it
@Value("${spring.application.name:application}.${random.value:0000}")
private String prefix = "metrics";
@Bean
@ExportMetricWriter
MetricWriter metricWriter() {
return new StatsdMetricWriter(prefix, "localhost", 8125);
}
Each metric is exported as an individual MBean. The format for the ObjectNames is given by an
ObjectNamingStrategy which can be injected into the JmxMetricWriter (the default breaks up
the metric name and tags the first two period-separated sections in a way that should make the metrics
group nicely in JVisualVM or JConsole).
1.4.3.RELEASE
Spring Boot
177
This is very useful if multiple application instances are feeding to a central (e.g. Redis)
repository and you want to display the results. Particularly recommended in conjunction with a
MetricReaderPublicMetrics for hooking up to the results to the /metrics endpoint.
Example:
@Autowired
private MetricExportProperties export;
@Bean
public PublicMetrics metricsAggregate() {
return new MetricReaderPublicMetrics(aggregatesMetricReader());
}
private MetricReader globalMetricsForAggregation() {
return new RedisMetricRepository(this.connectionFactory,
this.export.getRedis().getAggregatePrefix(), this.export.getRedis().getKey());
}
private MetricReader aggregatesMetricReader() {
AggregateMetricReader repository = new AggregateMetricReader(
globalMetricsForAggregation());
return repository;
}
Note
The example above uses MetricExportProperties to inject and extract the key and prefix.
This is provided to you as a convenience by Spring Boot, and the defaults will be sensible. They
are set up in MetricExportAutoConfiguration.
Note
The MetricReaders above are not @Beans and are not marked as @ExportMetricReader
because they are just collecting and analyzing data from other repositories, and dont want to
export their values.
1.4.3.RELEASE
Spring Boot
178
51. Auditing
Spring Boot Actuator has a flexible audit framework that will publish events once Spring Security
is in play (authentication success, failure and access denied exceptions by default). This can
be very useful for reporting, and also to implement a lock-out policy based on authentication
failures. To customize published security events you can provide your own implementations of
AbstractAuthenticationAuditListener and AbstractAuthorizationAuditListener.
You can also choose to use the audit services for your own business events. To do that you can either
inject the existing AuditEventRepository into your own components and use that directly, or you
can simply publish AuditApplicationEvent via the Spring ApplicationEventPublisher (using
ApplicationEventPublisherAware).
1.4.3.RELEASE
Spring Boot
179
52. Tracing
Tracing is automatically enabled for all HTTP requests. You can view the trace endpoint and obtain
basic information about the last 100 requests:
[{
"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,
...
}]
1.4.3.RELEASE
Spring Boot
180
53.2 Programmatically
You can also activate a listener by invoking the SpringApplication.addListeners() method
and passing the appropriate Writer object. This method also allows you to customize the file name
and path via the Writer constructor.
1.4.3.RELEASE
Spring Boot
181
1.4.3.RELEASE
Spring Boot
182
See the cf push documentation for more options. If there is a Cloud Foundry manifest.yml file
present in the same directory, it will be consulted.
Note
Here we are substituting acloudyspringtime for whatever value you give cf as the name of
your application.
At this point cf will start uploading your application:
Uploading acloudyspringtime... OK
Preparing to start acloudyspringtime... OK
-----> Downloaded app package (8.9M)
-----> Java Buildpack source: system
-----> Downloading Open JDK 1.7.0_51 from .../x86_64/openjdk-1.7.0_51.tar.gz (1.8s)
Expanding Open JDK to .java-buildpack/open_jdk (1.2s)
-----> Downloading Spring Auto Reconfiguration from 0.8.7 .../auto-reconfiguration-0.8.7.jar (0.1s)
-----> Uploading droplet (44M)
Checking status of app 'acloudyspringtime'...
0 of 1 instances running (1 starting)
...
0 of 1 instances running (1 down)
...
0 of 1 instances running (1 starting)
1.4.3.RELEASE
Spring Boot
184
...
1 of 1 instances running (1 running)
App started
requested state
instances
memory
disk
urls
started
1/1
512M
1G
acloudyspringtime.cfapps.io
Once Cloud Foundry acknowledges that your application has been deployed, you should be able to hit
the application at the URI given, in this case http://acloudyspringtime.cfapps.io/.
Binding to services
By default, metadata about the running application as well as service connection information is exposed
to the application as environment variables (for example: $VCAP_SERVICES). This architecture decision
is due to Cloud Foundrys polyglot (any language and platform can be supported as a buildpack) nature;
process-scoped environment variables are language agnostic.
Environment variables dont always make for the easiest API so Spring Boot automatically extracts them
and flattens the data into properties that can be accessed through Springs Environment abstraction:
@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 spring-boot-starter-cloudconnectors starter.
55.2 Heroku
Heroku is another popular PaaS platform. To customize Heroku builds, you provide a Procfile,
which provides the incantation required to deploy an application. Heroku assigns a port for the Java
application to use and then ensures that routing to the external URI works.
1.4.3.RELEASE
Spring Boot
185
You must configure your application to listen on the correct port. Heres the Procfile for our starter
REST application:
web: java -Dserver.port=$PORT -jar target/demo-0.0.1-SNAPSHOT.jar
Spring Boot makes -D arguments available as properties accessible from a Spring Environment
instance. The server.port configuration property is fed to the embedded Tomcat, Jetty or Undertow
instance which then uses it when it starts up. The $PORT environment variable is assigned to us by
the Heroku PaaS.
Heroku by default will use Java 1.8. This is fine as long as your Maven or Gradle build is set to use the
same version (Maven users can use the java.version property). If you want to use JDK 1.7, create a
new file adjacent to your pom.xml and Procfile, called system.properties. In this file add the
following:
java.runtime.version=1.7
This should be everything you need. The most common workflow for Heroku deployments is to git
push the code to production.
$ 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)
----->
----->
----->
----->
----->
1.4.3.RELEASE
Spring Boot
186
55.3 OpenShift
OpenShift is the RedHat public (and enterprise) PaaS solution. Like Heroku, it works by running scripts
triggered by git commits, so you can script the launching of a Spring Boot application in pretty much any
way you like as long as the Java runtime is available (which is a standard feature you can ask for at
OpenShift). To do this you can use the DIY Cartridge and hooks in your repository under .openshift/
action_hooks:
The basic model is to:
1. Ensure Java and your build tool are installed remotely, e.g. using a pre_build hook (Java and
Maven are installed by default, Gradle is not)
2. Use a build hook to build your jar (using Maven or Gradle), e.g.
#!/bin/bash
cd $OPENSHIFT_REPO_DIR
mvn package -s .openshift/settings.xml -DskipTests=true
4. Use a stop hook (since the start is supposed to return cleanly), e.g.
#!/bin/bash
source $OPENSHIFT_CARTRIDGE_SDK_BASH
PID=$(ps -ef | grep java.*\.jar | grep -v grep | awk '{ print $2 }')
if [ -z "$PID" ]
then
client_result "Application is already stopped"
else
kill $PID
fi
5. Embed service bindings from environment variables provided by the platform in your
application.properties, e.g.
spring.datasource.url: jdbc:mysql://${OPENSHIFT_MYSQL_DB_HOST}:${OPENSHIFT_MYSQL_DB_PORT}/
${OPENSHIFT_APP_NAME}
spring.datasource.username: ${OPENSHIFT_MYSQL_DB_USERNAME}
spring.datasource.password: ${OPENSHIFT_MYSQL_DB_PASSWORD}
Theres a blog on running Gradle in OpenShift on their website that will get you started with a gradle
build to run the app.
1.4.3.RELEASE
Spring Boot
187
Once you have created a Boxfuse account, connected it to your AWS account, and installed the latest
version of the Boxfuse Client, you can deploy your Spring Boot application to AWS as follows (ensure
the application has been built by Maven or Gradle first using, for example, mvn clean package):
$ 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 will be consulted.
Tip
By default Boxfuse will activate a Spring profile named boxfuse on startup and if your
executable jar or war contains an boxfuse.com/docs/payloads/springboot.html#configuration
[application-boxfuse.properties] file, Boxfuse will base its configuration based on the
properties it contains.
At this point boxfuse will create an image for your application, upload it, and then configure and start
the necessary resources on AWS:
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://myappaxelfontaine.boxfuse.io/
1.4.3.RELEASE
Spring Boot
188
You can then run your application by typing ./my-application.jar (where my-application is
the name of your artifact).
Note
Fully executable jars work by embedding an extra script at the front of the file. Not all tools currently
accept this format so you may not always be able to use this technique.
Note
The default script supports most Linux distributions and is tested on CentOS and
Ubuntu. Other platforms, such as OS X and FreeBSD, will require the use of a custom
embeddedLaunchScript.
Note
When a fully executable jar is run, it uses the jars directory as the working directory.
1.4.3.RELEASE
Spring Boot
189
Once installed, you can start and stop the service in the usual way. For example, on a Debian based
system:
$ service myapp start
Tip
If your application fails to start, check the log file written to /var/log/<appname>.log for errors.
You can also flag the application to start automatically using your standard operating system tools. For
example, on Debian:
$ update-rc.d myapp defaults <priority>
In this case, the default executable script will run the application as the bootapp user.
Tip
To reduce the chances of the applications user account being compromised, you should consider
preventing it from using a login shell. Set the accounts shell to /usr/sbin/nologin, for
example.
You should also take steps to prevent the modification of your applications jar file. Firstly, configure its
permissions so that it cannot be written and can only be read or executed by its owner:
$ chmod 500 your-app.jar
Secondly, you should also take steps to limit the damage if your application or the account thats running
it is compromised. If an attacker does gain access, they could make the jar file writable and change its
contents. One way to protect against this is to make it immutable using chattr:
1.4.3.RELEASE
Spring Boot
190
This will prevent any user, including root, from modifying the jar.
If root is used to control the applications service and you use a .conf file to customize its startup, the
.conf file will be 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:
$ chmod 400 your-app.conf
$ sudo chown root:root your-app.conf
Tip
Remember to change the Description, User and ExecStart fields for your application.
Tip
Note that ExecStart field does not declare the script action command, which means that run
command is used by default.
Note that unlike when running as an init.d service, user that runs the application, PID file and console
log file are managed by systemd itself and therefore must be configured using appropriate fields in
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
1.4.3.RELEASE
Spring Boot
191
usually enough. If you find you cant customize something that you need to, you can always use the
embeddedLaunchScript option to write your own file entirely.
Customizing script when its written
It often makes sense to customize elements of the start script as its written into the jar file. For example,
init.d scripts can provide a description and, since you know this up front (and it wont change), you
may as well provide it when the jar is generated.
To customize written elements, use the embeddedLaunchScriptProperties option of the Spring
Boot Maven or Gradle plugins.
The following property substitutions are supported with the default script:
Name
Description
mode
initInfoProvides
The Provides section of INIT INFO. Defaults to spring-boot-application for
Gradle and to ${project.artifactId} for Maven.
initInfoShortDescription
The Short-Description section of INIT INFO. Defaults to Spring Boot
Application for Gradle and to ${project.name} for Maven.
initInfoDescription
The Description section of INIT INFO. Defaults to Spring Boot
Application for Gradle and to ${project.description} (falling back to
${project.name}) for Maven.
initInfoChkconfig
The chkconfig section of INIT INFO. Defaults to 2345 99 01.
confFolder The default value for CONF_FOLDER. Defaults to the folder containing the jar.
logFolder The default value for LOG_FOLDER. Only valid for an init.d service.
pidFolder The default value for PID_FOLDER. Only valid for an init.d service.
useStartStopDaemon
If the start-stop-daemon command, when its available, should be used to control
the process. Defaults to true.
Customizing script when it runs
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
MODE
The mode of operation. The default depends on the way the jar was built, but will
usually be auto (meaning it tries to guess if it is an init script by checking if it is a
symlink in a directory called init.d). You can explicitly set it to service so that the
stop|start|status|restart commands work, or to run if you just want to run
the script in the foreground.
USE_START_STOP_DAEMON
If the start-stop-daemon command, when its available, should be used to control
the process. Defaults to true.
1.4.3.RELEASE
Spring Boot
192
Variable
Description
The name of the app. If the jar is run from a symlink the script guesses the app name,
but if it is not a symlink, or you want to explicitly set the app name this can be useful.
RUN_ARGS
JAVA_HOME The location of the java executable is discovered by using the PATH by default, but
you can set it explicitly if there is an executable file at $JAVA_HOME/bin/java.
JAVA_OPTS Options that are passed to the JVM when it is launched.
JARFILE
The explicit location of the jar file, in case the script is being used to launch a jar that
it is not actually embedded in.
DEBUG
if not empty will set the -x flag on the shell process, making it easy to see the logic in
the script.
Note
The PID_FOLDER, LOG_FOLDER and LOG_FILENAME variables are only valid for an init.d
service. With systemd the equivalent customizations are made using service script. Check the
service unit configuration man page for more details.
With the exception of JARFILE and APP_NAME, the above settings can be configured using a .conf
file. The file is expected next to the jar file and have the same name but suffixed with .conf rather
than .jar. For example, a jar named /var/myapp/myapp.jar will use the configuration file named
/var/myapp/myapp.conf.
myapp.conf.
JAVA_OPTS=-Xmx1024M
LOG_FOLDER=/custom/log/folder
Tip
You can use a CONF_FOLDER environment variable to customize the location of the config file if
you dont like it living next to the jar.
To learn about securing this file appropriately, please refer to the guidelines for securing an init.d service.
1.4.3.RELEASE
Spring Boot
193
1.4.3.RELEASE
Spring Boot
194
1.4.3.RELEASE
Spring Boot
196
You can use help to get more details about any of the supported commands. For example:
$ spring help run
spring run - Run a spring groovy script
usage: spring run [options] <files> [--] [args]
Option
-------autoconfigure [Boolean]
--classpath, -cp
-e, --edit
--no-guess-dependencies
--no-guess-imports
-q, --quiet
-v, --verbose
--watch
Description
----------Add autoconfigure compiler
transformations (default: true)
Additional classpath entries
Open the file with the default system
editor
Do not attempt to guess dependencies
Do not attempt to guess imports
Quiet logging
Verbose logging of dependency
resolution
Watch the specified file for changes
The version command provides a quick way to check which version of Spring Boot you are using.
$ spring version
Spring CLI v1.4.3.RELEASE
1.4.3.RELEASE
Spring Boot
197
To pass command line arguments to the application, you need to use a -- to separate them from the
spring command arguments, e.g.
$ spring run hello.groovy -- --server.port=9000
To set JVM command line arguments you can use the JAVA_OPTS environment variable, e.g.
$ JAVA_OPTS=-Xmx1024m spring run hello.groovy
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.
@EnableDeviceResolver
Spring Mobile.
@Controller @RestController
@EnableWebMvc
@EnableWebSecurity
Spring Security.
@EnableTransactionManagement
Tip
See subclasses of CompilerAutoConfiguration in the Spring Boot CLI source code to
understand exactly how customizations are applied.
1.4.3.RELEASE
Spring Boot
198
indicates that dependency management in another-bom will override the dependency management
in custom-bom.
You can use @DependencyManagementBom anywhere that you can use @Grab, however, to ensure
consistent ordering of the dependency management, you can only use @DependencyManagementBom
at most once in your application. A useful source of dependency management (that is
1.4.3.RELEASE
Spring Boot
199
In this example, tests.groovy contains JUnit @Test methods or Spock Specification classes.
All the common framework annotations and static methods should be available to you without having
to import them.
Here is the tests.groovy file that we used above (with a JUnit test):
class ApplicationTests {
@Test
void homeSaysHello() {
assertEquals("Hello World!", new WebApplication().home())
}
}
Tip
If you have more than one test source files, you might prefer to organize them into a test
directory.
This technique can also be useful if you want to segregate your test or spec code from the main
application code:
$ spring test app/*.groovy test/*.groovy
The resulting jar will contain the classes produced by compiling the application and all of the applications
dependencies so that it can then be run using java -jar. The jar file will also contain entries from the
applications classpath. You can add explicit paths to the jar using --include and --exclude (both
are comma-separated, and both accept prefixes to the values + and - to signify that they should be
removed from the defaults). The default includes are
1.4.3.RELEASE
Spring Boot
200
This creates a my-project directory with a Maven-based project using spring-boot-starterweb and spring-boot-starter-data-jpa. You can list the capabilities of the service using the -list flag
$ 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, check the help output for more details. For instance, the
following command creates a gradle project using 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'
From inside the embedded shell you can run other commands directly:
1.4.3.RELEASE
Spring Boot
201
$ version
Spring CLI v1.4.3.RELEASE
The embedded shell supports ANSI color output as well as tab completion. If you need to run a native
command you can use the ! prefix. Hitting ctrl-c will exit the embedded shell.
In addition to installing the artifacts identified by the coordinates you supply, all of the artifacts'
dependencies will also be installed.
To uninstall a dependency use the uninstall command. As with the install command, it takes one
or more sets of artifact coordinates in the format group:artifact:version. For example:
$ spring uninstall com.example:spring-boot-cli-extension:1.0.0.RELEASE
It will uninstall the artifacts identified by the coordinates you supply and their dependencies.
To uninstall all additional dependencies you can use the --all option. For example:
$ spring uninstall --all
1.4.3.RELEASE
Spring Boot
202
You can mix class declarations with beans{} in the same file as long as they stay at the top level, or
you can put the beans DSL in a separate file if you prefer.
1.4.3.RELEASE
Spring Boot
203
1.4.3.RELEASE
Spring Boot
204
1.4.3.RELEASE
Spring Boot
205
This configuration will repackage a jar or war that is built during the package phase of the Maven
lifecycle. The following example shows both the repackaged jar, as well as the original jar, in the target
directory:
$ mvn package
$ ls target/*.jar
target/myproject-1.0.0.jar target/myproject-1.0.0.jar.original
If you dont include the <execution/> configuration as above, you can run the plugin on its own (but
only if the package goal is used as well). For example:
$ mvn package spring-boot:repackage
$ ls target/*.jar
target/myproject-1.0.0.jar target/myproject-1.0.0.jar.original
If you are using a milestone or snapshot release you will also need to add appropriate
pluginRepository elements:
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<url>http://repo.spring.io/snapshot</url>
1.4.3.RELEASE
Spring Boot
207
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<url>http://repo.spring.io/milestone</url>
</pluginRepository>
</pluginRepositories>
Your existing archive will be enhanced by Spring Boot during the package phase. The main class that
you want to launch can either be specified using a configuration option, or by adding a Main-Class
attribute to the manifest in the usual way. If you dont specify a main class the plugin will search for a
class with a public static void main(String[] args) method.
To build and run a project artifact, you can type the following:
$ mvn package
$ java -jar target/mymodule-0.0.1-SNAPSHOT.jar
To build a war file that is both executable and deployable into an external container you need to mark
the embedded container dependencies as provided, e.g:
<?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 82.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.
1.4.3.RELEASE
Spring Boot
208
Note
The version of the spring-boot gradle plugin that you declare determines the version of the
spring-boot-starter-parent bom that is imported (this ensures that builds are always
repeatable). You should always set the version of the spring-boot gradle plugin to the actual
Spring Boot version that you wish to use. Details of the versions that are provided can be found
in the appendix.
To learn more about the capabilities of the Dependency Management Plugin, please refer to its
documentation.
1.4.3.RELEASE
Spring Boot
209
To build and run a project artifact, you can type the following:
$ gradle build
$ java -jar build/libs/mymodule-0.0.1-SNAPSHOT.jar
To build a war file that is both executable and deployable into an external container, you need to mark the
embedded container dependencies as belonging to the war plugins providedRuntime configuration,
e.g.:
...
apply plugin: 'war'
war {
baseName = 'myapp'
version = '0.5.0'
}
repositories {
jcenter()
maven { url "http://repo.spring.io/libs-snapshot" }
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web")
providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")
...
}
Tip
See the Section 82.1, Create a deployable war file section for more details on how to create
a deployable war file.
If devtools has been added to your project it will automatically monitor your application for changes.
Alternatively, you can also run the application so that your static classpath resources (i.e. in src/main/
resources by default) are reloadable in the live application, which can be helpful at development time.
bootRun {
addResources = true
}
Making static classpath resources reloadable means that bootRun does not use the output of the
processResources task, i.e., when invoked using bootRun, your application will use the resources
in their unprocessed form.
1.4.3.RELEASE
Spring Boot
210
Description
enabled
mainClass
The main class that should be run. If not specified, and you have
applied the application plugin, the mainClassName project
property will be used. If the application plugin has not been
applied or no mainClassName has been specified, the archive
will be searched for a suitable class. "Suitable" means a unique
class with a well-formed main() method (if more than one is
found the build will fail). If you have applied the application plugin,
the main class can also be specified via its "run" task (main
property) and/or its "startScripts" task (mainClassName property)
as an alternative to using the "springBoot" configuration.
classifier
withJarTask
The name or value of the Jar task (defaults to all tasks of type
Jar) which is used to locate the archive to repackage.
customConfiguration
executable
Boolean flag to indicate if jar files are fully executable on Unix like
operating systems. Defaults to false.
embeddedLaunchScript
embeddedLaunchScriptProperties
Additional properties that to be expanded in the launch script. The
default script supports a mode property which can contain the
values auto, service or run.
excludeDevtools
1.4.3.RELEASE
Spring Boot
211
In above example, we created a new clientJar Jar task to package a customized file set from your
compiled sources. Then we created a new clientBoot BootRepackage task and instructed it to work
with only clientJar task and mycustomconfiguration.
configurations {
mycustomconfiguration.exclude group: 'log4j'
}
dependencies {
mycustomconfiguration configurations.runtime
}
Configuration options
The following configuration options are available:
Name
Description
mainClass
providedConfiguration
backupSource
customConfiguration
layout
1.4.3.RELEASE
Spring Boot
212
Name
Description
requiresUnpack
Available layouts
The layout attribute configures the format of the archive and whether the bootstrap loader should be
included or not. The following layouts are available:
Name
Description
Executable
JAR
Yes
WAR
Yes
Yes
MODULE
No
NONE
No
Another option is to instruct the default bootRepackage task to only work with a default jar task.
bootRepackage.withJarTask = jar
If you have a default project setup where the main jar file is created and repackaged, 'and' you still
want to create additional custom jars, you can combine your custom repackage tasks together and use
dependsOn so that the bootJars task will run after the default bootRepackage task is executed:
task bootJars
bootJars.dependsOn = [clientBoot1,clientBoot2,clientBoot3]
build.dependsOn(bootJars)
1.4.3.RELEASE
Spring Boot
213
All the above tweaks are usually used to avoid situations where an already created boot jar is repackaged
again. Repackaging an existing boot jar will not break anything, but you may find that it includes
unnecessary dependencies.
1.4.3.RELEASE
Spring Boot
214
}
}
1.4.3.RELEASE
Spring Boot
215
Youll need to remember to start Ant using the -lib option, for example:
$ ant -lib <folder containing spring-boot-antlib-1.4.3.RELEASE.jar>
Tip
The Using Spring Boot section includes a more complete example of using Apache Ant with
spring-boot-antlib
spring-boot:exejar
The exejar task can be used to creates a Spring Boot executable jar. The following attributes are
supported by the task:
Attribute
Description
Required
destfile
Yes
classes
Yes
start-class
Description
resources
lib
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.
Examples
Specify start-class.
1.4.3.RELEASE
Spring Boot
216
<spring-boot:exejar destfile="target/my-application.jar"
classes="target/classes" start-class="com.foo.MyApplication">
<resources>
<fileset dir="src/main/resources" />
</resources>
<lib>
<fileset dir="lib" />
</lib>
</spring-boot:exejar>
Detect start-class.
<exejar destfile="target/my-application.jar" classes="target/classes">
<lib>
<fileset dir="lib" />
</lib>
</exejar>
65.2 spring-boot:findmainclass
The findmainclass task is used internally by exejar to locate a class declaring a main. You can
also use this task directly in your build if needed. The following attributes are supported
Attribute
Description
Required
classesroot
mainclass
No
property
Examples
Find and log.
<findmainclass classesroot="target/classes" />
1.4.3.RELEASE
Spring Boot
217
1.4.3.RELEASE
Spring Boot
218
1.4.3.RELEASE
Spring Boot
219
1.4.3.RELEASE
Spring Boot
221
Look for @ConditionalOnExpression annotations that switch features on and off in response to
SpEL expressions, normally evaluated with placeholders resolved from the Environment.
by
setting
context.initializer.classes
or
1.4.3.RELEASE
Spring Boot
222
Tip
The spring-boot:run can add src/main/resources directly to the classpath (for hot
reloading purposes) if you enable the addResources flag. This circumvents the resource filtering
and this feature. You can use the exec:java goal instead or customize the plugins configuration,
see the plugin usage page for more details.
If you dont use the starter parent, in your pom.xml you need (inside the <build/> element):
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
Note
The useDefaultDelimiters property is important if you are using standard Spring
placeholders in your configuration (e.g. ${foo}). These may be expanded by the build if that
property is not set to false.
1.4.3.RELEASE
Spring Boot
223
processResources {
expand(project.properties)
}
You can then refer to your Gradle projects properties via placeholders, e.g.
app.name=${name}
app.description=${description}
Note
Gradles expand method uses Groovys SimpleTemplateEngine which transforms ${..}
tokens. The ${..} style conflicts with Springs own property placeholder mechanism. To use
Spring property placeholders together with automatic expansion the Spring property placeholders
need to be escaped like \${..}.
and then the Spring Boot banner will not be printed on startup, and the application will not be a web
application.
Note
The example above also demonstrates how flexible binding allows the use of underscores (_) as
well as dashes (-) in property names.
Properties defined in external configuration overrides the values specified via the Java API with the
notable exception of the sources used to create the ApplicationContext. Lets consider this
application
new SpringApplicationBuilder()
.bannerMode(Banner.Mode.OFF)
.sources(demo.MyApp.class)
.run(args);
The actual application will now show the banner (as overridden by configuration) and use
three sources for the ApplicationContext (in that order): demo.MyApp, com.acme.Config,
com.acme.ExtraConfig.
1.4.3.RELEASE
Spring Boot
224
Tip
If you are inheriting from the spring-boot-starter-parent POM, the default filter token
of the maven-resources-plugins has been changed from ${*} to @ (i.e. @maven.token@
instead of ${maven.token}) to prevent conflicts with Spring-style placeholders. If you have
enabled maven filtering for the application.properties directly, you may want to also
change the default filter token to use other delimiters.
Note
In this specific case the port binding will work in a PaaS environment like Heroku and Cloud
Foundry, since in those two platforms the PORT environment variable is set automatically and
Spring can bind to capitalized synonyms for Environment properties.
1.4.3.RELEASE
Spring Boot
225
Create a file called application.yml and stick it in the root of your classpath, and also add
snakeyaml to your dependencies (Maven coordinates org.yaml:snakeyaml, already included if
you use the spring-boot-starter). A YAML file is parsed to a Java Map<String,Object> (like
a JSON object), and Spring Boot flattens the map so that it is 1-level deep and has period-separated
keys, a lot like people are used to with Properties files in Java.
The example YAML above corresponds to an application.properties file
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.
In Spring Boot you can also set the active profile in application.properties, e.g.
spring.profiles.active=production
A value set this way is replaced by the System property or environment variable setting, but not by
the SpringApplicationBuilder.profiles() method. Thus the latter Java API can be used to
augment the profiles without changing the defaults.
See Chapter 25, Profiles in the Spring Boot features section for more information.
1.4.3.RELEASE
Spring Boot
226
Example:
server:
port: 9000
--spring:
profiles: development
server:
port: 9001
--spring:
profiles: production
server:
port: 0
In this example the default port is 9000, but if the Spring profile development is active then the port is
9001, and if production is active then it is 0.
The YAML documents are merged in the order they are encountered (so later values override earlier
ones).
To do the same thing with properties files you can use application-${profile}.properties to
specify profile-specific values.
1.4.3.RELEASE
Spring Boot
227
1.4.3.RELEASE
Spring Boot
228
@ServletComponentScan and specifying the package(s) containing the components that you want
to register. By default, @ServletComponentScan will scan from the package of the annotated class.
Note
@LocalServerPort is a meta-annotation for @Value("${local.server.port}"). Dont try
to inject the port in a regular application. As we just saw, the value is only set once the container
has initialized; contrary to a test, application code callbacks are processed early (i.e. before the
value is actually available).
1.4.3.RELEASE
Spring Boot
229
server.port=8443
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=secret
server.ssl.key-password=another-secret
Note
The default location for logs is a logs directory relative to the tomcat base dir and said directory
is a temp directory by default so you may want to fix Tomcats base directory or use an absolute
path for the logs. In the example above, the logs will be available in my-tomcat/logs relative
to the working directory of the application.
Access logging for undertow can be configured in a similar fashion
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. This can be
customized via server.undertow.accesslog.directory.
1.4.3.RELEASE
Spring Boot
230
Tomcat is also configured with a default regular expression that matches internal proxies that are to be
trusted. By default, IP addresses in 10/8, 192.168/16, 169.254/16 and 127/8 are trusted. You can
customize the valves configuration by adding an entry to application.properties, e.g.
server.tomcat.internal-proxies=192\\.168\\.\\d{1,3}\\.\\d{1,3}
Note
The double backslashes are only required when youre using a properties file for configuration.
If you are using YAML, single backslashes are sufficient and a value thats equivalent to the one
shown above would be 192\.168\.\d{1,3}\.\d{1,3}.
Note
You can trust all proxies by setting the internal-proxies to empty (but dont do this in
production).
You can take complete control of the configuration of Tomcats RemoteIpValve by switching the
automatic one off (i.e. set server.use-forward-headers=false) and adding a new valve instance
in a TomcatEmbeddedServletContainerFactory bean.
1.4.3.RELEASE
Spring Boot
231
try {
File keystore = new ClassPathResource("keystore").getFile();
File truststore = new ClassPathResource("keystore").getFile();
connector.setScheme("https");
connector.setSecure(true);
connector.setPort(8443);
protocol.setSSLEnabled(true);
protocol.setKeystoreFile(keystore.getAbsolutePath());
protocol.setKeystorePass("changeit");
protocol.setTruststoreFile(truststore.getAbsolutePath());
protocol.setTruststorePass("changeit");
protocol.setKeyAlias("apitester");
return connector;
}
catch (IOException ex) {
throw new IllegalStateException("can't access keystore: [" + "keystore"
+ "] or truststore: [" + "keystore" + "]", ex);
}
}
If at all possible, you should consider updating your code to only store values compliant with later Cookie
specifications. If, however, youre unable to change the way that cookies are written, you can instead
configure Tomcat to use a LegacyCookieProcessor. To switch to the LegacyCookieProcessor
use an EmbeddedServletContainerCustomizer bean that adds a TomcatContextCustomizer:
@Bean
public EmbeddedServletContainerCustomizer cookieProcessorCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
if (container instanceof TomcatEmbeddedServletContainerFactory) {
((TomcatEmbeddedServletContainerFactory) container)
.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
context.setCookieProcessor(new LegacyCookieProcessor());
}
});
}
}
};
}
1.4.3.RELEASE
Spring Boot
232
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
Example in Gradle:
configurations {
compile.exclude module: "spring-boot-starter-tomcat"
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web:1.4.3.RELEASE")
compile("org.springframework.boot:spring-boot-starter-jetty:1.4.3.RELEASE")
// ...
}
Example in Gradle:
configurations {
compile.exclude module: "spring-boot-starter-tomcat"
}
1.4.3.RELEASE
Spring Boot
233
dependencies {
compile("org.springframework.boot:spring-boot-starter-web:1.4.3.RELEASE")
compile("org.springframework.boot:spring-boot-starter-undertow:1.4.3.RELEASE")
// ...
}
1.4.3.RELEASE
Spring Boot
234
</dependencies>
1.4.3.RELEASE
Spring Boot
235
This bean will register any @ServerEndpoint annotated beans with the underlying WebSocket
container. When deployed to a standalone servlet container this role is performed by a servlet container
initializer and the ServerEndpointExporter bean is not required.
1.4.3.RELEASE
Spring Boot
236
By default, responses must be at least 2048 bytes in length for compression to be performed. This can
be configured using the server.compression.min-response-size property.
By default, responses will only be compressed if their content type is one of the following:
text/html
text/xml
text/plain
text/css
This can be configured using the server.compression.mime-types property.
1.4.3.RELEASE
Spring Boot
237
As long as MyThing can be serialized by Jackson2 (e.g. a normal POJO or Groovy object) then
localhost:8080/thing will serve a JSON representation of it by default. Sometimes in a browser
you might see XML responses because browsers tend to send accept headers that prefer XML.
You may also want to add a dependency on Woodstox. Its faster than the default StAX implementation
provided by the JDK and also adds pretty print support and improved namespace handling:
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>woodstox-core-asl</artifactId>
</dependency>
If Jacksons XML extension is not available, JAXB (provided by default in the JDK) will be used, with
the additional requirement to have MyThing annotated as @XmlRootElement:
@XmlRootElement
public class MyThing {
private String name;
// .. getters and setters
}
To get the server to render XML instead of JSON you might have to send an Accept: text/xml
header (or use a browser).
1.4.3.RELEASE
Spring Boot
238
The ObjectMapper (or XmlMapper for Jackson XML converter) instance created by default has the
following customized properties:
MapperFeature.DEFAULT_VIEW_INCLUSION is disabled
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES is disabled
Spring Boot has also some features to make it easier to customize this behavior.
You can configure the ObjectMapper and XmlMapper instances using the environment. Jackson
provides an extensive suite of simple on/off features that can be used to configure various aspects of
its processing. These features are described in six enums in Jackson which map onto properties in the
environment:
Jackson enum
Environment property
com.fasterxml.jackson.databind.DeserializationFeature
spring.jackson.deserialization.<feature_name>=tru
false
com.fasterxml.jackson.core.JsonGenerator.Feature
spring.jackson.generator.<feature_name>=true|
false
com.fasterxml.jackson.databind.MapperFeature
spring.jackson.mapper.<feature_name>=true|
false
com.fasterxml.jackson.core.JsonParser.Feature
spring.jackson.parser.<feature_name>=true|
false
com.fasterxml.jackson.databind.SerializationFeature
spring.jackson.serialization.<feature_name>=true|
false
com.fasterxml.jackson.annotation.JsonInclude.Include
spring.jackson.serializationinclusion=always|non_null|
non_absent|non_default|non_empty
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 doesnt 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 will apply to any mappers created using the builder,
including the auto-configured ObjectMapper bean.
The contexts Jackson2ObjectMapperBuilder can be customized by one or more
Jackson2ObjectMapperBuilderCustomizer beans. Such customizer beans can be ordered and
Boots own customizer has an order of 0, allowing additional customization to be applied both before
and after Boots customization.
Any beans of type com.fasterxml.jackson.databind.Module will be automatically registered
with the auto-configured Jackson2ObjectMapperBuilder and 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
1.4.3.RELEASE
Spring Boot
239
Jackson2ObjectMapperBuilder @Bean. Note that in either case this will disable all autoconfiguration of the `ObjectMapper.
If you provide any @Beans of type MappingJackson2HttpMessageConverter then they will
replace the default value in the MVC configuration. Also, a convenience bean is provided of type
HttpMessageConverters (always available if you use the default MVC configuration) which has
some useful methods to access the default and user-enhanced message converters.
See also the Section 71.4, Customize the @ResponseBody rendering section and the
WebMvcAutoConfiguration source code for more details.
1.4.3.RELEASE
Spring Boot
240
and give it the special bean name dispatcherServlet (You can also create a bean of a different
type with that name if you want to switch it off and not replace it).
1.4.3.RELEASE
Spring Boot
241
If you use Groovy templates (actually if groovy-templates is on your classpath) you will
also have a GroovyMarkupViewResolver with id 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, defaults
classpath:/templates/ and .tpl respectively). It can be overridden by providing a bean of the same
name.
If you use Velocity you will also have a VelocityViewResolver with id velocityViewResolver. It
looks for resources in a loader path (externalized to spring.velocity.resourceLoaderPath,
default classpath:/templates/) by surrounding the view name with a prefix and suffix (externalized
to spring.velocity.prefix and spring.velocity.suffix, with empty and .vm defaults
respectively). It can be overridden by providing a bean of the same name.
Check
out
WebMvcAutoConfiguration,
ThymeleafAutoConfiguration,
FreeMarkerAutoConfiguration,
GroovyTemplateAutoConfiguration
and
VelocityAutoConfiguration
71.9 Velocity
By default, Spring Boot configures a VelocityViewResolver. If you need a
VelocityLayoutViewResolver instead, you can easily configure your own by creating a bean with
name velocityViewResolver. You can also inject the VelocityProperties instance to apply
the base defaults to your custom view resolver.
The following example replaces the auto-configured velocity view resolver with a
VelocityLayoutViewResolver defining a customized layoutUrl and all settings that would have
been applied from the auto-configuration:
@Bean(name = "velocityViewResolver")
public VelocityLayoutViewResolver velocityViewResolver(VelocityProperties properties) {
VelocityLayoutViewResolver resolver = new VelocityLayoutViewResolver();
properties.applyToViewResolver(resolver);
resolver.setLayoutUrl("layout/default.vm");
return resolver;
}
Note
if you are managing dependencies yourself, look at spring-boot-dependencies for the list
of artifacts that are related to those two versions.
To avoid a warning message about the HTML 5 template mode being deprecated and
the HTML template mode being used instead, you may also want to explicitly configure
spring.thymeleaf.mode to be HTML, for example:
1.4.3.RELEASE
Spring Boot
242
spring.thymeleaf.mode: HTML
1.4.3.RELEASE
Spring Boot
243
1.4.3.RELEASE
Spring Boot
244
73. Logging
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-overslf4j (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 only need spring-boot-starter-web since it depends transitively on the logging starter. For
example, using Maven:
<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 then you can do
that in application.properties using the "logging.level" prefix, e.g.
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR
You can also set the location of a file to log to (in addition to the console) 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 (e.g. classpath:logback.xml for Logback), but
you can set the location of the config file using the "logging.config" property.
If you look at that base.xml in the spring-boot jar, you will see that it uses some useful System
properties which the LoggingSystem takes care of creating for you. These are:
${PID} the current process ID.
${LOG_FILE} if logging.file was set in Boots external configuration.
${LOG_PATH} if logging.path was set (representing a directory for log files to live in).
${LOG_EXCEPTION_CONVERSION_WORD} if logging.exception-conversion-word was set
in Boots external configuration.
Spring Boot also provides some nice ANSI colour terminal output on a console (but not in a log file)
using a custom Logback converter. See the default base.xml configuration for details.
1.4.3.RELEASE
Spring Boot
245
If Groovy is on the classpath you should be able to configure Logback with logback.groovy as well
(it will be given preference if present).
Note
The use of the Log4j starters gathers together the dependencies for common logging requirements
(e.g. including having Tomcat use java.util.logging but configuring the output using Log4j
2). See the Actuator Log4j 2 samples for more detail and to see it in action.
1.4.3.RELEASE
Spring Boot
246
Dependencies
File names
YAML
com.fasterxml.jackson.core:jackson-databind
com.fasterxml.jackson.dataformat:jackson-dataformatyaml
log4j2.yaml
log4j2.yml
JSON
com.fasterxml.jackson.core:jackson-databind
log4j2.json
log4j2.jsn
1.4.3.RELEASE
Spring Boot
247
datasource.fancy.jdbcUrl=jdbc:h2:mem:mydb
datasource.fancy.username=sa
datasource.fancy.poolSize=30
Spring Boot also provides a utility builder class DataSourceBuilder that can be used to create one of
the standard data sources (if it is on the classpath), or you can just create your own. If you want to reuse
the customizations of DataSourceProperties, you can easily initialize a DataSourceBuilder from
it:
@Bean
@ConfigurationProperties(prefix="datasource.mine")
public DataSource dataSource(DataSourceProperties properties) {
return properties.initializeDataSourceBuilder()
// additional customizations
.build();
}
spring.datasource.url=jdbc:h2:mem:mydb
spring.datasource.username=sa
datasource.mine.poolSize=30
In this scenario, you keep the standard properties exposed by Spring Boot with your custom
DataSource arrangement. By adding @ConfigurationProperties, you can also expose additional
implementation-specific settings in a dedicated namespace.
See Section 29.1, Configure a DataSource in the Spring Boot features section and the
DataSourceAutoConfiguration class for more details.
Tip
You could also do that if you want to configure a JNDI data-source.
@Bean(destroyMethod="")
@ConfigurationProperties(prefix="datasource.mine")
public DataSource dataSource() throws Exception {
JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
return dataSourceLookup.getDataSource("java:comp/env/jdbc/YourDS");
}
1.4.3.RELEASE
Spring Boot
248
@Bean
@Primary
@ConfigurationProperties(prefix="datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix="datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
The ddl-auto setting is a special case in that it has different defaults depending on whether
you are using an embedded database (create-drop) or not (none). In addition all properties in
spring.jpa.properties.* are passed through as normal JPA properties (with the prefix stripped)
when the local EntityManagerFactory is created.
1.4.3.RELEASE
Spring Boot
249
Spring Boot provides a consistent naming strategy regardless of the Hibernate generation
that you are using. If you are using Hibernate 4, you can customize it using
spring.jpa.hibernate.naming.strategy; Hibernate 5 defines a Physical and Implicit
naming strategies: Spring Boot configures SpringPhysicalNamingStrategy by default. This
implementation provides the same table structure as Hibernate 4. If youd rather use Hibernate 5s
default instead, set the following property:
spring.jpa.hibernate.naming.physicalstrategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
The configuration above almost works on its own. To complete the picture you need to configure
TransactionManagers for the two EntityManagers as well. One of them could be picked up by the
default JpaTransactionManager in Spring Boot if you mark it as @Primary. The other would have
to be explicitly injected into a new instance. Or you might be able to use a JTA transaction manager
spanning both.
If you are using Spring Data, you need to configure @EnableJpaRepositories accordingly:
@Configuration
@EnableJpaRepositories(basePackageClasses = Customer.class,
1.4.3.RELEASE
Spring Boot
250
entityManagerFactoryRef = "customerEntityManagerFactory")
public class CustomerConfiguration {
...
}
@Configuration
@EnableJpaRepositories(basePackageClasses = Order.class,
entityManagerFactoryRef = "orderEntityManagerFactory")
public class OrderConfiguration {
...
}
1.4.3.RELEASE
Spring Boot
251
its index manager then any EntityManagerFactory beans must be configured to depend on the
elasticsearchClient bean:
/**
* {@link EntityManagerFactoryDependsOnPostProcessor} that ensures that
* {@link EntityManagerFactory} beans depend on the {@code elasticsearchClient} bean.
*/
@Configuration
static class ElasticsearchJpaDependencyConfiguration
extends EntityManagerFactoryDependsOnPostProcessor {
ElasticsearchJpaDependencyConfiguration() {
super("elasticsearchClient");
}
}
1.4.3.RELEASE
Spring Boot
252
1.4.3.RELEASE
Spring Boot
253
If you want to use the schema.sql initialization in a JPA app (with Hibernate) then ddlauto=create-drop will lead to errors if Hibernate tries to create the same tables. To avoid those
errors set ddl-auto explicitly to "" (preferable) or "none". Whether or not you use ddl-auto=createdrop you can always use data.sql to initialize new data.
on
startup,
add
the
1.4.3.RELEASE
Spring Boot
254
See LiquibaseProperties for details of available settings like contexts, default schema etc.
There is a Liquibase sample so you can see how to set things up.
1.4.3.RELEASE
Spring Boot
255
76. Messaging
76.1 Disable transacted JMS session
If your JMS broker does not support transacted session, you will have to disable the
support of transactions altogether. If you create your own JmsListenerContainerFactory
there is nothing to do since it wont be transacted by default. If you want to use the
DefaultJmsListenerContainerFactoryConfigurer to reuse Spring Boots default, you can
disable transacted session as follows:
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(
ConnectionFactory connectionFactory,
DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory listenerFactory =
new DefaultJmsListenerContainerFactory();
configurer.configure(listenerFactory, connectionFactory);
listenerFactory.setTransactionManager(null);
listenerFactory.setSessionTransacted(false);
return listenerFactory;
}
This overrides the default factory and this should be applied to any other factory that your application
defines, if any.
1.4.3.RELEASE
Spring Boot
256
1.4.3.RELEASE
Spring Boot
257
78. Actuator
78.1 Change the HTTP port or address of the actuator
endpoints
In a standalone application the Actuator HTTP port defaults to the same as the main HTTP port. To
make the application listen on a different port set the external property management.port. To listen
on a completely different network address (e.g. if you have an internal network for management and
an external one for user applications) you can also set management.address to a valid IP address
that the server is able to bind to.
For more detail look at the ManagementServerProperties source code and Section 47.3,
Customizing the management server port in the Production-ready features section.
1.4.3.RELEASE
Spring Boot
258
79. Security
79.1 Switch off the Spring Boot security configuration
If you define a @Configuration with @EnableWebSecurity anywhere in your application it will
switch off the default webapp security settings in Spring Boot (but leave the Actuators security enabled).
To tweak the defaults try setting properties in security.* (see SecurityProperties for details of
available settings) and SECURITY section of Common application properties.
You will get the best results if you put this in a nested class, or a standalone class (i.e. 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 (e.g. 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 it happens before the
authentication manager is needed elsewhere), e.g.
@Configuration
public class AuthenticationManagerConfiguration extends
GlobalAuthenticationConfigurerAdapter {
@Override
public void init(AuthenticationManagerBuilder auth) {
auth.inMemoryAuthentication() // ... etc.
}
}
1.4.3.RELEASE
Spring Boot
259
RemoteIpValve automatically if it detects some environment settings, and you should be able to
rely on the HttpServletRequest to report whether it is secure or not (even downstream of a proxy
server that handles the real SSL termination). The standard behavior is determined by the presence or
absence of certain request headers (x-forwarded-for and x-forwarded-proto), whose names
are conventional, so it should work with most front end proxies. You can switch on the valve by adding
some entries to application.properties, e.g.
server.tomcat.remote_ip_header=x-forwarded-for
server.tomcat.protocol_header=x-forwarded-proto
(The presence of either of those properties will switch on the valve. Or you can add the RemoteIpValve
yourself by adding a TomcatEmbeddedServletContainerFactory bean.)
Spring Security can also be configured to require a secure channel for all (or some requests). To
switch that on in a Spring Boot application you just need to set security.require_ssl to true in
application.properties.
1.4.3.RELEASE
Spring Boot
260
Thymeleaf templates
If you are using Thymeleaf, then set spring.thymeleaf.cache
ThymeleafAutoConfiguration for other Thymeleaf customization options.
to
false.
See
to
false.
See
FreeMarker templates
If you are using FreeMarker, then set spring.freemarker.cache
FreeMarkerAutoConfiguration for other FreeMarker customization options.
Groovy templates
If you are using Groovy templates, then set spring.groovy.template.cache to false. See
GroovyTemplateAutoConfiguration for other Groovy customization options.
Velocity templates
If you are using Velocity, then set spring.velocity.cache
VelocityAutoConfiguration for other Velocity customization options.
to
false.
See
1.4.3.RELEASE
Spring Boot
261
Spring Loaded goes a little further in that it can reload class definitions with changes in the method
signatures. With some customization it can force an ApplicationContext to refresh itself (but there
is no general mechanism to ensure that would be safe for a running application anyway, so it would
only ever be a development time trick probably).
This normally works pretty well with Eclipse and IntelliJ IDEA as long as they have their build
configuration aligned with the Maven defaults (Eclipse m2e does this out of the box).
Configuring Spring Loaded for use with Gradle and IntelliJ IDEA
You need to jump through a few hoops if you want to use Spring Loaded in combination with Gradle and
IntelliJ IDEA. By default, IntelliJ IDEA will compile classes into a different location than Gradle, causing
Spring Loaded monitoring to fail.
To configure IntelliJ IDEA correctly you can use the idea Gradle plugin:
buildscript {
repositories { jcenter() }
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:1.4.3.RELEASE"
classpath 'org.springframework:springloaded:1.2.0.RELEASE'
}
}
apply plugin: 'idea'
idea {
module {
inheritOutputDirs = false
outputDir = file("$buildDir/classes/main/")
}
}
// ...
Note
IntelliJ IDEA must be configured to use the same Java version as the command line Gradle task
and springloaded must be included as a buildscript dependency.
You can also additionally enable Make Project Automatically inside IntelliJ IDEA to automatically
compile your code whenever a file is saved.
1.4.3.RELEASE
Spring Boot
262
81. Build
81.1 Generate build information
Both the Maven and Gradle plugin allow to generate build information containing the coordinates, name
and version of the project. The plugin can also be configured to add additional properties through
configuration. When such file is present, Spring Boot auto-configures a BuildProperties bean.
To generate build information with Maven, add an execution for the build-info goal:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.4.3.RELEASE</version>
<executions>
<execution>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Tip
Check the Spring Boot Maven Plugin documentation for more details.
And to do the same with Gradle:
springBoot {
buildInfo()
}
1.4.3.RELEASE
Spring Boot
263
</plugin>
</plugins>
</build>
Gradle users can achieve the same result using the gradle-git-properties plugin
plugins {
id "com.gorylenko.gradle-git-properties" version "1.4.6"
}
Note
This only works if your Maven project inherits (directly or indirectly) from springboot-dependencies. If you have added spring-boot-dependencies in your own
dependencyManagement section with <scope>import</scope> you have to redefine the
artifact yourself instead of overriding the property.
Warning
Each Spring Boot release is designed and tested against a specific set of third-party
dependencies. Overriding versions may cause compatibility issues.
To override dependency versions in Gradle, you can specify a version as shown below:
ext['slf4j.version'] = '1.7.5'
For additional information, please refer to the Gradle Dependency Management Plugin documentation.
If you are not using the parent POM you can still use the plugin, however, you must additionally add
an <executions> section:
1.4.3.RELEASE
Spring Boot
264
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.4.3.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
1.4.3.RELEASE
Spring Boot
265
To deal with any problematic libraries, you can flag that specific nested jars should be automatically
unpacked to the temp folder when the executable jar first runs.
For example, to indicate that JRuby should be flagged for unpack using the Maven Plugin you would
add the following configuration:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<requiresUnpack>
<dependency>
<groupId>org.jruby</groupId>
<artifactId>jruby-complete</artifactId>
</dependency>
</requiresUnpack>
</configuration>
</plugin>
</plugins>
</build>
1.4.3.RELEASE
Spring Boot
266
In Gradle you can create a new JAR archive with standard task DSL features, and then have the
bootRepackage task depend on that one using its withJarTask property:
jar {
baseName = 'spring-boot-sample-profile'
version = '0.0.0'
excludes = ['**/application.yml']
}
task('execJar', type:Jar, dependsOn: 'jar') {
baseName = 'spring-boot-sample-profile'
version = '0.0.0'
classifier = 'exec'
from sourceSets.main.output
}
bootRepackage {
withJarTask = tasks['execJar']
}
Command line:
$ gradle bootRun --debug-jvm
1.4.3.RELEASE
Spring Boot
267
The Ant Sample has a build.xml with a manual task that should work if you run it with
$ ant -lib <folder containing ivy-2.2.jar> clean manual
1.4.3.RELEASE
Spring Boot
268
Jackson
Jackson 2.7 and later requires Java 7. If you want to use Jackson with Java 6 you will have to downgrade
to Jackson 2.6.
1.4.3.RELEASE
Spring Boot
269
The next step is to update your build configuration so that your project produces a war file rather than a
jar file. If youre using Maven and using spring-boot-starter-parent (which configures Mavens
war plugin for you) all you need to do is modify pom.xml to change the packaging to war:
<packaging>war</packaging>
If youre using Gradle, you need to modify build.gradle to apply the war plugin to the project:
apply plugin: 'war'
The final step in the process is to ensure that the embedded servlet container doesnt interfere with
the servlet container to which the war file will be deployed. To do so, you need to mark the embedded
servlet container dependency as provided.
If youre using Maven:
<dependencies>
<!-- -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- -->
</dependencies>
1.4.3.RELEASE
Spring Boot
270
Note
If you are using a version of Gradle that supports compile only dependencies (2.12 or
later), you should continue to use providedRuntime. Among other limitations, compileOnly
dependencies are not on the test classpath so any web-based integration tests will fail.
If youre using the Spring Boot build tools, marking the embedded servlet container dependency as
provided will produce an executable war file with the provided dependencies packaged in a libprovided directory. This means that, in addition to being deployable to a servlet container, you can
also run your application using java -jar on the command line.
Tip
Take a look at Spring Boots sample applications for a Maven-based example of the abovedescribed configuration.
Remember that whatever you put in the sources is just a Spring ApplicationContext and 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 first.
Static resources can be moved to /public (or /static or /resources or /META-INF/resources)
in the classpath root. Same for messages.properties (Spring Boot detects this automatically in the
root of the classpath).
1.4.3.RELEASE
Spring Boot
271
Vanilla usage of Spring DispatcherServlet and Spring Security should require no further changes. If
you have other features in your application, using other servlets or filters for instance, then you may need
to add some configuration to your Application context, replacing those elements from the web.xml
as follows:
A @Bean of type Servlet or ServletRegistrationBean installs that bean in the container as if
it was a <servlet/> and <servlet-mapping/> in web.xml.
A @Bean of type Filter or FilterRegistrationBean behaves similarly (like a <filter/> and
<filter-mapping/>.
An ApplicationContext in an XML file can be added to an @Import in your Application. Or
simple cases where annotation configuration is heavily used already can be recreated in a few lines
as @Bean definitions.
Once the war is working we make it executable by adding a main method to our Application, e.g.
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
SpringBootServletInitializer callback and the main method, something like:
@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);
}
}
1.4.3.RELEASE
Spring Boot
272
can be moved into a SpringBootServletInitializer. If your existing application has more than
one ApplicationContext (e.g. if it uses AbstractDispatcherServletInitializer) then you
might be able to squash all your context sources into a single SpringApplication. The main
complication you might encounter is if that doesnt 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 will usually need 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 a Spring Boot application,
and the guidance above might help, but your mileage may vary.
If you use logback, you will also need to tell WebLogic to prefer the packaged version rather than the
version that pre-installed with the server. You can do this by adding a WEB-INF/weblogic.xml file
with the following contents:
<?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>
1.4.3.RELEASE
Spring Boot
273
In this example we are using a single application context (the one created by the context listener)
and attaching it to the DispatcherServlet using an init parameter. This is normal in a Spring Boot
application (you normally only have one application context).
1.4.3.RELEASE
Spring Boot
274
Part X. Appendices
===================================================================
COMMON SPRING BOOT PROPERTIES
This sample file is provided as a guideline. Do NOT copy it in its
entirety to your own application.
^^^
===================================================================
1.4.3.RELEASE
Spring Boot
276
1.4.3.RELEASE
Spring Boot
277
1.4.3.RELEASE
Spring Boot
278
1.4.3.RELEASE
Spring Boot
279
1.4.3.RELEASE
Spring Boot
280
1.4.3.RELEASE
Spring Boot
281
1.4.3.RELEASE
Spring Boot
282
1.4.3.RELEASE
Spring Boot
283
1.4.3.RELEASE
Spring Boot
284
1.4.3.RELEASE
Spring Boot
285
1.4.3.RELEASE
Spring Boot
286
1.4.3.RELEASE
Spring Boot
287
1.4.3.RELEASE
Spring Boot
288
1.4.3.RELEASE
Spring Boot
289
1.4.3.RELEASE
Spring Boot
290
1.4.3.RELEASE
Spring Boot
291
1.4.3.RELEASE
Spring Boot
292
1.4.3.RELEASE
Spring Boot
293
1.4.3.RELEASE
Spring Boot
294
management.shell.auth.key.path= # Path to the authentication key. This should point to a valid ".pem"
file.
management.shell.auth.simple.user.name=user # Login user.
management.shell.auth.simple.user.password= # Login password.
management.shell.auth.spring.roles=ADMIN # Comma-separated list of required roles to login to the CRaSH
console.
management.shell.command-path-patterns=classpath*:/commands/**,classpath*:/crash/commands/** # Patterns
to use to look for commands.
management.shell.command-refresh-interval=-1 # Scan for changes and update the command if necessary (in
seconds).
management.shell.config-path-patterns=classpath*:/crash/* # Patterns to use to look for configurations.
management.shell.disabled-commands=jpa*,jdbc*,jndi* # Comma-separated list of commands to disable.
management.shell.disabled-plugins= # Comma-separated list of plugins to disable. Certain plugins are
disabled by default based on the environment.
management.shell.ssh.auth-timeout = # Number of milliseconds after user will be prompted to login again.
management.shell.ssh.enabled=true # Enable CRaSH SSH support.
management.shell.ssh.idle-timeout = # Number of milliseconds after which unused connections are closed.
management.shell.ssh.key-path= # Path to the SSH server key.
management.shell.ssh.port=2000 # SSH port.
management.shell.telnet.enabled=false # Enable CRaSH telnet support. Enabled by default if the
TelnetPlugin is available.
management.shell.telnet.port=5000 # Telnet port.
# TRACING (TraceProperties)
management.trace.include=request-headers,response-headers,cookies,errors # Items to be included in the
trace.
# METRICS EXPORT (MetricExportProperties)
spring.metrics.export.aggregate.key-pattern= # Pattern that tells the aggregator what to do with the
keys from the source repository.
spring.metrics.export.aggregate.prefix= # Prefix for global repository if active.
spring.metrics.export.delay-millis=5000 # Delay in milliseconds between export ticks. Metrics are
exported to external sources on a schedule with this delay.
spring.metrics.export.enabled=true # Flag to enable metric export (assuming a MetricWriter is
available).
spring.metrics.export.excludes= # List of patterns for metric names to exclude. Applied after the
includes.
spring.metrics.export.includes= # List of patterns for metric names to include.
spring.metrics.export.redis.key=keys.spring.metrics # Key for redis repository export (if active).
spring.metrics.export.redis.prefix=spring.metrics # Prefix for redis repository if active.
spring.metrics.export.send-latest= # Flag to switch off any available optimizations based on not
exporting unchanged metric values.
spring.metrics.export.statsd.host= # Host of a statsd server to receive exported metrics.
spring.metrics.export.statsd.port=8125 # Port of a statsd server to receive exported metrics.
spring.metrics.export.statsd.prefix= # Prefix for statsd exported metrics.
spring.metrics.export.triggers.*= # Specific trigger properties per MetricWriter bean name.
1.4.3.RELEASE
Spring Boot
295
1.4.3.RELEASE
Spring Boot
296
1.4.3.RELEASE
Spring Boot
297
},
{
"value": "create",
"description": "Create the schema and destroy previous data."
},
{
"value": "create-drop",
"description": "Create and then destroy the schema at the end of the session."
}
]
}
]}
Each property is a configuration item that the user specifies with a given value. For example
server.port and server.servlet-path might be specified in application.properties as
follows:
server.port=9090
server.servlet-path=/home
The groups are higher level items that dont themselves specify a value, but instead provide a
contextual grouping for properties. For example the server.port and server.servlet-path
properties are part of the server group.
Note
It is not required that every property has a group, some properties might just exist in their own
right.
Finally, hints are additional information used to assist the user in configuring a given property. When
configuring the spring.jpa.hibernate.ddl-auto property, a tool can use it to offer some autocompletion help for the none, validate, update, create and create-drop values.
Group Attributes
The JSON object contained in the groups array can contain the following attributes:
Name
Type
Purpose
name
String
type
String
description String
String
The class name of the source that contributed this group. For
example, if the group was based on a @Bean method annotated
sourceType
1.4.3.RELEASE
Spring Boot
298
Name
Type
Purpose
with @ConfigurationProperties this attribute would contain
the fully qualified name of the @Configuration class containing
the method. The attribute may be omitted if the source type is not
known.
sourceMethod String
Property Attributes
The JSON object contained in the properties array can contain the following attributes:
Name
Type
Purpose
name
String
type
String
The full signature of the data type of the property. For example,
java.lang.String but also a full generic type such as
java.util.Map<java.util.String,acme.MyEnum>. This
attribute can be used to guide the user as to the types of values
that they can enter. For consistency, the type of a primitive is
specified using its wrapper counterpart, i.e. boolean becomes
java.lang.Boolean. Note that this class may be a complex
type that gets converted from a String as values are bound. May
be omitted if the type is not known.
description String
String
defaultValue Object
The default value which will be used if the property is not specified.
Can also be an array of value(s) if the type of the property is an
array. May be omitted if the default value is not known.
deprecation Deprecation
sourceType
The JSON object contained in the deprecation attribute of each properties element can contain
the following attributes:
1.4.3.RELEASE
Spring Boot
299
Name
Type
Purpose
reason
String
replacement String
Note
Prior to Spring Boot 1.3, a single deprecated boolean attribute can be used instead of the
deprecation element. This is still supported in a deprecated fashion and should no longer be
used. If no reason and replacement are available, an empty deprecation object should be set.
Deprecation
can
also
be
specified
declaratively
in
code
by
adding
the
@DeprecatedConfigurationProperty annotation to the getter exposing the deprecated property.
For instance, lets assume the app.foo.target property was confusing and was renamed to
app.foo.name
@ConfigurationProperties("app.foo")
public class FooProperties {
private String name;
public String getName() { ... }
public void setName(String name) { ... }
@DeprecatedConfigurationProperty(replacement = "app.foo.name")
@Deprecated
public String getTarget() {
return getName();
}
@Deprecated
public void setTarget(String target) {
setName(target);
}
}
The code above makes sure that the deprecated property still works (delegating to the name property
behind the scenes). Once the getTarget and setTarget methods can be removed from your public
API, the automatic deprecation hint in the meta-data will go away as well.
Hint Attributes
The JSON object contained in the hints array can contain the following attributes:
Name
Type
Purpose
name
String
The full name of the property that this hint refers to. Names are
in lowercase dashed form (e.g. server.servlet-path). If the
property refers to a map (e.g. system.contexts) the hint either
1.4.3.RELEASE
Spring Boot
300
Name
Type
Purpose
applies to the keys of the map (system.context.keys) or the
values (system.context.values). This attribute is mandatory.
values
ValueHint[]
providers
The JSON object contained in the values attribute of each hint element can contain the following
attributes:
Name
Type
Purpose
value
Object
A valid value for the element to which the hint refers to. Can also
be an array of value(s) if the type of the property is an array. This
attribute is mandatory.
description String
The JSON object contained in the providers attribute of each hint element can contain the following
attributes:
Name
Type
Purpose
name
String
parameters
JSON object
1.4.3.RELEASE
Spring Boot
301
Value hint
The name attribute of each hint refers to the name of a property. In the initial example above, we provide
5 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 be used to refer to the keys and the values
respectively.
Lets assume a foo.contexts that maps magic String values to an integer:
@ConfigurationProperties("foo")
public class FooProperties {
private Map<String,Integer> contexts;
// getters and setters
}
The magic values are foo and bar for instance. In order to offer additional content assistance for the
keys, you could add the following to the manual meta-data of the module:
{"hints": [
{
"name": "foo.contexts.keys",
"values": [
{
"value": "foo"
},
{
"value": "bar"
}
]
}
]}
Note
Of course, you should have an Enum for those two values instead. This is by far the most effective
approach to auto-completion if your IDE supports it.
Value provider
Providers are a powerful way of attaching semantics to a property. We define in the section below the
official providers that you can use for your own hints. Bare in mind however that your favorite IDE may
implement some of these or none of them. It could eventually provide its own as well.
Note
As this is a new feature, IDE vendors will have to catch up with this new feature.
The table below summarizes the list of supported providers:
Name
Description
any
1.4.3.RELEASE
Spring Boot
302
Name
Description
class-reference
handle-as
Handle the property as if it was defined by the type defined via the
mandatory target parameter.
logger-name
spring-bean-reference
spring-profile-name
Tip
No more than one provider can be active for a given property but you can specify several providers
if they can all manage the property in some ways. Make sure to place the most powerful provider
first as the IDE must use the first one in the JSON section it can handle. If no provider for a given
property is supported, no special content assistance is provided either.
Any
The any provider permits any additional values to be provided. Regular value validation based on the
property type should be applied if this is supported.
This provider will be typically used if you have a list of values and any extra values are still to be
considered as valid.
The example below offers on and off as auto-completion values for system.state; any other value
is also allowed:
{"hints": [
{
"name": "system.state",
"values": [
{
"value": "on"
},
{
"value": "off"
}
],
"providers": [
{
"name": "any"
}
]
}
]}
Class reference
The class-reference provider auto-completes classes available in the project. This provider supports
these parameters:
1.4.3.RELEASE
Spring Boot
303
Parameter Type
Default value
Description
target
none
true
String
(Class)
concrete boolean
Handle As
The handle-as provider allows you to substitute the type of the property to a more high-level type. This
typically happens when the property has a java.lang.String type because you dont want your
configuration classes to rely on classes that may not be on the classpath. This provider supports these
parameters:
Parameter Type
Default value
Description
target
none
String
(Class)
1.4.3.RELEASE
Spring Boot
304
Note
If multiple values can be provided, use a Collection or Array type to teach the IDE about it.
The meta-data snippet below corresponds to the standard liquibase.change-log property
that defines the path to the changelog to use. It is actually used internally as a
org.springframework.core.io.Resource but cannot be exposed as such as we need to keep
the original String value to pass it to the Liquibase API.
{"hints": [
{
"name": "liquibase.change-log",
"providers": [
{
"name": "handle-as",
"parameters": {
"target": "org.springframework.core.io.Resource"
}
}
]
}
]}
Logger name
The logger-name provider auto-completes valid logger names. Typically, package and class names
available in the current project can be auto-completed. Specific frameworks may have extra magic
logger names that could be supported as well.
Since a logger name can be any arbitrary name, really, this provider should allow any value but could
highlight valid packages and class names that are not available in the projects classpath.
The meta-data snippet below corresponds to the standard logging.level property, keys are logger
names and values correspond to the standard log levels or any custom level:
{"hints": [
{
"name": "logging.level.keys",
"values": [
{
"value": "root",
"description": "Root logger used to assign the default logging level."
}
],
"providers": [
{
"name": "logger-name"
}
]
},
{
"name": "logging.level.values",
"values": [
{
"value": "trace"
},
{
"value": "debug"
},
{
"value": "info"
},
{
"value": "warn"
},
1.4.3.RELEASE
Spring Boot
305
{
"value": "error"
},
{
"value": "fatal"
},
{
"value": "off"
}
],
"providers": [
{
"name": "any"
}
]
}
]}
Default value
Description
target
none
String
(Class)
The meta-data snippet below corresponds to the standard spring.jmx.server property that defines
the name of the MBeanServer bean to use:
{"hints": [
{
"name": "spring.jmx.server",
"providers": [
{
"name": "spring-bean-reference",
"parameters": {
"target": "javax.management.MBeanServer"
}
}
]
}
]}
Note
The binder is not aware of the meta-data so if you provide that hint, you will still need to transform
the bean name into an actual Bean reference using the ApplicationContext.
Spring profile name
The spring-profile-name provider auto-completes the Spring profiles that are defined in the
configuration of the current project.
The meta-data snippet below corresponds to the standard spring.profiles.active property that
defines the name of the Spring profile(s) to enable:
{"hints": [
{
1.4.3.RELEASE
Spring Boot
306
"name": "spring.profiles.active",
"providers": [
{
"name": "spring-profile-name"
}
]
}
]}
Note
You need to add compileJava.dependsOn(processResources) to your build to ensure
that resources are processed before code is compiled. Without this directive any additionalspring-configuration-metadata.json files will not be processed.
The processor will pick up both classes and methods that are annotated with
@ConfigurationProperties. The Javadoc for field values within configuration classes will be used
to populate the description attribute.
Note
You should only use simple text with @ConfigurationProperties field Javadoc since they
are not processed before being added to the JSON.
Properties are discovered via the presence of standard getters and setters with special handling for
collection types (that will be 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 only
runs once. There are several ways to do this: with Maven, you can configure the maven-apt-
1.4.3.RELEASE
Spring Boot
307
plugin explicitly and add the dependency to the annotation processor only there. You could also
let the AspectJ plugin run all the processing and disable annotation processing in the mavencompiler-plugin configuration:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<proc>none</proc>
</configuration>
</plugin>
Nested properties
The annotation processor will automatically consider inner classes as nested properties. For example,
the following class:
@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
}
}
1.4.3.RELEASE
Spring Boot
308
Appendix C. Auto-configuration
classes
Here is a list of all auto-configuration classes provided by Spring Boot with links to documentation and
source code. Remember to also look at the autoconfig report in your application for more details of
which features are switched on. (start the app with --debug or -Ddebug, or in an Actuator application
use the autoconfig endpoint).
Links
ActiveMQAutoConfiguration
javadoc
AopAutoConfiguration
javadoc
ArtemisAutoConfiguration
javadoc
BatchAutoConfiguration
javadoc
CacheAutoConfiguration
javadoc
CassandraAutoConfiguration
javadoc
CassandraDataAutoConfiguration
javadoc
CassandraRepositoriesAutoConfiguration
javadoc
CloudAutoConfiguration
javadoc
ConfigurationPropertiesAutoConfiguration
javadoc
CouchbaseAutoConfiguration
javadoc
CouchbaseDataAutoConfiguration
javadoc
CouchbaseRepositoriesAutoConfiguration
javadoc
DataSourceAutoConfiguration
javadoc
DataSourceTransactionManagerAutoConfiguration
javadoc
DeviceDelegatingViewResolverAutoConfiguration
javadoc
DeviceResolverAutoConfiguration
javadoc
DispatcherServletAutoConfiguration
javadoc
ElasticsearchAutoConfiguration
javadoc
ElasticsearchDataAutoConfiguration
javadoc
ElasticsearchRepositoriesAutoConfiguration
javadoc
EmbeddedMongoAutoConfiguration
javadoc
1.4.3.RELEASE
Spring Boot
309
Configuration Class
Links
EmbeddedServletContainerAutoConfiguration
javadoc
ErrorMvcAutoConfiguration
javadoc
FacebookAutoConfiguration
javadoc
FallbackWebSecurityAutoConfiguration
javadoc
FlywayAutoConfiguration
javadoc
FreeMarkerAutoConfiguration
javadoc
GroovyTemplateAutoConfiguration
javadoc
GsonAutoConfiguration
javadoc
H2ConsoleAutoConfiguration
javadoc
HazelcastAutoConfiguration
javadoc
HazelcastJpaDependencyAutoConfiguration
javadoc
HibernateJpaAutoConfiguration
javadoc
HornetQAutoConfiguration
javadoc
HttpEncodingAutoConfiguration
javadoc
HttpMessageConvertersAutoConfiguration
javadoc
HypermediaAutoConfiguration
javadoc
IntegrationAutoConfiguration
javadoc
JacksonAutoConfiguration
javadoc
JdbcTemplateAutoConfiguration
javadoc
JerseyAutoConfiguration
javadoc
JestAutoConfiguration
javadoc
JmsAutoConfiguration
javadoc
JmxAutoConfiguration
javadoc
JndiConnectionFactoryAutoConfiguration
javadoc
JndiDataSourceAutoConfiguration
javadoc
JooqAutoConfiguration
javadoc
JpaRepositoriesAutoConfiguration
javadoc
JtaAutoConfiguration
javadoc
LinkedInAutoConfiguration
javadoc
LiquibaseAutoConfiguration
javadoc
1.4.3.RELEASE
Spring Boot
310
Configuration Class
Links
MailSenderAutoConfiguration
javadoc
MailSenderValidatorAutoConfiguration
javadoc
MessageSourceAutoConfiguration
javadoc
MongoAutoConfiguration
javadoc
MongoDataAutoConfiguration
javadoc
MongoRepositoriesAutoConfiguration
javadoc
MultipartAutoConfiguration
javadoc
MustacheAutoConfiguration
javadoc
Neo4jDataAutoConfiguration
javadoc
Neo4jRepositoriesAutoConfiguration
javadoc
OAuth2AutoConfiguration
javadoc
PersistenceExceptionTranslationAutoConfiguration
javadoc
ProjectInfoAutoConfiguration
javadoc
PropertyPlaceholderAutoConfiguration
javadoc
RabbitAutoConfiguration
javadoc
ReactorAutoConfiguration
javadoc
RedisAutoConfiguration
javadoc
RedisRepositoriesAutoConfiguration
javadoc
RepositoryRestMvcAutoConfiguration
javadoc
SecurityAutoConfiguration
javadoc
SecurityFilterAutoConfiguration
javadoc
SendGridAutoConfiguration
javadoc
ServerPropertiesAutoConfiguration
javadoc
SessionAutoConfiguration
javadoc
SitePreferenceAutoConfiguration
javadoc
SocialWebAutoConfiguration
javadoc
SolrAutoConfiguration
javadoc
SolrRepositoriesAutoConfiguration
javadoc
SpringApplicationAdminJmxAutoConfiguration
javadoc
SpringDataWebAutoConfiguration
javadoc
1.4.3.RELEASE
Spring Boot
311
Configuration Class
Links
ThymeleafAutoConfiguration
javadoc
TransactionAutoConfiguration
javadoc
TwitterAutoConfiguration
javadoc
VelocityAutoConfiguration
javadoc
WebClientAutoConfiguration
javadoc
WebMvcAutoConfiguration
javadoc
WebServicesAutoConfiguration
javadoc
WebSocketAutoConfiguration
javadoc
WebSocketMessagingAutoConfiguration
javadoc
XADataSourceAutoConfiguration
javadoc
Links
AuditAutoConfiguration
javadoc
CacheStatisticsAutoConfiguration
javadoc
CrshAutoConfiguration
javadoc
EndpointAutoConfiguration
javadoc
EndpointMBeanExportAutoConfiguration
javadoc
EndpointWebMvcAutoConfiguration
javadoc
HealthIndicatorAutoConfiguration
javadoc
InfoContributorAutoConfiguration
javadoc
JolokiaAutoConfiguration
javadoc
ManagementServerPropertiesAutoConfiguration
javadoc
ManagementWebSecurityAutoConfiguration
javadoc
MetricExportAutoConfiguration
javadoc
MetricFilterAutoConfiguration
javadoc
MetricRepositoryAutoConfiguration
javadoc
MetricsChannelAutoConfiguration
javadoc
MetricsDropwizardAutoConfiguration
javadoc
PublicMetricsAutoConfiguration
javadoc
1.4.3.RELEASE
Spring Boot
312
Configuration Class
Links
TraceRepositoryAutoConfiguration
javadoc
TraceWebFilterAutoConfiguration
javadoc
1.4.3.RELEASE
Spring Boot
313
Imported auto-configuration
@DataJpaTest
org.springframework.boot.autoconfigure.cache.Cach
org.springframework.boot.autoconfigure.data.jpa.J
org.springframework.boot.autoconfigure.flyway.Fly
org.springframework.boot.autoconfigure.jdbc.DataS
org.springframework.boot.autoconfigure.jdbc.DataS
org.springframework.boot.autoconfigure.jdbc.JdbcT
org.springframework.boot.autoconfigure.liquibase.
org.springframework.boot.autoconfigure.orm.jpa.Hi
org.springframework.boot.autoconfigure.transactio
org.springframework.boot.test.autoconfigure.orm.j
org.springframework.boot.test.autoconfigure.orm.j
@JsonTest
org.springframework.boot.autoconfigure.cache.Cach
org.springframework.boot.autoconfigure.gson.GsonA
org.springframework.boot.autoconfigure.jackson.Ja
org.springframework.boot.test.autoconfigure.json.
@RestClientTest
org.springframework.boot.autoconfigure.cache.Cach
org.springframework.boot.autoconfigure.gson.GsonA
org.springframework.boot.autoconfigure.jackson.Ja
org.springframework.boot.autoconfigure.web.HttpMe
org.springframework.boot.autoconfigure.web.WebCli
org.springframework.boot.test.autoconfigure.web.c
org.springframework.boot.test.autoconfigure.web.c
@WebMvcTest
org.springframework.boot.autoconfigure.MessageSou
org.springframework.boot.autoconfigure.cache.Cach
org.springframework.boot.autoconfigure.freemarker
org.springframework.boot.autoconfigure.groovy.tem
org.springframework.boot.autoconfigure.gson.GsonA
org.springframework.boot.autoconfigure.hateoas.Hy
org.springframework.boot.autoconfigure.jackson.Ja
org.springframework.boot.autoconfigure.mustache.M
org.springframework.boot.autoconfigure.thymeleaf.
org.springframework.boot.autoconfigure.web.HttpMe
org.springframework.boot.autoconfigure.web.WebMvc
org.springframework.boot.test.autoconfigure.web.s
org.springframework.boot.test.autoconfigure.web.s
org.springframework.boot.test.autoconfigure.web.s
org.springframework.boot.test.autoconfigure.web.s
1.4.3.RELEASE
Spring Boot
314
1.4.3.RELEASE
Spring Boot
315
| +-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
Dependencies should be placed in a nested WEB-INF/lib directory. Any dependencies that are
required when running embedded but are not required when deploying to a traditional web container
should be placed in WEB-INF/lib-provided.
The example above shows how A.class can be found in /BOOT-INF/classes in myapp.jar
position 0063. B.class from the nested jar can actually be found in myapp.jar position 3452 and
C.class is at position 3980.
Armed with this information, we can load specific nested entries by simply seeking to the appropriate
part of the outer jar. We dont need to unpack the archive and we dont need to read all entry data into
memory.
1.4.3.RELEASE
Spring Boot
316
Launcher manifest
You need to specify an appropriate Launcher as the Main-Class attribute of META-INF/
MANIFEST.MF. The actual class that you want to launch (i.e. the class that you wrote that contains a
main method) should be specified in the Start-Class attribute.
For example, here is a typical MANIFEST.MF for an executable jar file:
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.mycompany.project.MyApplication
Note
You do not need to specify Class-Path entries in your manifest file, the classpath will be deduced
from the nested jars.
Exploded archives
Certain PaaS implementations may choose to unpack archives before they run. For example, Cloud
Foundry operates in this way. You can run an unpacked archive by simply starting the appropriate
launcher:
$ unzip -q myapp.jar
$ java org.springframework.boot.loader.JarLauncher
Purpose
loader.path
loader.home
1.4.3.RELEASE
Spring Boot
317
Key
Purpose
loader.args
loader.main
loader.config.name
loader.config.location
loader.system
When specified as environment variables or manifest entries, the following names should be used:
Key
Manifest entry
Environment variable
loader.path
Loader-Path
LOADER_PATH
loader.home
LOADER_HOME
loader.args
Loader-Args
LOADER_ARGS
loader.main
Start-Class
LOADER_MAIN
loader.config.location
LOADER_CONFIG_LOCATION
loader.system
LOADER_SYSTEM
Tip
Build plugins automatically move the Main-Class attribute to Start-Class when the fat jar is
built. If you are using that, specify the name of the class to launch using the Main-Class attribute
and leave out Start-Class.
loader.home is the directory location of an additional properties file (overriding the default) as long
as loader.config.location is not specified.
loader.path can contain directories (scanned recursively for jar and zip files), archive paths, or
wildcard patterns (for the default JVM behavior).
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.
Placeholder replacement is done from System and environment variables plus the properties file itself
on all values before use.
1.4.3.RELEASE
Spring Boot
318
System ClassLoader
Launched applications should use Thread.getContextClassLoader() when loading classes
(most libraries and frameworks will do this by default). Trying to load nested jar classes via
ClassLoader.getSystemClassLoader() will fail. Please be aware that java.util.Logging
always uses the system classloader, for this reason you should consider a different logging
implementation.
1.4.3.RELEASE
Spring Boot
319
Artifact ID
Version
antlr
antlr
2.7.7
ch.qos.logback
logback-access
1.1.8
ch.qos.logback
logback-classic
1.1.8
ch.qos.logback
logback-core
1.1.8
com.atomikos
transactions-jdbc
3.9.3
com.atomikos
transactions-jms
3.9.3
com.atomikos
transactions-jta
3.9.3
com.couchbase.client
couchbase-spring-cache
2.0.0
com.couchbase.client
java-client
2.2.8
com.datastax.cassandra
cassandra-driver-core
2.1.9
com.datastax.cassandra
cassandra-driver-dse
2.1.9
com.datastax.cassandra
cassandra-drivermapping
2.1.9
com.fasterxml
classmate
1.3.3
com.fasterxml.jackson.core
jackson-annotations
2.8.5
com.fasterxml.jackson.core
jackson-core
2.8.5
com.fasterxml.jackson.core
jackson-databind
2.8.5
com.fasterxml.jackson.dataformat
jackson-dataformat-cbor
2.8.5
com.fasterxml.jackson.dataformat
jackson-dataformat-csv
2.8.5
com.fasterxml.jackson.dataformat
jackson-dataformatsmile
2.8.5
com.fasterxml.jackson.dataformat
jackson-dataformat-xml
2.8.5
com.fasterxml.jackson.dataformat
jackson-dataformat-yaml
2.8.5
com.fasterxml.jackson.datatype
jackson-datatype-guava
2.8.5
com.fasterxml.jackson.datatype
jackson-datatypehibernate4
2.8.5
com.fasterxml.jackson.datatype
jackson-datatypehibernate5
2.8.5
1.4.3.RELEASE
Spring Boot
320
Group ID
Artifact ID
Version
com.fasterxml.jackson.datatype
jackson-datatype-jaxrs
2.8.5
com.fasterxml.jackson.datatype
jackson-datatype-jdk8
2.8.5
com.fasterxml.jackson.datatype
jackson-datatype-joda
2.8.5
com.fasterxml.jackson.datatype
jackson-datatype-jsonorg
2.8.5
com.fasterxml.jackson.datatype
jackson-datatype-jsr310
2.8.5
com.fasterxml.jackson.jaxrs
jackson-jaxrs-base
2.8.5
com.fasterxml.jackson.jaxrs
jackson-jaxrs-jsonprovider
2.8.5
com.fasterxml.jackson.module
jackson-module-jaxbannotations
2.8.5
com.fasterxml.jackson.module
jackson-module-kotlin
2.8.5
com.fasterxml.jackson.module
jackson-moduleparameter-names
2.8.5
com.gemstone.gemfire
gemfire
8.2.0
com.github.benmanes.caffeine
caffeine
2.3.5
com.github.mxab.thymeleaf.extras
thymeleaf-extras-dataattribute
1.3
com.google.appengine
appengine-api-1.0-sdk
1.9.48
com.google.code.gson
gson
2.7
com.googlecode.jsonsimple
json-simple
1.1.1
com.h2database
h2
1.4.193
com.hazelcast
hazelcast
3.6.7
com.hazelcast
hazelcast-client
3.6.7
com.hazelcast
hazelcast-hibernate4
3.6.7
com.hazelcast
hazelcast-spring
3.6.7
com.jayway.jsonpath
json-path
2.2.0
com.jayway.jsonpath
json-path-assert
2.2.0
com.querydsl
querydsl-apt
4.1.4
com.querydsl
querydsl-collections
4.1.4
com.querydsl
querydsl-core
4.1.4
1.4.3.RELEASE
Spring Boot
321
Group ID
Artifact ID
Version
com.querydsl
querydsl-jpa
4.1.4
com.querydsl
querydsl-mongodb
4.1.4
com.samskivert
jmustache
1.12
com.sendgrid
sendgrid-java
2.2.2
com.sun.mail
javax.mail
1.5.6
com.timgroup
java-statsd-client
3.1.0
com.zaxxer
HikariCP
2.4.7
com.zaxxer
HikariCP-java6
2.3.13
commons-beanutils
commons-beanutils
1.9.3
commons-codec
commons-codec
1.10
commons-collections
commons-collections
3.2.2
commons-dbcp
commons-dbcp
1.4
commons-digester
commons-digester
2.1
commons-pool
commons-pool
1.6
de.flapdoodle.embed
de.flapdoodle.embed.mongo1.50.5
dom4j
dom4j
1.6.1
io.dropwizard.metrics
metrics-core
3.1.2
io.dropwizard.metrics
metrics-ganglia
3.1.2
io.dropwizard.metrics
metrics-graphite
3.1.2
io.dropwizard.metrics
metrics-servlets
3.1.2
io.projectreactor
reactor-bus
2.0.8.RELEASE
io.projectreactor
reactor-core
2.0.8.RELEASE
io.projectreactor
reactor-groovy
2.0.8.RELEASE
io.projectreactor
reactor-groovyextensions
2.0.8.RELEASE
io.projectreactor
reactor-logback
2.0.8.RELEASE
io.projectreactor
reactor-net
2.0.8.RELEASE
io.projectreactor
reactor-stream
2.0.8.RELEASE
io.projectreactor.spring reactor-spring-context
2.0.7.RELEASE
io.projectreactor.spring reactor-spring-core
2.0.7.RELEASE
1.4.3.RELEASE
Spring Boot
322
Group ID
Artifact ID
Version
io.projectreactor.spring reactor-springmessaging
2.0.7.RELEASE
io.projectreactor.spring reactor-spring-webmvc
2.0.7.RELEASE
io.searchbox
jest
2.0.4
io.undertow
undertow-core
1.3.25.Final
io.undertow
undertow-servlet
1.3.25.Final
io.undertow
undertow-websockets-jsr
1.3.25.Final
javax.cache
cache-api
1.0.0
javax.jms
jms-api
1.1-rev-1
javax.mail
javax.mail-api
1.5.6
javax.servlet
javax.servlet-api
3.1.0
javax.servlet
jstl
1.2
javax.transaction
javax.transaction-api
1.2
jaxen
jaxen
1.1.6
joda-time
joda-time
2.9.6
junit
junit
4.12
mysql
mysql-connector-java
5.1.40
net.java.dev.jna
jna
4.2.2
net.sf.ehcache
ehcache
2.10.3
net.sourceforge.htmlunit htmlunit
2.21
net.sourceforge.jtds
1.3.1
jtds
net.sourceforge.nekohtml nekohtml
1.9.22
nz.net.ultraq.thymeleaf
thymeleaf-layoutdialect
1.4.0
org.apache.activemq
activemq-amqp
5.13.4
org.apache.activemq
activemq-blueprint
5.13.4
org.apache.activemq
activemq-broker
5.13.4
org.apache.activemq
activemq-camel
5.13.4
org.apache.activemq
activemq-client
5.13.4
org.apache.activemq
activemq-console
5.13.4
org.apache.activemq
activemq-http
5.13.4
1.4.3.RELEASE
Spring Boot
323
Group ID
Artifact ID
Version
org.apache.activemq
activemq-jaas
5.13.4
org.apache.activemq
activemq-jdbc-store
5.13.4
org.apache.activemq
activemq-jms-pool
5.13.4
org.apache.activemq
activemq-kahadb-store
5.13.4
org.apache.activemq
activemq-karaf
5.13.4
org.apache.activemq
activemq-leveldb-store
5.13.4
org.apache.activemq
activemq-log4j-appender
5.13.4
org.apache.activemq
activemq-mqtt
5.13.4
org.apache.activemq
activemq-openwiregenerator
5.13.4
org.apache.activemq
activemq-openwirelegacy
5.13.4
org.apache.activemq
activemq-osgi
5.13.4
org.apache.activemq
activemq-partition
5.13.4
org.apache.activemq
activemq-pool
5.13.4
org.apache.activemq
activemq-ra
5.13.4
org.apache.activemq
activemq-run
5.13.4
org.apache.activemq
activemq-runtime-config
5.13.4
org.apache.activemq
activemq-shiro
5.13.4
org.apache.activemq
activemq-spring
5.13.4
org.apache.activemq
activemq-stomp
5.13.4
org.apache.activemq
activemq-web
5.13.4
org.apache.activemq
artemis-amqp-protocol
1.3.0
org.apache.activemq
artemis-commons
1.3.0
org.apache.activemq
artemis-core-client
1.3.0
org.apache.activemq
artemis-jms-client
1.3.0
org.apache.activemq
artemis-jms-server
1.3.0
org.apache.activemq
artemis-journal
1.3.0
org.apache.activemq
artemis-native
1.3.0
org.apache.activemq
artemis-selector
1.3.0
org.apache.activemq
artemis-server
1.3.0
1.4.3.RELEASE
Spring Boot
324
Group ID
Artifact ID
Version
org.apache.activemq
artemis-serviceextensions
1.3.0
org.apache.commons
commons-dbcp2
2.1.1
org.apache.commons
commons-pool2
2.4.2
org.apache.derby
derby
10.12.1.1
org.apache.httpcomponentshttpasyncclient
4.1.2
org.apache.httpcomponentshttpclient
4.5.2
org.apache.httpcomponentshttpcore
4.4.5
org.apache.httpcomponentshttpmime
4.5.2
org.apache.logging.log4j log4j-api
2.6.2
org.apache.logging.log4j log4j-core
2.6.2
org.apache.logging.log4j log4j-slf4j-impl
2.6.2
org.apache.solr
solr-solrj
5.5.3
org.apache.tomcat
tomcat-jdbc
8.5.6
org.apache.tomcat
tomcat-jsp-api
8.5.6
org.apache.tomcat.embed
tomcat-embed-core
8.5.6
org.apache.tomcat.embed
tomcat-embed-el
8.5.6
org.apache.tomcat.embed
tomcat-embed-jasper
8.5.6
org.apache.tomcat.embed
tomcat-embed-websocket
8.5.6
org.apache.velocity
velocity
1.7
org.apache.velocity
velocity-tools
2.0
org.aspectj
aspectjrt
1.8.9
org.aspectj
aspectjtools
1.8.9
org.aspectj
aspectjweaver
1.8.9
org.assertj
assertj-core
2.5.0
org.codehaus.btm
btm
2.1.4
org.codehaus.groovy
groovy
2.4.7
org.codehaus.groovy
groovy-all
2.4.7
org.codehaus.groovy
groovy-ant
2.4.7
org.codehaus.groovy
groovy-bsf
2.4.7
org.codehaus.groovy
groovy-console
2.4.7
1.4.3.RELEASE
Spring Boot
325
Group ID
Artifact ID
Version
org.codehaus.groovy
groovy-docgenerator
2.4.7
org.codehaus.groovy
groovy-groovydoc
2.4.7
org.codehaus.groovy
groovy-groovysh
2.4.7
org.codehaus.groovy
groovy-jmx
2.4.7
org.codehaus.groovy
groovy-json
2.4.7
org.codehaus.groovy
groovy-jsr223
2.4.7
org.codehaus.groovy
groovy-nio
2.4.7
org.codehaus.groovy
groovy-servlet
2.4.7
org.codehaus.groovy
groovy-sql
2.4.7
org.codehaus.groovy
groovy-swing
2.4.7
org.codehaus.groovy
groovy-templates
2.4.7
org.codehaus.groovy
groovy-test
2.4.7
org.codehaus.groovy
groovy-testng
2.4.7
org.codehaus.groovy
groovy-xml
2.4.7
org.codehaus.janino
janino
2.7.8
org.crashub
crash.cli
1.3.2
org.crashub
crash.connectors.ssh
1.3.2
org.crashub
crash.connectors.telnet
1.3.2
org.crashub
crash.embed.spring
1.3.2
org.crashub
crash.plugins.cron
1.3.2
org.crashub
crash.plugins.mail
1.3.2
org.crashub
crash.shell
1.3.2
org.eclipse.jetty
apache-jsp
9.3.14.v20161028
org.eclipse.jetty
apache-jstl
9.3.14.v20161028
org.eclipse.jetty
jetty-annotations
9.3.14.v20161028
org.eclipse.jetty
jetty-client
9.3.14.v20161028
org.eclipse.jetty
jetty-continuation
9.3.14.v20161028
org.eclipse.jetty
jetty-deploy
9.3.14.v20161028
org.eclipse.jetty
jetty-http
9.3.14.v20161028
org.eclipse.jetty
jetty-io
9.3.14.v20161028
1.4.3.RELEASE
Spring Boot
326
Group ID
Artifact ID
Version
org.eclipse.jetty
jetty-jmx
9.3.14.v20161028
org.eclipse.jetty
jetty-plus
9.3.14.v20161028
org.eclipse.jetty
jetty-security
9.3.14.v20161028
org.eclipse.jetty
jetty-server
9.3.14.v20161028
org.eclipse.jetty
jetty-servlet
9.3.14.v20161028
org.eclipse.jetty
jetty-servlets
9.3.14.v20161028
org.eclipse.jetty
jetty-util
9.3.14.v20161028
org.eclipse.jetty
jetty-webapp
9.3.14.v20161028
org.eclipse.jetty
jetty-xml
9.3.14.v20161028
org.eclipse.jetty.orbit
javax.servlet.jsp
2.2.0.v201112011158
org.eclipse.jetty.websocket
javax-websocket-serverimpl
9.3.14.v20161028
org.eclipse.jetty.websocket
websocket-client
9.3.14.v20161028
org.eclipse.jetty.websocket
websocket-server
9.3.14.v20161028
org.ehcache
ehcache
3.1.3
org.ehcache
ehcache-clustered
3.1.3
org.ehcache
ehcache-transactions
3.1.3
org.elasticsearch
elasticsearch
2.4.3
org.firebirdsql.jdbc
jaybird-jdk16
2.2.11
org.firebirdsql.jdbc
jaybird-jdk17
2.2.11
org.firebirdsql.jdbc
jaybird-jdk18
2.2.11
org.flywaydb
flyway-core
3.2.1
org.freemarker
freemarker
2.3.25-incubating
org.glassfish
javax.el
3.0.0
org.glassfish.jersey.containers
jersey-containerservlet
2.23.2
org.glassfish.jersey.containers
jersey-containerservlet-core
2.23.2
org.glassfish.jersey.corejersey-server
2.23.2
org.glassfish.jersey.ext jersey-bean-validation
2.23.2
org.glassfish.jersey.ext jersey-spring3
2.23.2
1.4.3.RELEASE
Spring Boot
327
Group ID
Artifact ID
Version
org.glassfish.jersey.media
jersey-media-jsonjackson
2.23.2
org.hamcrest
hamcrest-core
1.3
org.hamcrest
hamcrest-library
1.3
org.hibernate
hibernate-core
5.0.11.Final
org.hibernate
hibernate-ehcache
5.0.11.Final
org.hibernate
hibernate-entitymanager
5.0.11.Final
org.hibernate
hibernate-envers
5.0.11.Final
org.hibernate
hibernate-java8
5.0.11.Final
org.hibernate
hibernate-jpamodelgen
5.0.11.Final
org.hibernate
hibernate-validator
5.2.4.Final
org.hibernate
hibernate-validatorannotation-processor
5.2.4.Final
org.hornetq
hornetq-jms-client
2.4.7.Final
org.hornetq
hornetq-jms-server
2.4.7.Final
org.hsqldb
hsqldb
2.3.3
org.infinispan
infinispan-jcache
8.2.5.Final
org.infinispan
infinispan-spring4common
8.2.5.Final
org.infinispan
infinispan-spring4embedded
8.2.5.Final
org.javassist
javassist
3.20.0-GA
org.jboss
jboss-transaction-spi
7.3.4.Final
org.jboss.logging
jboss-logging
3.3.0.Final
org.jboss.narayana.jta
jdbc
5.3.5.Final
org.jboss.narayana.jta
jms
5.3.5.Final
org.jboss.narayana.jta
jta
5.3.5.Final
org.jboss.narayana.jts
narayana-jtsintegration
5.3.5.Final
org.jdom
jdom2
2.0.6
org.jolokia
jolokia-core
1.3.5
org.jooq
jooq
3.8.6
1.4.3.RELEASE
Spring Boot
328
Group ID
Artifact ID
Version
org.jooq
jooq-codegen
3.8.6
org.jooq
jooq-meta
3.8.6
org.json
json
20140107
org.liquibase
liquibase-core
3.5.3
org.mariadb.jdbc
mariadb-java-client
1.4.6
org.mockito
mockito-core
1.10.19
org.mongodb
mongodb-driver
3.2.2
org.mongodb
mongo-java-driver
3.2.2
org.mortbay.jasper
apache-el
8.0.33
org.neo4j
neo4j-ogm-api
2.0.6
org.neo4j
neo4j-ogm-compiler
2.0.6
org.neo4j
neo4j-ogm-core
2.0.6
org.neo4j
neo4j-ogm-http-driver
2.0.6
org.postgresql
postgresql
9.4.1212.jre7
org.projectlombok
lombok
1.16.12
org.seleniumhq.selenium
htmlunit-driver
2.21
org.seleniumhq.selenium
selenium-api
2.53.1
org.seleniumhq.selenium
selenium-chrome-driver
2.53.1
org.seleniumhq.selenium
selenium-firefox-driver
2.53.1
org.seleniumhq.selenium
selenium-ie-driver
2.53.1
org.seleniumhq.selenium
selenium-java
2.53.1
org.seleniumhq.selenium
selenium-remote-driver
2.53.1
org.seleniumhq.selenium
selenium-safari-driver
2.53.1
org.seleniumhq.selenium
selenium-support
2.53.1
org.skyscreamer
jsonassert
1.3.0
org.slf4j
jcl-over-slf4j
1.7.22
org.slf4j
jul-to-slf4j
1.7.22
org.slf4j
log4j-over-slf4j
1.7.22
org.slf4j
slf4j-api
1.7.22
org.slf4j
slf4j-jdk14
1.7.22
1.4.3.RELEASE
Spring Boot
329
Group ID
Artifact ID
Version
org.slf4j
slf4j-log4j12
1.7.22
org.slf4j
slf4j-simple
1.7.22
org.spockframework
spock-core
1.0-groovy-2.4
org.spockframework
spock-spring
1.0-groovy-2.4
org.springframework
spring-aop
4.3.5.RELEASE
org.springframework
spring-aspects
4.3.5.RELEASE
org.springframework
spring-beans
4.3.5.RELEASE
org.springframework
spring-context
4.3.5.RELEASE
org.springframework
spring-context-support
4.3.5.RELEASE
org.springframework
spring-core
4.3.5.RELEASE
org.springframework
spring-expression
4.3.5.RELEASE
org.springframework
spring-instrument
4.3.5.RELEASE
org.springframework
spring-instrumenttomcat
4.3.5.RELEASE
org.springframework
spring-jdbc
4.3.5.RELEASE
org.springframework
spring-jms
4.3.5.RELEASE
org.springframework
springloaded
1.2.6.RELEASE
org.springframework
spring-messaging
4.3.5.RELEASE
org.springframework
spring-orm
4.3.5.RELEASE
org.springframework
spring-oxm
4.3.5.RELEASE
org.springframework
spring-test
4.3.5.RELEASE
org.springframework
spring-tx
4.3.5.RELEASE
org.springframework
spring-web
4.3.5.RELEASE
org.springframework
spring-webmvc
4.3.5.RELEASE
org.springframework
spring-webmvc-portlet
4.3.5.RELEASE
org.springframework
spring-websocket
4.3.5.RELEASE
org.springframework.amqp spring-amqp
1.6.6.RELEASE
org.springframework.amqp spring-rabbit
1.6.6.RELEASE
org.springframework.batchspring-batch-core
3.0.7.RELEASE
org.springframework.batchspring-batchinfrastructure
3.0.7.RELEASE
1.4.3.RELEASE
Spring Boot
330
Group ID
Artifact ID
Version
org.springframework.batchspring-batchintegration
3.0.7.RELEASE
org.springframework.batchspring-batch-test
3.0.7.RELEASE
org.springframework.boot spring-boot
1.4.3.RELEASE
org.springframework.boot spring-boot-actuator
1.4.3.RELEASE
org.springframework.boot spring-boot-actuatordocs
1.4.3.RELEASE
org.springframework.boot spring-bootautoconfigure
1.4.3.RELEASE
org.springframework.boot spring-bootconfiguration-metadata
1.4.3.RELEASE
org.springframework.boot spring-bootconfiguration-processor
1.4.3.RELEASE
org.springframework.boot spring-boot-devtools
1.4.3.RELEASE
org.springframework.boot spring-boot-loader
1.4.3.RELEASE
org.springframework.boot spring-boot-loadertools
1.4.3.RELEASE
org.springframework.boot spring-boot-starter
1.4.3.RELEASE
org.springframework.boot spring-boot-starteractivemq
1.4.3.RELEASE
org.springframework.boot spring-boot-starteractuator
1.4.3.RELEASE
org.springframework.boot spring-boot-starteramqp
1.4.3.RELEASE
org.springframework.boot spring-boot-starter-aop
1.4.3.RELEASE
org.springframework.boot spring-boot-starterartemis
1.4.3.RELEASE
org.springframework.boot spring-boot-starterbatch
1.4.3.RELEASE
org.springframework.boot spring-boot-startercache
1.4.3.RELEASE
org.springframework.boot spring-boot-startercloud-connectors
1.4.3.RELEASE
org.springframework.boot spring-boot-starterdata-cassandra
1.4.3.RELEASE
1.4.3.RELEASE
Spring Boot
331
Group ID
Artifact ID
Version
org.springframework.boot spring-boot-starterdata-couchbase
1.4.3.RELEASE
org.springframework.boot spring-boot-starterdata-elasticsearch
1.4.3.RELEASE
org.springframework.boot spring-boot-starterdata-gemfire
1.4.3.RELEASE
org.springframework.boot spring-boot-starterdata-jpa
1.4.3.RELEASE
org.springframework.boot spring-boot-starterdata-mongodb
1.4.3.RELEASE
org.springframework.boot spring-boot-starterdata-neo4j
1.4.3.RELEASE
org.springframework.boot spring-boot-starterdata-redis
1.4.3.RELEASE
org.springframework.boot spring-boot-starterdata-rest
1.4.3.RELEASE
org.springframework.boot spring-boot-starterdata-solr
1.4.3.RELEASE
org.springframework.boot spring-boot-starterfreemarker
1.4.3.RELEASE
org.springframework.boot spring-boot-startergroovy-templates
1.4.3.RELEASE
org.springframework.boot spring-boot-starterhateoas
1.4.3.RELEASE
org.springframework.boot spring-boot-starterhornetq
1.4.3.RELEASE
org.springframework.boot spring-boot-starterintegration
1.4.3.RELEASE
org.springframework.boot spring-boot-starterjdbc
1.4.3.RELEASE
org.springframework.boot spring-boot-starterjersey
1.4.3.RELEASE
org.springframework.boot spring-boot-starterjetty
1.4.3.RELEASE
org.springframework.boot spring-boot-starterjooq
1.4.3.RELEASE
1.4.3.RELEASE
Spring Boot
332
Group ID
Artifact ID
Version
org.springframework.boot spring-boot-starterjta-atomikos
1.4.3.RELEASE
org.springframework.boot spring-boot-starterjta-bitronix
1.4.3.RELEASE
org.springframework.boot spring-boot-starterjta-narayana
1.4.3.RELEASE
org.springframework.boot spring-boot-starterlog4j2
1.4.3.RELEASE
org.springframework.boot spring-boot-starterlogging
1.4.3.RELEASE
org.springframework.boot spring-boot-startermail
1.4.3.RELEASE
org.springframework.boot spring-boot-startermobile
1.4.3.RELEASE
org.springframework.boot spring-boot-startermustache
1.4.3.RELEASE
org.springframework.boot spring-boot-starterredis
1.4.3.RELEASE
org.springframework.boot spring-boot-starterremote-shell
1.4.3.RELEASE
org.springframework.boot spring-boot-startersecurity
1.4.3.RELEASE
org.springframework.boot spring-boot-startersocial-facebook
1.4.3.RELEASE
org.springframework.boot spring-boot-startersocial-linkedin
1.4.3.RELEASE
org.springframework.boot spring-boot-startersocial-twitter
1.4.3.RELEASE
org.springframework.boot spring-boot-startertest
1.4.3.RELEASE
org.springframework.boot spring-boot-starterthymeleaf
1.4.3.RELEASE
org.springframework.boot spring-boot-startertomcat
1.4.3.RELEASE
org.springframework.boot spring-boot-starterundertow
1.4.3.RELEASE
1.4.3.RELEASE
Spring Boot
333
Group ID
Artifact ID
Version
org.springframework.boot spring-boot-startervalidation
1.4.3.RELEASE
org.springframework.boot spring-boot-startervelocity
1.4.3.RELEASE
org.springframework.boot spring-boot-starter-web
1.4.3.RELEASE
org.springframework.boot spring-boot-starterweb-services
1.4.3.RELEASE
org.springframework.boot spring-boot-starterwebsocket
1.4.3.RELEASE
org.springframework.boot spring-boot-starter-ws
1.4.3.RELEASE
org.springframework.boot spring-boot-test
1.4.3.RELEASE
org.springframework.boot spring-boot-testautoconfigure
1.4.3.RELEASE
org.springframework.cloudspring-cloudcloudfoundry-connector
1.2.3.RELEASE
org.springframework.cloudspring-cloud-core
1.2.3.RELEASE
org.springframework.cloudspring-cloud-herokuconnector
1.2.3.RELEASE
org.springframework.cloudspring-cloudlocalconfig-connector
1.2.3.RELEASE
org.springframework.cloudspring-cloud-springservice-connector
1.2.3.RELEASE
org.springframework.data spring-cql
1.4.6.RELEASE
org.springframework.data spring-data-cassandra
1.4.6.RELEASE
org.springframework.data spring-data-commons
1.12.6.RELEASE
org.springframework.data spring-data-couchbase
2.1.6.RELEASE
org.springframework.data spring-dataelasticsearch
2.0.6.RELEASE
org.springframework.data spring-data-envers
1.0.6.RELEASE
org.springframework.data spring-data-gemfire
1.8.6.RELEASE
org.springframework.data spring-data-jpa
1.10.6.RELEASE
org.springframework.data spring-data-keyvalue
1.1.6.RELEASE
org.springframework.data spring-data-mongodb
1.9.6.RELEASE
1.4.3.RELEASE
Spring Boot
334
Group ID
Artifact ID
Version
org.springframework.data spring-data-mongodbcross-store
1.9.6.RELEASE
org.springframework.data spring-data-mongodblog4j
1.9.6.RELEASE
org.springframework.data spring-data-neo4j
4.1.6.RELEASE
org.springframework.data spring-data-redis
1.7.6.RELEASE
org.springframework.data spring-data-rest-core
2.5.6.RELEASE
org.springframework.data spring-data-rest-halbrowser
2.5.6.RELEASE
org.springframework.data spring-data-rest-webmvc
2.5.6.RELEASE
org.springframework.data spring-data-solr
2.0.6.RELEASE
org.springframework.hateoas
spring-hateoas
0.20.0.RELEASE
org.springframework.integration
spring-integration-amqp
4.3.6.RELEASE
org.springframework.integration
spring-integration-core
4.3.6.RELEASE
org.springframework.integration
spring-integrationevent
4.3.6.RELEASE
org.springframework.integration
spring-integration-feed
4.3.6.RELEASE
org.springframework.integration
spring-integration-file
4.3.6.RELEASE
org.springframework.integration
spring-integration-ftp
4.3.6.RELEASE
org.springframework.integration
spring-integrationgemfire
4.3.6.RELEASE
org.springframework.integration
spring-integrationgroovy
4.3.6.RELEASE
org.springframework.integration
spring-integration-http
4.3.6.RELEASE
org.springframework.integration
spring-integration-ip
4.3.6.RELEASE
org.springframework.integration
spring-integrationjava-dsl
1.1.4.RELEASE
org.springframework.integration
spring-integration-jdbc
4.3.6.RELEASE
org.springframework.integration
spring-integration-jms
4.3.6.RELEASE
org.springframework.integration
spring-integration-jmx
4.3.6.RELEASE
org.springframework.integration
spring-integration-jpa
4.3.6.RELEASE
org.springframework.integration
spring-integration-mail
4.3.6.RELEASE
1.4.3.RELEASE
Spring Boot
335
Group ID
Artifact ID
Version
org.springframework.integration
spring-integrationmongodb
4.3.6.RELEASE
org.springframework.integration
spring-integration-mqtt
4.3.6.RELEASE
org.springframework.integration
spring-integrationredis
4.3.6.RELEASE
org.springframework.integration
spring-integration-rmi
4.3.6.RELEASE
org.springframework.integration
spring-integrationscripting
4.3.6.RELEASE
org.springframework.integration
spring-integrationsecurity
4.3.6.RELEASE
org.springframework.integration
spring-integration-sftp
4.3.6.RELEASE
org.springframework.integration
spring-integrationstomp
4.3.6.RELEASE
org.springframework.integration
spring-integrationstream
4.3.6.RELEASE
org.springframework.integration
spring-integrationsyslog
4.3.6.RELEASE
org.springframework.integration
spring-integration-test
4.3.6.RELEASE
org.springframework.integration
spring-integrationtwitter
4.3.6.RELEASE
org.springframework.integration
spring-integrationwebsocket
4.3.6.RELEASE
org.springframework.integration
spring-integration-ws
4.3.6.RELEASE
org.springframework.integration
spring-integration-xml
4.3.6.RELEASE
org.springframework.integration
spring-integration-xmpp
4.3.6.RELEASE
org.springframework.integration
spring-integrationzookeeper
4.3.6.RELEASE
org.springframework.mobile
spring-mobile-device
1.1.5.RELEASE
org.springframework.plugin
spring-plugin-core
1.2.0.RELEASE
org.springframework.restdocs
spring-restdocs-core
1.1.2.RELEASE
org.springframework.restdocs
spring-restdocs-mockmvc
1.1.2.RELEASE
org.springframework.restdocs
spring-restdocsrestassured
1.1.2.RELEASE
org.springframework.retryspring-retry
1.1.5.RELEASE
1.4.3.RELEASE
Spring Boot
336
Group ID
Artifact ID
Version
org.springframework.security
spring-security-acl
4.1.4.RELEASE
org.springframework.security
spring-security-aspects
4.1.4.RELEASE
org.springframework.security
spring-security-cas
4.1.4.RELEASE
org.springframework.security
spring-security-config
4.1.4.RELEASE
org.springframework.security
spring-security-core
4.1.4.RELEASE
org.springframework.security
spring-security-crypto
4.1.4.RELEASE
org.springframework.security
spring-security-data
4.1.4.RELEASE
org.springframework.security
spring-security-jwt
1.0.5.RELEASE
org.springframework.security
spring-security-ldap
4.1.4.RELEASE
org.springframework.security
spring-securitymessaging
4.1.4.RELEASE
org.springframework.security
spring-security-openid
4.1.4.RELEASE
org.springframework.security
spring-securityremoting
4.1.4.RELEASE
org.springframework.security
spring-security-taglibs
4.1.4.RELEASE
org.springframework.security
spring-security-test
4.1.4.RELEASE
org.springframework.security
spring-security-web
4.1.4.RELEASE
org.springframework.security.oauth
spring-security-oauth
2.0.12.RELEASE
org.springframework.security.oauth
spring-security-oauth2
2.0.12.RELEASE
org.springframework.session
spring-session
1.2.2.RELEASE
org.springframework.session
spring-session-datagemfire
1.2.2.RELEASE
org.springframework.session
spring-session-datamongo
1.2.2.RELEASE
org.springframework.session
spring-session-dataredis
1.2.2.RELEASE
org.springframework.session
spring-session-jdbc
1.2.2.RELEASE
org.springframework.social
spring-social-config
1.1.4.RELEASE
org.springframework.social
spring-social-core
1.1.4.RELEASE
org.springframework.social
spring-social-facebook
2.0.3.RELEASE
org.springframework.social
spring-social-facebookweb
2.0.3.RELEASE
1.4.3.RELEASE
Spring Boot
337
Group ID
Artifact ID
Version
org.springframework.social
spring-social-linkedin
1.0.2.RELEASE
org.springframework.social
spring-social-security
1.1.4.RELEASE
org.springframework.social
spring-social-twitter
1.1.2.RELEASE
org.springframework.social
spring-social-web
1.1.4.RELEASE
org.springframework.ws
spring-ws-core
2.3.1.RELEASE
org.springframework.ws
spring-ws-security
2.3.1.RELEASE
org.springframework.ws
spring-ws-support
2.3.1.RELEASE
org.springframework.ws
spring-ws-test
2.3.1.RELEASE
org.thymeleaf
thymeleaf
2.1.5.RELEASE
org.thymeleaf
thymeleaf-spring4
2.1.5.RELEASE
org.thymeleaf.extras
thymeleaf-extrasconditionalcomments
2.1.2.RELEASE
org.thymeleaf.extras
thymeleaf-extrasjava8time
2.1.0.RELEASE
org.thymeleaf.extras
thymeleaf-extrasspringsecurity4
2.1.3.RELEASE
org.webjars
hal-browser
9f96c74
org.webjars
webjars-locator
0.32
org.xerial
sqlite-jdbc
3.8.11.2
org.yaml
snakeyaml
1.17
redis.clients
jedis
2.8.2
wsdl4j
wsdl4j
1.6.3
xml-apis
xml-apis
1.4.01
1.4.3.RELEASE
Spring Boot
338