Возможно, вы захотите взглянуть на Spring Content . Этот проект позволяет вам управлять контентом (т.е. вашими сгенерированными PDF-файлами) и связывать его с вашими объектами данных Spring. Он также обеспечивает ту же модель программирования, что и Spring Data, только для файлов и другого двоичного содержимого.
Например, если вы используете Spring Data REST (и Spring Boot), вы можете добавить обработчик событий SDR, который при создании нового резервирования (через конечную точку SDR) запускает генерацию вашего PDF, а затем использует Spring Content для хранения PFD в S3 и связывания его с резервированием.
Проект легко добавить в ваш проект следующим образом:
pom.xml
<!-- Java API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-s3-boot-starter</artifactId>
<version>0.8.0</version>
</dependency>
<!-- REST API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-rest-boot-starter</artifactId>
<version>0.8.0</version>
</dependency>
S3Configuration.java
@Configuration
@EnableS3Stores
public class S3Configuration {
@Bean
public AmazonS3 client() {
return ...your client here...
}
}
Reservation.java
@Entity
public class Reservation {
@Id
@GeneratedValue
private long id;
...other existing fields...
/////////////
//
// Add Spring Content annotations to allow content to be associated
@ContentId
private String contentId;
@ContentLength
private long contentLength = 0L;
@MimeType
private String mimeType = "";
...
}
ReservationPDFContentStore.java
@StoreRestResource(path="reservationPdfs")
public interface ReservationPDFContentStore extends ContentStore<Reservation, String> {
}
ReservationEventHandler.java
@RepositoryEventHandler(Reservation.class)
public class ReservationEventHandler {
@Autowired
private PDFGenerator;
@Autowired
private ReservationPDFContentStore store;
@HandleAfterCreate
public void handleReservationAfterCreate(Reservation reservation){
// generate your PDF and associate the content with your reservation
String filePath = ...
pdfGenerator.generateItinerary(savedReservation, filePath);
InputStream pfdIn = new FileInputStream(filePath);
store.setContent(reservation, pdfIn);
// don't forget to close pdfIn!
}
}
На высоком уровне это все, что вам нужно сделать.
Как это на самом деле работает, очень похоже на Spring Data. Когда ваше приложение запустится, Spring Content увидит зависимости spring-content-s3-boot-starter
и узнает, что вы хотите хранить контент в S3. Он внедрит реализацию интерфейса ReservationPDFContentStore
на основе S3, используя в качестве соединения настройку клиента @Bean в конфигурации. Он также увидит spring-content-rest-boot-starter
и введет конечные точки REST, которые взаимодействуют с интерфейсом хранилища контента.
Так, например:
curl -X POST /reservations/
(с соответствующим приложением / hal + json payload)
создаст новое резервирование в вашей системе и вызовет обработчик событий, который сгенерирует PDF-файл, сохранит его на S3 и свяжет с вновь созданным резервированием.
curl /reservationPdfs/{reservationId}
будет загружать PDF, когда вам это нужно.
Преимущество Spring Data и Content заключается в том, что кроме генератора PDF вам не нужно писать стандартный контроллер или служебный код. Учитывая пару интерфейсов (расширение CrudRepository
и ContentStore
), Spring может внедрить все это для вас.
Вы можете найти больше примеров Spring Content здесь .
НТН