Documentation versions (currently viewingVaadin 24)

Routing with Spring

How to route with Spring - much like with Vaadin applications.

Routing works the same way with Spring as it does in plain Vaadin applications. See Routing and Navigation for more.

This content applies to using Vaadin with both Spring Boot and Spring MVC.

Defining Routes

To handle the default route, all you need to do is define a component with the @Route("") annotation.

This example is defining RootComponent as the default root target using the @Route annotation:

public class RootComponent extends Div {
    public RootComponent(){
        setText("Default path");

You can also define all other possible routes in the same way as in standard Vaadin applications. See Defining Routes with @Route for more on using the Router class.

Using Dependency Injection and Spring Autowiring

The only difference between using the router in a standard application and a Spring application is that, in Spring, you can use dependency injection in components annotated with @Route. These components are instantiated by Spring and become Spring-initialized beans. In particular, this means you can autowire other Spring-managed beans.

This example is using autowiring in a component annotated with @Route:

public class RootComponent extends Div {

    public RootComponent(@Autowired DataBean dataBean) {

public interface DataBean {
    String getMessage();

public class DataBeanImpl implements DataBean {

    public String getMessage(){
        return "message";

Routing in Spring Boot & WAR Applications

Running an application as a Spring Boot application is different from running it as a WAR application deployed to a web server.

In WAR applications, all @Route annotations are discovered automatically, due to the Servlet 3.0 specification. With Spring Boot applications, this is, by design, not the case. See Spring Boot #321 for more.

The Vaadin Spring add-on implements scanning for router classes in Spring Boot applications. This is also true for other Vaadin types that need to be discovered and registered at start-up. However, scanning only occurs inside the Spring Boot application class package, that is, the package in which the @SpringBootApplication class is in. If your application contains route classes in packages that aren’t scanned by default, you have two options:

  • Move them to the package (or sub-package) in which the @SpringBootApplication application class is in, or

  • Explicitly specify the packages that should be scanned. You can specify packages to scan using the value parameter in the @EnableVaadin annotation.

You don’t need to use the @EnableVaadin annotation at all with Spring Boot. This annotation is intended to be used with Spring MVC to enable the Vaadin configuration. In Spring Boot, auto-configuration is available, which makes it work out of the box. The only reason to use @EnableVaadin is to specify the packages to scan with Spring MVC.