2015-08-21 7 views
0

Я использую Spring MVC для своего веб-проекта. Я разместил файлы модели в каталоге WEB-INFПочему загрузка файла POSModel не работает из папки WEB-INF?

String taggerModelPath = "/WEB-INF/lib/en-pos-maxent.bin"; 
String chunkerModelPath = "/WEB-INF/lib/en-chunker.bin"; 

POSModel model = new POSModelLoader() 
.load(new File(servletContext.getResource(taggerModelPath).toURI().getPath())); 

Это работало в среде Windows. Однако, когда я развернул его на удаленном сервере Linux, я получил ошибку

HTTP Status 500 - обработка запроса не удалась; Вложенное исключение - opennlp.tools.cmdline.TerminateToolException: Файл модели POS Tagger не существует! Путь: /localhost/nlp/WEB-INF/lib/en-pos-maxent.bin

Каков наилучший способ доступа к файловым ресурсам? Спасибо

+0

Имеется ли файл на удаленном сервере Linux? – Makoto

+0

Да, это внутри папки WEB-INF/lib. – Yangrui

ответ

3

Предположим, вы используете OpenNLP 1.5.3, тогда вы должны использовать другой способ загрузки файлов ресурсов, который не использует «жесткие» ссылки на пути через преобразование URI.

Учитывая обстановку, в которой в каталоге WEB-INF другой каталог resources существует, который содержит ваши файлы модели OpenNLP, вы фрагмент кода должен быть записан следующим образом:

String taggerModelPath = "/WEB-INF/resources/en-pos-maxent.bin"; 
String chunkerModelPath= "/WEB-INF/resources/en-chunker.bin"; 

POSModel model = new POSModelLoader().load(servletContext.getResourceAsStream(taggerModelPath)); 

См Javadoc для ServletContext#getResourceAsStream и этого StackOverflow post.

Важно Подсказка

К сожалению, есть и другие проблемы, связанные с вашим кодом. Класс OpenNLP POSModelLoader только для внутреннего использования, см официального Javadoc для POSModelLoader:

загружает POS Tagger модель для инструментов командной строки.

Примечание: Не используйте этот класс, только для внутреннего использования!

Таким образом, загружая POSModel в веб-контексте должно быть сделано по-разному: через один из доступных constructors of that class. Вы можете переформулировать выше фрагмент кода, например, так:

Таким образом, вы совместимый с OpenNLP API, и в то же время, что вы делаете правильную обработку исключений. Более того, теперь вы можете использовать отладчик, если что-то остается неясным с ссылками на пути к ресурсам ваших файлов моделей.

Надеюсь, это поможет.

+0

Спасибо, мой друг! Похоже, что мое приложение загружает модель opennlp каждый раз, когда я запрашиваю. Должен ли я использовать одноэлементный шаблон? – Yangrui

+2

, вы можете вызвать вышеуказанный код в конструкторе вашего текущего класса и ссылаться на posmodel как поле для использования, когда это необходимо. таким образом, его следует загружать только один раз. другие идеи потребуют подробного знания архитектуры приложения в целом. – MWiesner