Как связать REST-объекты Spring Data для переноса объектов?

У нас есть два приложения Spring Boot с архитектурой клиент-сервер. Бэкэнд настроен на Spring Data REST + JPA. Внешний интерфейс должен потреблять ресурсы, предоставляемые внутренним сервером, и обслуживать общедоступный API REST.

Можно ли сделать так, чтобы данные Spring автоматически отображали доменные объекты из DTO, объявляя, например, компонент mapper?

// JPA persistable
@Entity
public class Order { .. }

// Immutable DTO
public class OrderDto { .. } 

// Is this somehow possible..
@RepositoryRestResource
public interface OrderDtoRepository extends CrudRepository<OrderDto, Long> {}

// .. instead of this?
@RepositoryRestResource
public interface OrderRepository extends CrudRepository<Order, Long> {}

1 ответ

Решение

Мы можем использовать функцию проекции (начиная с версии 2.2.x) в Spring Data REST. Что-то вроде ниже:

import org.springframework.data.rest.core.config.Projection;

@Projection(name = "orderDTO", types = Order.class)
public interface OrderDTO {
    //get attributes required for DTO
    String getOrderName();
}

@RepositoryRestResource(excerptProjection = OrderDTO.class)
public interface OrderRepository extends CrudRepository<Order, Long> {
}

При вызове REST установите для параметра "projection" значение "orderDTO", т.е.

http://host/app/order?projection=orderDTO

Пожалуйста, обратитесь:

Замечания:

  • При установке атрибута excerptProjection в аннотации RepositoryRestResource он по умолчанию возвращает проекцию без параметра "projection".
  • "projection" требуется, когда мы аннотируем интерфейс с помощью @Projection и помещаем его в тот же пакет, что и тип домена или его подпакет.
Другие вопросы по тегам