На самом деле это невозможно с Spring Data / REST, поскольку он фокусируется на структурированных данных;т.е. таблицы и ассоциации по большей части.Да, есть несколько обручей, через которые вы могли бы перейти, как объяснено в других ответах, но есть также связанный проект под названием Spring Content , который решает именно эту проблемную область.
Spring Content предоставляет те же парадигмы программирования, что и Spring Data / REST, только для неструктурированных данных;т. е. изображения, документы, фильмы и т. д. Таким образом, используя этот проект, вы можете связать один или несколько «контентных» объектов с объектами Spring Data и управлять ими через HTTP, как и с вашими объектами Spring Data.
Довольнопросто добавить в проект, как показано ниже:
pom.xml (также доступны загрузчики)
<!-- Java API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-jpa</artifactId>
<version>0.9.0</version>
</dependency>
<!-- REST API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-rest</artifactId>
<version>0.9.0</version>
</dependency>
Конфигурация
@Configuration
@EnableJpaStores
@Import("org.springframework.content.rest.config.RestConfiguration.class")
public class ContentConfig {
// schema management (assuming mysql)
//
@Value("/org/springframework/content/jpa/schema-drop-mysql.sql")
private Resource dropContentTables;
@Value("/org/springframework/content/jpa/schema-mysql.sql")
private Resource createContentTables;
@Bean
DataSourceInitializer datasourceInitializer() {
ResourceDatabasePopulator databasePopulator =
new ResourceDatabasePopulator();
databasePopulator.addScript(dropContentTables);
databasePopulator.addScript(createContentTables);
databasePopulator.setIgnoreFailedDrops(true);
DataSourceInitializer initializer = new DataSourceInitializer();
initializer.setDataSource(dataSource());
initializer.setDatabasePopulator(databasePopulator);
return initializer;
}
}
Чтобы связать контент, добавьте аннотации Spring Content к вашей сущности Movie.
Movie.java
@Entity
public class Movie {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
.. existing fields...
// private File posterFile; no longer required
@ContentId
private String contentId;
@ContentLength
private long contentLength = 0L;
// if you have rest endpoints
@MimeType
private String mimeType = "text/plain";
}
Создайте «хранилище»:
MoviePosterContentStore.java
@StoreRestResource(path="moviePosters")
public interface MoviePosterContentStore extends ContentStore<Movie, String> {
}
Это все, что вам нужно для создания конечных точек REST @ /moviePosters
.Когда ваше приложение запускается, Spring Content проверит ваши зависимости с помощью Spring Content JPA, взглянет на ваш MoviePosterContentStore
интерфейс и внедрит реализацию этого интерфейса для JPA.Он также увидит зависимость Spring Content REST и внедрит реализацию @Controller
, которая перенаправляет HTTP-запросы в ваш MoviePosterContentStore.Это избавляет вас от необходимости реализовывать все это самостоятельно, что, я думаю, то, что вы ищете.
Итак ...
Для управления контентом с помощью внедренного API REST:
curl -X POST /moviePosters/{movieId}
-F file=@/path/to/poster.jpg
сохранит изображение в базе данных (в виде большого двоичного объекта) и свяжет его с сущностью фильма с идентификатором movieId
.
curl /moviePosters/{movieId} -H "Accept: image/jpeg"
получит его снова и так далее ... поддерживает все методы CRUD и потоковое видео. BTW!
Есть пара руководств по началу работы здесь .Справочное руководство по JPA здесь .И здесь есть обучающее видео здесь .Бит кодирования начинается примерно на полпути.
Пара дополнительных моментов: - если вы используете Spring Boot Starters, то вам по большей части не нужна @Configuration.
- Простокак Spring Data - это абстракция, так же как и Spring Content, так что вы не ограничены хранением изображений постеров в виде больших двоичных объектов в базе данных.Вы можете хранить их в файловой системе или в облачном хранилище, таком как S3, или в любом другом хранилище, поддерживаемом Spring Content.
HTH