Я должен генерировать Json каждый раз, когда файл помещается в определенную папку. Для этого я создал класс Util, который отслеживает события в этой папке. Мониторинг начинается, когда запускается SpringBoot:
@Component
public class ScanFolder implements ApplicationListener<ApplicationReadyEvent> {
private Logger logger = Logger.getLogger("MyLog");
public static final String FOLDER = "C:\\Users\\User\\Documents\\testSignature\\notsigned";
public static final String DONE = "C:\\Users\\User\\Documents\\testSignature\\notsigned";
DocumentController documentController;
@Autowired
public ScanFolder(DocumentController documentController) {
this.documentController = documentController;
}
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
watchFolder();
}
public void watchFolder() {
try {
WatchService watcher = FileSystems.getDefault().newWatchService();
Path dir = Paths.get(FOLDER);
dir.register(watcher,
StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY);
while (true) {
WatchKey key;
try {
key = watcher.take();
} catch (InterruptedException ex) {
return;
}
for (WatchEvent<?> event : key.pollEvents()) {
WatchEvent.Kind<?> kind = event.kind();
@SuppressWarnings("unchecked")
WatchEvent<Path> ev = (WatchEvent<Path>) event;
Path fileName = ev.context();
Path fullPath = dir.resolve(ev.context());
System.out.println(kind.name() + ": " + fileName);
System.out.println("Path : " + fullPath);
System.out.println("Date : " + new Date());
String eventLog = new Date() + " - " + kind.name() + " - file: " + fileName + " - path: " + fullPath;
getLogs(eventLog);
if (kind.name().equals("ENTRY_CREATE") || kind.name().equals("ENTRY_MODIFY"))
documentController.createSignatureRequestData(fileName);
if (kind == ENTRY_MODIFY && fileName.toString().equals("DirectoryWatchDemo.java")) {
System.out.println("My source file has changed!!!");
}
}
boolean valid = key.reset();
if (!valid) {
break;
}
}
} catch (IOException ex) {
System.err.println(ex);
}
}
Каждый раз, когда в папке, которую я отслеживаю, запускается событие, я вызываю метод контроллера, который принимает 1 параметр.
public void createSignatureRequestData(Path fileName) {
CreateSignatureRequestsDataRest createSignatureRequestsDataRest = new CreateSignatureRequestsDataRest();
createSignatureRequestData(fileName, createSignatureRequestsDataRest);
}
Поскольку мне нужно 2 параметра, я перегружаю метод и вызываю второй. Единственное отличие состоит в том, что я передаю в параметре объект
public DocumentRest createSignatureRequestData(Path fileName, CreateSignatureRequestsDataRest createSignatureRequestsDataRest) {
DocumentRest returnValue = new DocumentRest();
ModelMapper modelMapper = new ModelMapper();
DocumentDto documentDto = modelMapper.map(createSignatureRequestsDataRest, DocumentDto.class);
DocumentDto documentToSign = documentService.setDocumentToSignJson(documentDto, fileName);
returnValue = modelMapper.map(documentToSign, DocumentRest.class);
return returnValue;
}
На самом деле я ввожу оба метода и попадаю на уровень обслуживания:
@Override
public DocumentDto setDocumentToSignJson(DocumentDto document, Path fileName) {
document.setToSignContent(convertImageAndFileBase64String.encodeFileToBase64Binary(fileName.toFile()));
return document;
}
Моя проблема заключается в том, что я получаюсообщение об ошибке с файлом NotFoundException
java.io.FileNotFoundException: DOC.pdf (Le fichier spécifié est introuvable)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
at com.app.ws.certeuropews.shared.utils.ConvertImageAndFileBase64String.encodeFileToBase64Binary(ConvertImageAndFileBase64String.java:22)
at com.app.ws.certeuropews.service.DocumentServiceImpl.setDocumentToSignJson(DocumentServiceImpl.java:38)
at com.app.ws.certeuropews.ui.controller.DocumentController.createSignatureRequestData(DocumentController.java:83)
at com.app.ws.certeuropews.ui.controller.DocumentController.createSignatureRequestData(DocumentController.java:72)
at com.app.ws.certeuropews.shared.utils.ScanFolder.watchFolder(ScanFolder.java:80)
at com.app.ws.certeuropews.shared.utils.ScanFolder.onApplicationEvent(ScanFolder.java:35)
at com.app.ws.certeuropews.shared.utils.ScanFolder.onApplicationEvent(ScanFolder.java:19)
...