SpringBoot 2 para construir servicios REST: simplifique el proceso de creación de enlaces

¿Hemos notado duplicación al crear un enlace de empleado único? El código que proporciona un enlace único al empleado y un enlace al "empleado" de la raíz agregada se muestra dos veces. Si eso llamó nuestra atención, ¡está bien! Hay una solución

En resumen, tenemos que definir una para Employeeconvertir el objeto a EntityModel<Employee>objeto funciones. Si bien podemos escribir fácilmente su propio método, pero en la realización de la primavera HATEOAS RepresentationModelAssemberhabrá muchos beneficios de la interfaz de proceso.

evolution/src/main/java/payroll/EmployeeResourceAssembler.java

package payroll;

import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;

import org.springframework.hateoas.EntityModel;
import org.springframework.hateoas.server.RepresentationModelAssembler;
import org.springframework.stereotype.Component;

@Component
class EmployeeModelAssembler implements RepresentationModelAssembler<Employee, EntityModel<Employee>> {

  @Override
  public EntityModel<Employee> toModel(Employee employee) {

    return new EntityModel<>(employee,
      linkTo(methodOn(EmployeeController.class).one(employee.getId())).withSelfRel(),
      linkTo(methodOn(EmployeeController.class).all()).withRel("employees"));
  }
}

La interfaz tiene un método simple: toModel(). Se basa en la conversión de objetos que no son de recursos ( Employee) en objetos basados ​​en recursos ( EntityModel<Employee>).

Todo el código que vimos en el controlador antes se puede mover a esta clase. Al aplicar el marco Spring @Component, este componente se creará automáticamente cuando se inicie la aplicación.

Spring HATEOAS es la clase base abstracta para todos los recursos RepresentationModel. Pero en aras de la simplicidad, el tutorial se recomienda EntityModel<T>como nuestro mecanismo para envolver fácilmente toda POJO como un recurso.

Para utilizar el ensamblador y necesidad de ser inyectado en EmployeeControllerel constructor se puede cambiar.

Inyecte EmployeeResourceAssembler en el controlador.

@RestController
class EmployeeController {

  private final EmployeeRepository repository;

  private final EmployeeModelAssembler assembler;

  EmployeeController(EmployeeRepository repository,
             EmployeeModelAssembler assembler) {

    this.repository = repository;
    this.assembler = assembler;
  }

  ...

}

Aquí, podemos usarlo en el método de empleado único:

Use el ensamblador para obtener un solo recurso.

@GetMapping("/employees/{id}")
EntityModel<Employee> one(@PathVariable Long id) {

  Employee employee = repository.findById(id)
    .orElseThrow(() -> new EmployeeNotFoundException(id));

  return assembler.toModel(employee);
}

Este código es casi idéntico, excepto que no estamos aquí para crear EntityModel<Employee>un ejemplo, pero se confía al ensamblador. Tal vez no se ve mucho?

Aplicar el mismo contenido en el método de controlador raíz agregado es aún más impresionante:

Use el ensamblador para obtener el recurso raíz agregado.

@GetMapping("/employees")
CollectionModel<EntityModel<Employee>> all() {

  List<EntityModel<Employee>> employees = repository.findAll().stream()
    .map(assembler::toModel)
    .collect(Collectors.toList());

  return new CollectionModel<>(employees,
    linkTo(methodOn(EmployeeController.class).all()).withSelfRel());
}

Una vez más, el código es casi lo mismo, pero todos podemos EntityModel<Employee>crear lógica reemplazado map(assembler::toModel). Con las referencias de métodos de Java 8, es muy fácil insertar y simplificar nuestro controlador.

El objetivo principal de Spring HATEOAS es facilitar "The Right Thing ™". En este caso, se puede agregar hipermedia a nuestro servidor sin codificar las cosas.

En esta etapa, hemos creado un controlador Spring MVC REST que en realidad puede generar contenido compatible con hipermedia. Los clientes que no usan HAL pueden ignorar los bits adicionales cuando usan datos puros. Los clientes que conocen HAL pueden navegar por nuestra API autorizada.

Pero esta no es la única forma de construir verdaderos servicios RESTful con Spring.

232 artículos originales publicados · Me gustaron 14 · Visitas 20,000+

Supongo que te gusta

Origin blog.csdn.net/stevenchen1989/article/details/105586569
Recomendado
Clasificación