Построить Json по событию во время мониторинга папки - PullRequest
0 голосов
/ 11 октября 2019

Я должен генерировать 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)
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...