Если вы используете Spring Data и JPA, тогда Spring Content предоставляет решение для загрузки и ассоциирования контента с вашей сущностью.
Поскольку вы используете Spring Boot, его легко добавить.Добавьте следующие зависимости:
pom.xml
<!-- Java API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-jpa-boot-starter</artifactId>
<version>0.0.11</version> <!-- Or 0.1.0 for Spring Boot 2 -->
</dependency>
<!-- REST API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-rest-boot-starter</artifactId>
<version>0.0.11</version> <!-- Or 0.1.0 for Spring Boot 2 -->
</dependency>
Добавьте следующие атрибуты к вашей сущности Product
, чтобы с ней можно было связать контент (этовместо поля с несколькими файлами):
Product.java
@Entity
public class Product {
...existing fields...
@ContentId
private String contentId;
@ContentLength
private long contentLength = 0L;
@MimeType
private String mimeType;
// no need for MultipartFile
Создать ContentStore
(эквивалент JpaRepository для BLOB):
ProductContentStore.java
@StoreRestResource(path="productsContent")
public interface ProductContentStore extends ContentStore<Product, String> {
}
При запуске приложения Spring Content увидит интерфейс ProductContentStore
и зависимость spring-content-jpa
и внедрит реализацию этого интерфейса в JPA.потому что вы имеете в виду, что вам не нужно писать это самостоятельно.Он также увидит зависимость spring-content-rest
и добавит реализацию @Controller, которая перенаправляет запросы GET, PUT, POST и DELETE REST на бин ProductContentStore
, что означает, что вам также не нужно писать этот контроллер.Конечные точки REST будут доступны в /productsContent
, поэтому ...
после создания вашего продукта и получения идентификатора вы можете:
curl -X POST -F "image=@/some/local/path/product.jpg" /productsContent/{productId}
загрузить product.jpg
и свяжите его с вашей сущностью продукта.И:
curl /productsContent/{productId}
получит его снова.
Да, это означает, что вам нужно ДВА запроса на создание продукта и связывание с ним изображения.Если у вас есть веские причины, объясняющие, почему это должен быть один запрос, а не два, тогда поднимите проблему с репозиторием Spring Content github, и мы можем рассмотреть возможность добавления поддержки для вас.
HTH