Как связать 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
Пожалуйста, обратитесь:
- https://github.com/spring-projects/spring-data-examples/tree/master/rest/projections/src
- /questions/225591/vyiborochnoe-rasshirenie-assotsiatsij-v-otvete-spring-data-rest/225596#225596
Замечания:
- При установке атрибута excerptProjection в аннотации RepositoryRestResource он по умолчанию возвращает проекцию без параметра "projection".
- "projection" требуется, когда мы аннотируем интерфейс с помощью @Projection и помещаем его в тот же пакет, что и тип домена или его подпакет.