Search code examples
springspring-bootspring-dataspring-data-restspring-hateoas

When to use @EnableHypermediaSupport?


According to the Spring HATEOAS API,

Activates hypermedia support in the ApplicationContext. Will register infrastructure beans to support all appropriate web stacks based on selected HypermediaMappingInformation-type as well as the classpath.

My Spring Boot application (2.3.4) has the following dependencies:

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
implementation 'org.springframework.boot:spring-boot-starter-data-rest'

My SpringBootApplication class:

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        
        // run this application as a Spring application        
        SpringApplication.run(MyApplication.class, args);
    }
}

I've noticed my repositories are returning HALresponses via Spring Data REST without annotating my application class with @EnableHypermediSupport. When is this annotation needed? Do I not need it since I'm using Spring Data REST?


Solution

  • Spring Boot already auto configures for you if your dependencies contains spring-hateoas. The dependency spring-boot-starter-data-rest contains spring-hateoas.

    File org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration has @EnableHypermediaSupport(type = HypermediaType.HAL).

    
    /**
     * {@link EnableAutoConfiguration Auto-configuration} for Spring HATEOAS's
     * {@link EnableHypermediaSupport @EnableHypermediaSupport}.
     *
     * @author Roy Clarkson
     * @author Oliver Gierke
     * @author Andy Wilkinson
     * @since 1.1.0
     */
    @Configuration(proxyBeanMethods = false)
    @ConditionalOnClass({ EntityModel.class, RequestMapping.class, RequestMappingHandlerAdapter.class, Plugin.class })
    @ConditionalOnWebApplication
    @AutoConfigureAfter({ WebMvcAutoConfiguration.class, JacksonAutoConfiguration.class,
            HttpMessageConvertersAutoConfiguration.class, RepositoryRestMvcAutoConfiguration.class })
    @EnableConfigurationProperties(HateoasProperties.class)
    @Import(HypermediaHttpMessageConverterConfiguration.class)
    public class HypermediaAutoConfiguration {
    
        @Configuration(proxyBeanMethods = false)
        @ConditionalOnMissingBean(LinkDiscoverers.class)
        @ConditionalOnClass(ObjectMapper.class)
        @EnableHypermediaSupport(type = HypermediaType.HAL)
        protected static class HypermediaConfiguration {
    
        }
    
    }
    

    Of course, you can override the default configuration.

    @Configuration
    @EnableHypermediaSupport(…)
    class MyHypermediaConfiguration { … }