The EntityLinks interface allows to automatically use a LinkBuilder based on the model types. Its methods linkToSingleResource() and inkToCollectionResource() create links pointing to a single resource or a collection resource respectively.
EntityLinks is available for dependency injection by activating @EnableEntityLinks in our Spring MVC configuration. Instead of that @EnableHypermediaSupport (tutorial) additionally enables this functionality as well.
Activating this functionality will cause all Spring MVC controllers being inspected for the @ExposesResourceFor annotation. This annotation exposes which model type the controller manages.
Example
Domain object
public class Employee {
private long employeeId;
private String name;
private String dept;
private int salary;
.............
}
Controller
package com.logicbig.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@ExposesResourceFor(Employee.class)
@RequestMapping("/employees")
public class EmployeeController {
@Autowired
private EntityLinks entityLinks;
@GetMapping(value = "/{employeeId}")
public Resource<Employee> getEmployeeById(@PathVariable long employeeId) {
Link selfLink = entityLinks.linkToSingleResource(Employee.class, employeeId);
Employee employee = getEmployee(employeeId);
Resource<Employee> resource = new Resource<>(employee);
resource.add(selfLink);
return resource;
}
@GetMapping
public Resources<Employee> getEmployees() {
Link selfLink = entityLinks.linkToCollectionResource(Employee.class);
List<Employee> employeeList = getEmployeeList();
Resources<Employee> resources = new Resources<>(employeeList);
resources.add(selfLink);
return resources;
}
private List<Employee> getEmployeeList() {
//todo: replace with employee service
return List.of(getEmployee(1),
Employee.create(2, "Tom", "IT", 4000));
}
private Employee getEmployee(long employeeId) {
//todo: replace with employee service
return Employee.create(employeeId, "Lara", "Admin", 3000);
}
}
JavaConfig
@EnableWebMvc
@ComponentScan
@Configuration
@EnableHypermediaSupport(type = EnableHypermediaSupport.HypermediaType.HAL)
public class AppConfig {
}
Running
To try examples, run embedded tomcat (configured in pom.xml of example project below):
mvn tomcat7:run-war
Output
Accessing http://localhost:8080/employees/1:
{
"employeeId":1,
"name":"Lara",
"dept":"Admin",
"salary":3000,
"_links":{
"self":{
"href":"http://localhost:8080/employees/1"
}
}
}
Accessing http://localhost:8080/employees
{
"_embedded":{
"employeeList":[
{
"employeeId":1,
"name":"Lara",
"dept":"Admin",
"salary":3000
},
{
"employeeId":2,
"name":"Tom",
"dept":"IT",
"salary":4000
}
]
},
"_links":{
"self":{
"href":"http://localhost:8080/employees"
}
}
}
Example ProjectDependencies and Technologies Used: - spring-hateoas 0.24.0.RELEASE:
Library to support implementing representations for
hyper-text driven REST web services.
Uses org.springframework:spring-web-mvc version 4.3.12.RELEASE - spring-plugin-core 1.2.0.RELEASE: Core plugin infrastructure.
- jackson-databind 2.9.5: General data-binding functionality for Jackson: works on core streaming API.
- javax.servlet-api 3.0.1 Java Servlet API
- JDK 10
- Maven 3.5.4
|