Почему бы вам не попробовать Spring Content ? Он делает именно то, что вам нужно, и вам не нужно писать любой этого кода.
Предполагается, что Maven, Spring Boot и Spring Data (дайте мне знать, если вы используете что-то еще): -
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- HSQL -->
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.hateoas</groupId>
<artifactId>spring-hateoas</artifactId>
</dependency>
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>content-s3-spring-boot-starter</artifactId>
<version>${spring-content-version}</version>
</dependency>
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>content-rest-spring-boot-starter</artifactId>
<version>${spring-content-version}</version>
</dependency>
...
<dependencies>
Обновите вашу сущность с помощью управляемых аннотаций Spring Content.
Document.java
@Entity
public class Document {
...existing fields...
@ContentId
private String contentId;
@ContentLength
private Long contentLen;
@MimeType
private String mimeType;
...getters and setters...
}
Создайте соединение с вашим магазином S3. Хранилище S3 было реализовано для использования SimpleStorageResourceLoader, поэтому этот компонент будет в конечном итоге использоваться вашим магазином.
StoreConfig.java
@Configuration
@EnableS3Stores
public class S3Config {
@Autowired
private Environment env;
public Region region() {
return Region.getRegion(Regions.fromName(System.getenv("AWS_REGION")));
}
@Bean
public BasicAWSCredentials basicAWSCredentials() {
return new BasicAWSCredentials(env.getProperty("AWS_ACCESS_KEY_ID"), env.getProperty("AWS_SECRET_KEY"));
}
@Bean
public AmazonS3 client(AWSCredentials awsCredentials) {
AmazonS3Client amazonS3Client = new AmazonS3Client(awsCredentials);
amazonS3Client.setRegion(region());
return amazonS3Client;
}
@Bean
public SimpleStorageResourceLoader simpleStorageResourceLoader(AmazonS3 client) {
return new SimpleStorageResourceLoader(client);
}
}
Определите Магазин, типизированный для Документа - поскольку это то, с чем вы связываете контент.
DocumentContentStore.java
@StoreRestResource(path="documentContent")
public interface DocumentStore extends ContentStore<Document, String> {
}
Когда вы запускаете это, вам также нужно установить ведро для вашего магазина. Это можно сделать, указав spring.content.s3.bucket
в application.properties/yaml или установив переменную окружения AWS_BUCKET
.
Этого достаточно для создания службы контента на основе REST для хранения контента на S3 и связывания этого контента с вашей сущностью Document
. Spring Content увидит интерфейс Store и зависимости S3. Предположим, вы хотите хранить контент в S3 и внедрить реализацию вашего интерфейса для вас. Это означает, что вам не нужно реализовывать это самостоятельно. Вы сможете хранить контент, отправив запрос multipart-form-data на:
POST /documentcontent/{documentId}
и получить его снова с помощью:
GET /documentscontent/{documentId}
(служба поддерживает полное CRUD BTW и потоковое видео в случае, если это может быть важно).
Вы увидите, что Spring Content связывает контент с вашей сущностью, управляя аннотациями, связанными с контентом.
Может использоваться с или без Spring Data REST. Зависимости немного отличаются в зависимости. Я предположил, что вы не используете Spring Data REST. Дайте мне знать, если это не так, и я обновлю пример.
Здесь есть видео этого - демонстрация начинается примерно на полпути. Он использует модуль файловой системы не S3, но они взаимозаменяемы. Просто нужно выбрать правильные зависимости для типа магазина, который вы используете. S3 в вашем случае.
НТН