2013-12-11 3 views
4

Я создаю небольшое веб-приложение, использующее clojure с leiningen. У меня есть определенные json-файлы, которые мне нужны для доступа, которые я также обновляю по ночам, используя пакетный процесс, запущенный на моем сервере. Я использую leiningen локально, но хочу развернуть uberjar на сервере. у меня есть способ обновить json-файлы, сжатые внутри файла jar, или получить доступ к json-файлам, находящимся за пределами uberjar. Сейчас я пытаюсь сделать последний, используя ring.util.response/ресурс-ответ на маршруте compojure:Доступ к файлам JSON за пределами каталога проекта в clojure с использованием leiningen

 (GET "/json/:filename" [filename] 
     (resp/resource-response 
      (str filename ".json") 
      {:root "~/internal_dashboard/app/json/"})) 

Когда мое приложение пытается получить доступ к файлам, я получаю ошибку 404. Кто-нибудь знает о возможном решении?

ответ

3

JVM не расширяет ~ в дорожках, используйте вызов System/getenv, чтобы получить домашний каталог и построить путь.

{:root (str (System/getenv "HOME") "/internal_dashboard/app/json/")} 

Tomcat часто работает как это собственный пользовательский поэтому убедитесь, что вы либо положить его в правильном домашнем каталоге или изложить путь полностью. Также может потребоваться настроить tomcat для доступа к этому директорию.

0

resp/resource-response предназначен для обслуживания ресурсов, упакованных вместе с банкой, поэтому он не подходит для обслуживания файлов, которые необходимо обновлять отдельно от приложения.

Для вашего случая я думаю, что Ring's resp/file-response больше подходит. Он позволяет обслуживать файлы из указанного места в файловой системе, что позволяет хранить файлы json отдельно от приложения.

Что-то вроде этого:

(GET "/json/:filename" [filename] (resp/file-response 
            (str filename ".json") 
            {:root "/some/folder/"})) 

точное имя папки, вероятно, следует исходить от конфигурации или системной среды, как это было предложено Шон.

Смежные вопросы