Starter for building hypermedia-based RESTful web application with Spring MVC and Spring HATEOAS
npx @tessl/cli install tessl/maven-org-springframework-boot--spring-boot-starter-hateoas@3.5.0Spring Boot Starter HATEOAS is a Spring Boot starter that provides auto-configuration for building hypermedia-based RESTful web applications using Spring MVC and Spring HATEOAS. It automatically configures the necessary components to support HATEOAS (Hypermedia as the Engine of Application State) principles, enabling REST APIs to include hypermedia links for navigation and discovery.
Package Name: spring-boot-starter-hateoas
Package Type: maven
Language: Java
Installation:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
<version>3.5.3</version>
</dependency>Or for Gradle:
implementation 'org.springframework.boot:spring-boot-starter-hateoas:3.5.3'import org.springframework.boot.autoconfigure.hateoas.HateoasProperties;
import org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration;
import org.springframework.hateoas.mediatype.hal.HalConfiguration;
import org.springframework.hateoas.client.LinkDiscoverers;For accessing Spring HATEOAS classes (provided as transitive dependencies):
import org.springframework.hateoas.EntityModel;
import org.springframework.hateoas.Link;
import org.springframework.hateoas.RepresentationModel;
import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;The starter works through auto-configuration. Simply add the dependency to your Spring Boot application:
@SpringBootApplication
public class MyHateoasApplication {
public static void main(String[] args) {
SpringApplication.run(MyHateoasApplication.class, args);
}
}
@RestController
public class BookController {
@GetMapping("/books/{id}")
public EntityModel<Book> getBook(@PathVariable Long id) {
Book book = bookService.findById(id);
return EntityModel.of(book)
.add(linkTo(methodOn(BookController.class).getBook(id)).withSelfRel())
.add(linkTo(BookController.class).withRel("books"));
}
}The starter provides:
HypermediaAutoConfiguration automatically configures Spring HATEOAS when web components are detectedHateoasProperties allows customization of HATEOAS behaviorspring-boot-starter-web and spring-hateoas as transitive dependenciesThe starter provides automatic configuration through the HypermediaAutoConfiguration class.
@AutoConfiguration(after = { WebMvcAutoConfiguration.class, JacksonAutoConfiguration.class,
HttpMessageConvertersAutoConfiguration.class, RepositoryRestMvcAutoConfiguration.class })
@ConditionalOnClass({ EntityModel.class, RequestMapping.class, RequestMappingHandlerAdapter.class, Plugin.class })
@ConditionalOnWebApplication
@EnableConfigurationProperties(HateoasProperties.class)
public class HypermediaAutoConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnClass(name = "com.fasterxml.jackson.databind.ObjectMapper")
@ConditionalOnBooleanProperty(name = "spring.hateoas.use-hal-as-default-json-media-type", matchIfMissing = true)
HalConfiguration applicationJsonHalConfiguration();
@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean(LinkDiscoverers.class)
@ConditionalOnClass(ObjectMapper.class)
@EnableHypermediaSupport(type = HypermediaType.HAL)
protected static class HypermediaConfiguration {
}
}Conditions for activation:
EntityModel, RequestMapping, RequestMappingHandlerAdapter, PluginThe starter exposes configuration properties through the HateoasProperties class.
@ConfigurationProperties("spring.hateoas")
public class HateoasProperties {
/**
* Whether application/hal+json responses should be sent to requests that accept
* application/json.
*/
private boolean useHalAsDefaultJsonMediaType = true;
public boolean isUseHalAsDefaultJsonMediaType() {
return this.useHalAsDefaultJsonMediaType;
}
public void setUseHalAsDefaultJsonMediaType(boolean useHalAsDefaultJsonMediaType) {
this.useHalAsDefaultJsonMediaType = useHalAsDefaultJsonMediaType;
}
}Configuration property:
# Whether to use HAL as default JSON media type (default: true)
spring.hateoas.use-hal-as-default-json-media-type=trueWhen enabled (default), requests accepting application/json will receive application/hal+json responses.
Provides HAL (Hypertext Application Language) configuration for JSON responses.
@Bean
@ConditionalOnMissingBean
@ConditionalOnClass(name = "com.fasterxml.jackson.databind.ObjectMapper")
@ConditionalOnBooleanProperty(name = "spring.hateoas.use-hal-as-default-json-media-type", matchIfMissing = true)
HalConfiguration applicationJsonHalConfiguration() {
return new HalConfiguration().withMediaType(MediaType.APPLICATION_JSON);
}Creates a HalConfiguration that maps HAL responses to MediaType.APPLICATION_JSON.
Inner configuration class that enables Spring HATEOAS hypermedia support.
@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean(LinkDiscoverers.class)
@ConditionalOnClass(ObjectMapper.class)
@EnableHypermediaSupport(type = HypermediaType.HAL)
protected static class HypermediaConfiguration {
}Activation conditions:
LinkDiscoverers beanObjectMapper class is present on classpathThe starter automatically includes these dependencies:
// From build.gradle
dependencies {
api(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-web"))
api("org.springframework.hateoas:spring-hateoas")
}EntityModel, Link, RepresentationModel, etc./**
* Auto-configuration for Spring HATEOAS's EnableHypermediaSupport.
*/
@AutoConfiguration
public class HypermediaAutoConfiguration {
// Configuration class providing automatic HATEOAS setup
}/**
* Configuration properties for Spring HATEOAS.
*/
@ConfigurationProperties("spring.hateoas")
public class HateoasProperties {
private boolean useHalAsDefaultJsonMediaType = true;
// Property class for customizing HATEOAS behavior
}/**
* Configuration for HAL media type handling.
*/
public class HalConfiguration {
public HalConfiguration withMediaType(MediaType mediaType);
public HalConfiguration withObjectMapperCustomizer(Consumer<ObjectMapper> customizer);
public List<MediaType> getMediaTypes();
// Note: Consumer is from java.util.function.Consumer
// Configures HAL media type mappings and ObjectMapper customization
}Compatible with:
Not compatible with:
spring-hateoas dependency instead)Automatically configures:
The starter simplifies HATEOAS setup by providing sensible defaults while allowing customization through properties and conditional bean replacement.